必须以正确的顺序传入函数
调用时数量必须和声明时一样
使用关键字参数来确定传入的参数值
关键字的参数应跟随在位置参数后
允许函数调用时参数的顺序与声明时不一致
def fun(name,key): pass fun(key lambda x:x[1] ,name test )默认参数
调用函数时 如果没有指定参数 则会使用默认值
默认值只被赋值一次 这使得当默认值是可变对象时会有所不同 即默认值在后续调用中会累积。
def f(a,L []): print(hex(id(L))) L.append(a) return L print(f(1)) print(f(2)) print(f(3))
0x1a847b0e200 0x1a847b0e200 [1, 2] 0x1a847b0e200 [1, 2, 3]
避免累积的方法
def f(a,L None): if L is None: L [] print(hex(id(L))) L.append(a) return L print(f(1)) print(f(2)) print(f(3))
0x1a847acb280 0x1a8486fae80 0x1a847b09f00不定长参数
需要一个函数能够处理比声明时更多的参数 且声明时不需要命名
加*的参数会以元组(tuple)的形式导入 存放所有未命名的参数变量
def ptest(arg1,*vartuple): print(arg1) print(vartuple) ptest(70, test ,50)
70 ( test , 50)
加**的参数会以字典的形式导入
def ptest2(arg1,**vardict): print(arg1) print(vardict) ptest2(10,a 2,b 4)
10
{ a : 2, b : 4}
通常这些可变参数是参数列表中的最后一个
任何出现在不定长参数的后面的参数只能是关键字参数 不能是位置有关参数
参数列表的分拆args [3,6] print(*args) print(list(range(*args)))
3 6 [3, 4, 5]
d { name : zjc , age :36, job : prof. }
def printInfo(name,age,job):
print( Name:{0}tAge:{1}tJob:{2} .format(name,age,job))
printInfo(**d)
Name:zjc Age:36 Job:prof.匿名函数
lambda只是一个表达式 函数体比def简单很多
lambda的主体是一个表达式 而不是一个代码块仅仅能在lambda表达式中封装有限的逻辑简单形式下只能使用内部变量普通函数定义中的一个语法技巧sum lambda arg1,arg2:arg1 arg2 print(sum(1,2))return语句
用于退出函数 选择性地向调用方返回一个表
达式
def make_incrementor(n): return lambda x:x n f make_incrementor(1) print(f(0))闭包 在一个外函数中定义了一个内函数 内函数里
运用了外函数的变量 并且外函数的返回值是
对内函数的引用闭包变量实际上只有一份 每次开启内函数时
都在使用同一份闭包变量装饰器
def outer(x): def inner(y): nonlocal x return x return inner f1 outer(10) print(f1) print(f1(1)) print(f1(2)) print(outer(10)(1)) print(outer(10)(2))
function outer. locals .inner at 0x000001A848708160



