位置参数解构的一个例子:
- In[23]: def fn(a, b, c):
- ...: print(a, b, c)
- ...:
- In[24]: lst = [1, 2, 3]
- In[25]: fn(lst[0], lst[1], lst[2])
- 1 2 3
- # 也可以举办如下情势的挪用
- In[26]: fn(*lst) # 这种做法就叫参数解构
- 1 2 3
- # *号可以把线性布局解包成位置参数
- lst = [1, 2, 3, 4]
- fn(*lst) # -> fn(lst[0], lst[1], lst[2], lst[3])
- TypeError: fn() takes 3 positional arguments but 4 were given
# 这里就报错了,原来这个函数只能吸取3个位置参数,lst有四个元素,通过参数解构之后,就酿成了4个参数,以是就报错了。
接下来看字典解构的例子:
- In[27]: d = {'a': 1, 'b': 2, 'c': 3}
- In[28]: fn(**d)
- 1 2 3
- # **可以把字典解组成要害字参数
参数解构产生在函数挪用时。解构的时辰,线性布局的解构是位置参数,字典解构是要害字参数。
传参的次序:位置参数,线性布局解构;要害字参数,字典解构。只管的少的同时行使两种解构,除非你真的知道在做什么。
- In[29]: def fn(a, b, c, d):
- ...: print(a, b, c, d)
- ...:
- In[30]: fn(0, *[2], c=1, **{'d': 3})
- 0 2 1 3
9. 参数槽(keyword-only参数)
Python3中引入的。
- def fn(a, b, c):
- print(a, b, c)
- fn(a=1, b=2, c=3)
假如要逼迫传入的参数为要害字参数:
- def fn(*, a, b, c):
- print(a, b, c)
- >>> fn(1, 2, 3)
- Traceback (most recent call last):
- File "", line 1, in
- fn(1, 2, 3)
- TypeError: fn() takes 0 positional arguments but 3 were given
- >>> fn(a=1, b=2, c=3)
- 1 2 3
# *之后的参数,必需以要害字参数的情势转达,称之为参数槽。
参数槽凡是和默认参数搭配行使。
- >>> def fn(a, b, *, x, y):
- print(a, b)
- print(x, y)
- >>> fn(1, 2, 3, 4)
- Traceback (most recent call last):
- File "", line 1, in
- fn(1, 2, 3, 4)
- TypeError: fn() takes 2 positional arguments but 4 were given
- >>> fn(1, 2, x=3, y=4)
- 1 2
- 3 4
- >>> fn(1, 2, **{'x': 3, 'y': 4})
- 1 2
- 3 4
- def fn(a, b, *):
- print(a, b)
- def fn(a, b, *):
- .. print(a, b)
- File "", line 1
- SyntaxError: named arguments must follow bare *
- 几个例子:
- def fn01(*, x=1, y=5):
- print(x)
- print(y)
- >>> fn01()
- 1
- 5
- def fn02(x=1, *, y):
- print(x)
- print(y)
- >>> fn02(y=3)
- 1
- 3
参数槽之坑:
*之后必需有参数横死名参数有默认值时,定名参数可以没有默认值默认参数应该在每段参数的最后行使参数槽时,不能行使可变位置参数,可变要害之参数必需放在定名参数之后
三、高级用法
1. 递归函数
在函数内部,可以挪用其他函数。假如一个函数在内部挪用自身自己,这个函数就是递归函数。
- def fact(n):
- if n==1:
- return 1
- return n*fact(n-1)
行使递归函数的利益是逻辑简朴清楚,弱点是过深的挪用会导致栈溢出。
针对尾递归优化的说话可以通过尾递归防备栈溢出。尾递归究竟上和轮回是等价的,没有轮回语句的编程说话只能通过尾递归实现轮回。
2. 匿名函数 lambda
python 行使 lambda 来建设匿名函数。
lambda只是一个表达式,函数体比def简朴许多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda函数拥有本身的名字空间,且不能会见自有参数列表之外或全局名字空间里的参数。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|