1.函数非固定参数
*args *kwargs
def test(*args): print (args) test(1,2,3,4,5) test(*[1,2,3,4,5]) #*args = *[1,2,3,4,5] args=tuple([1,2,3,4,5]) l = [1,2,3] test(*l) def test1(x,*args): print (x) print (args) test1(1,2,3,4,5,6,7) #**kwargs,把n个关键字参数,转换成字典的方式 def test2(**kwargs): print (kwargs) test2(name='jiachen',age=27) d = {'name':'jiachen','age':27} test2(**d) def test3(x,*args,**kwargs): print (x) print (args) print (kwargs) test3(1,*[2,3,4],**{'name':'jiachen','age':27})
2.全局变量、局部变量
#全局变量 school = 'lianhedaxue' def test(name): #强制修改全局变量 global school school = 'haha' print ('before change',name,school) name = 'Jack' #这个函数就是这个变量的作用域 print ('after change',name) name = 'Tom' test(name) print (name) print (school)
3.递归函数
递归函数,一个函数在内部调用自己
必须有一个明确的结束条件
每次进入更深一层递归,问题规模相比上次递归都应有所减少
效率不高,递归层次过多导致栈溢出
def calc(n): print (n) if int(n/2) > 0: return calc(int(n/2)) print ("->",n) calc(10)
4.高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数成为高阶函数
def add(x,y,f): return f(x) + f(y) res = add (-1,2,abs) print (res)