1、函数相关基础
Calls myfunc("spam",'eggs',meat=ham)
def, def adder(a,b=1,*c)
return return a+b+c[0]
global def changer():
global x;x='new'
nonlocal def changer():
nonlocal x;x='new'
yield def squares(x):
for i in range(x):yield i ** 2
lambda Funcs=[lambda x:x**2,lambda x:x*3]
def是可执行的代码,def创建了一个对象并将其复制给某一变量名,lambda创建一个对象但将其作为结果返回,return将一个结果发送给 调用者,yield向调用者发送一个结果对象但是记住它离开的地方,global声明了一个模块级的变量并被复制,nonlocal声明了将要复制的一个封闭的函数变量,函数是通过复制(对象引用)传递的,参数、返回值以及变量并不是声明。
2、作用域
在一个def内定义的变量名只能本def内的代码使用,def中的变量名与def外的变量名不冲突。
函数定义了本地作用域,而模块定义的是全局作用域:
内嵌的模块是全局作用域,全局作用于的作用范围仅限于单个文件,每次对函数的调用都创建了一个新的本地作用域,复制的变量名除非声明为全局变量或非本地变量否则均为本地变量,所有其他的变量名都可以归纳为本地/全局或者内置的。
Python的变量名命名解析机制成LEGB法则:
当函数中使用未认证的变量名是,Python搜索4个作用域【本地L,上一层结构中def或lambda的本地E,全局G,内置作用域B】.当在函数中赋值时,总是创建或改变本地作用域的变量名,除非为全局变量。
nonlocal:声明了将要在一个嵌套的作用域中修改的名称,与global不同的是应用于一个嵌套的一个名称,而不是所有def之外的全局模块作用域。默认情况下不允许修改嵌套的def作用域中的名称,UnboundLocalError,使用nonlocal进行修改。
3、参数
参数的传递是通过自动将对象复制给本地变量名来实现的,在函数内部的参数的赋值不会影响调用者,改变函数的可变对象参数值也许会对调用者有影响(函数能够就地改变传入的可变对象)。
不可变参数“通过值”进行传递,像整数和字符串是哦那个过对象引用而不是拷贝进行传递的,但不可能在原处改变不可变对象;
可变对象是通过“指针”进行传递的,列表和字典这样的对象也是通过对象引用进行传递的,可变对象能够在函数内部进行原处改变。
>>>def changer(a,b)
a=2
b[0]='zz'
>>>x=1
>>>y=[1,2]
>>>changer(x,y)
>>>x,y
(1,['zz',2])
>>>changer(x,y[:])
#如果不想改变传入的对象
匹配语法:
调用者
func(value)
#通过位置进行匹配
func(value)
#通过变量名匹配
func(*seq) #以name传递所有的对象,并作为独立的基于位置的参数
func(**dict)
#以name成对地传递所有的关键字/值,并作为独立的关键字参数
函数
def func(name)
def func(name=value)
def func(*name)
#匹配并收集(在元组中)所有包含位置的参数
def func(**name)
#匹配并收集(在字典中)所有包含位置的参数
def func(*args,name)
#参数必须在调用中按照关键字传递
def func(*,name=value)
>>>def f(*args):print(args)
>>>f()
()
>>>f(1)
(1,)
>>>f(1,2,3)
(1,2,3)
>>>def f(**args):print(args)
>>>f(a=1,b=2)
{'a':1,'b':2}
keywor-only参数:只按照关键字传递并且不会由一个位置参数来填充的参数。