一、python函数
1、函数的作用
2、函数的分类
3、函数的定义和调用
定义
调用
二、函数参数
1、函数参数默认值
2、可变参数
def add(*nums) >>> def add(*nums): sum = 0 print(type(nums)) for x in nums: sum += x print(sum) >>> add(3,6,9) <class ‘tuple‘> 18
3、可变关键字参数
>>> def show(**kwargs): for k,v in kwargs.items(): print(‘{}={}‘.format(k,v)) >>> show(a=1,b=2,c=3) a=1 c=3 b=2
4、参数总结
>>> def fn(x,y,*args,**kwargs): print(x) print(y) print(args) print(kwargs) >>> fn(3,5,6,9,10,a=1,b=‘python‘) 3 5 (6, 9, 10) {‘a‘: 1, ‘b‘: ‘python‘} >>> fn(3,5) 3 5 () {} >>> fn(3,5,a=1,b=‘python‘) 3 5 () {‘a‘: 1, ‘b‘: ‘python‘} >>>
5、keyword-only参数
>>> def fn(*args,x): print(x) print(args) >>> fn(3,5) 调用报错 >>> fn(3,5,x=7) args已经截获了所有的位置参数,x不使用关键字参数就不可能拿到实参 >>> def fn(*kwargs,x): print(x) print(args) 直接报语法错误,因为kwargs会截获所有的关键字参数
6、参数规则
>>> def fn(x,y,z=3,*args,m=4,n,**kwargs): print(x,y,z,m,n) print(args) print(kwargs) def connect(host=‘localhost‘, port=‘3306‘, user=‘admin‘, password=‘admin‘, **kwargs): >>> def connect(host=‘localhost‘, port=‘3306‘, user=‘admin‘, password=‘admin‘, **kwargs): print(host,port) print(user,password) print(kwargs) >>> connect(db=‘cmdb‘) localhost 3306 admin admin {‘db‘: ‘cmdb‘} >>> connect(host=‘192.168.1.1‘,db=‘cmdb‘) 192.168.1.1 3306 admin admin {‘db‘: ‘cmdb‘} >>>
三、参数解构
举例: >>> def add(x,y): return x+y 1、位置参数解构 >>> add(*(4,5)) 9 >>> add(*[4,5]) 9 >>> 2、关键字参数解构 >>> d = {‘x‘:5,‘y‘:6} >>> add(**d) 11 >>> 3、参数解构和可变参数 >>> def add(*args): result = 0 for x in args: result += x return result >>> add(1,2,3) 6 >>> add(*[1,2,4]) 7 >>> add(*range(10)) 45 >>>
四、函数的返回值和作用域
1、返回值
2、作用域
举例: x = 5 >>> def foo(): x += 1 print(x) >>> foo() x += 1其实是x = x+1,相当于在foo内部定义一个局部变量x,那么foo内部所有x都是这个局部变量 但是这个x还没有完成赋值,就被右边拿来使用了,导致报错 使用全局变量global关键字变量,将foo内的x声明为使用外部的全局作用域中定义的x 全局作用域中必须要有x的定义 >>> def foo(): global x x = 10 x += 1 #x在内部作用域为一个外部作用域的变量赋值,所以x += 1不会报错 print(x) >>> foo()
3、全局作用域global
五、递归函数
1、递归要求
斐波那契数列Fibonacci number:1,1,2,3,5,8,13,21,34,55..... 如果设F(n)为该数列的第n项,那么这句话可以写成如下形式:F(n)=F(n-1)+F(n-2) F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) pre = 0 cur = 1 print(pre,cur,end=‘‘) n = 4 for i in range(n-1): pre,cur = cur,pre+cur print(cur,end=‘‘) 解析: fib(3)+fib(2) fib(3)调用fib(3),fib(2),fib(1)
2、递归的性能
递归举例: import datetime n = 35 start = datetime.datetime.now() def fib(n): return 1 if n<2 else fib(n-1) + fib(n-2) for i in range(n): print(fib(i),end=‘‘) delta = (datetime.datetime.now() - start).total_seconds() print(delta) 改下后: pre = 0 cur = 1 print(pre,cur.end=‘‘) def fib(n,pre=0,cur=1): pre,cur = cur, pre+cur print(cur,end=‘‘) if n == 2: return fib(n-1,pre,cur) fib(n)
3、递归总结
六、匿名函数
举例: >>> print((lambda :0)()) 0 >>> print((lambda x,y=3:x+y)(5)) 8 >>> print((lambda x,*,y=30:x+y)(5)) 35 >>> print((lambda x,*,y=30:x+y)(5,y=10)) 15 >>> print((lambda *args:(x for x in args))(*range(5))) <generator object <lambda>.<locals>.<genexpr> at 0x0000000003074258>
原文:https://www.cnblogs.com/jiangzuofenghua/p/11386431.html