38.函数的收集参数
>>> def myfunction(*params):
print(len(params))
print(params)
print(params[1])
>>> myfunction(1,2,3,4,5,6)
6
(1, 2, 3, 4, 5, 6)
1)如上:定义函数时候用一个*代表这个参数是一个收集参数,传递过来的多个参数会汇总起来放入一个元组中,这个元组赋值给params
>>> def myfunction(*params,exp):
print(len(params))
print(params)
print(params[1])
print(exp)
>>> myfunction(1,2,3,4,5,6,exp=9)
6
(1, 2, 3, 4, 5, 6)
2
9
2)如上如果函数除了要接受收集参数,还需要接受特定的关键字参数,在实际使用函数的时候需指定关键字来传递这个参数的值
39.要是想在函数中修改全局参数,需要在函数内部对全局变量使用global关键字进行定义
40.闭包:内部函数对外部函数(但不是全局变量)的变量引用,则内部函数叫闭包
如下:对于funX来说funY就是其内部函数,funY引用了funX的变量x,则funY就是funX的闭包函数
>>> def funX(x):
def funY(y):
return x*y
return funY
>>> i=funX(8)
>>> type(i)
>>> i(5)
40
>>> funX(8)(5)
40
41.使用闭包需要注意不能在其外部函数的外边使用闭包函数
>>> funY(5)
Traceback (most recent call last):
File "", line 1, in
funY(5)
NameError: name 'funY' is not defined
42.闭包函数不可以修改其外部函数的变量,要是改变,其实是给闭包函数定义了一个和其外部函数变量名一样的闭包内部函数,如下例子,fun2中的x在fun1中出现了,系统为fun2生成了一个x局部变量,但是此时fun2要给x进行平方,但是没有指定x的初始值,所以就会报错
>>> def fun1():
x=5
def fun2():
x*=x
return x
return fun2()
>>> fun1()
Traceback (most recent call last):
File "", line 1, in
fun1()
File "", line 6, in fun1
return fun2()
File "", line 4, in fun2
x*=x
UnboundLocalError: local variable 'x' referenced before assignment
如何改进上面的问题:
1)方法1:利用容器的数据类型是不会被程序释放的这个好处来修改(一般函数被调用完就会释放函数内部的局部变量)
>>> def fun1():
x=[5]
def fun2():
x[0]*=x[0]
return x[0]
return fun2()
>>> fun1()
25
2)方法2:关键字nonlocal声明
>>> def fun1():
x=5
def fun2():
nonlocal x
x*=x
return x
return fun2()
>>> fun1()
25
43.lambda表达式:冒号前是变量,冒号后是函数体
1)一个参数
>>> a=lambda x:x+1
>>> a(1)
2)两个参数
>>> b=lambda x,y:x+y
>>> b(2,3)
5
44.filter有两个参数,第一个参数是函数或者none,第二个是一个可迭代对象;如果第一个参数是函数,将第二个迭代对象每个参数到第一个函数中去运算,将计算结果为true的第二个迭代对象中的元素组成一个列表返回出;如果第一个参数是none,那么将第二个迭代对象中true的参数组成列表进行输出
1)第一个参数是函数的情况:
>>> def odd(x):
return x%2
>>> temp=range(10)
>>> show=filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]
使用lambda优化
>>> list(filter(lambda x:x%2,temp))
[1, 3, 5, 7, 9]
2)第一个参数是none的情况
>>> filter(None,[1,0,False,True])
>>> list(filter(None,[1,0,False,True]))
[1, True]
45.map:有两个参数,一个函数一个可迭代序列,将可迭代序列用函数加工,返回加工后计算的数据构成新序列
>>> list(map(lambda x:x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
46.修改python内部对递归的配置:
>>> import sys
>>> sys.setrecursionlimit(1000)
47.递归:计算阶乘
def factorial(n):
result=n
for i in range(1,n):
result*=i
return result
number = int(input('请输入正整数:'))
result=factorial(number)
print('%d 的阶乘是:%d'%(number,result))