Python函数介绍

Python函数介绍

可变长的函数

1
2
def foo(arg1, *args):
pass

把后面所有的参数都放入到args的列表中。使用如下的方式,可以接受可变长的键值对参数。

1
2
def foo(arg1, **kargs):
pass

这个时候kargs是一个字典。

键值对参数

默认参数

1
2
def func(arg1, arg2=value):
pass

默认参数很方便,当你不传值的时候,就有一个默认值

注意⚠️⚠️

  • 如果使用变量来进行初始,只会作用一次
  • 默认值不能是引用变量

1、举个🌰

1
2
3
4
5
6
7
8
9
10
11
12
13
In [1]: x = 10
In [2]: def foo(a, b=x):
...: print(a, b)
...:
In [3]: foo(1)
1 10
In [4]: x = 20
In [5]: foo(2)
2 10 # 不会再次初始化,所以还是10

2、🌰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [7]: def span(a, b = []):
...: print(b)
...: return b
...:
In [8]: x = span(1)
[]
In [9]: x.append("hello")
In [10]: x
Out[10]: ['hello']
In [11]: y = span(2)
['hello']

其本质原因在于默认参数只会初始化一次值,如果是默认值是引用变量,那么引用的对象发生变化,会对其他的调用产生影响。

增加参数的元信息

def add(x:int, y:int) -> int:
    return x + y”
1
2
3
Help on function add in module __main__:
add(x:int, y:int) -> int

虽然是这样,但是我们仍然能够给add函数传递任意类型的参数。

匿名函数

1
2
3
4
In [18]: add = lambda a, b: a + b
In [19]: 3+add(4, 5)
Out[19]: 12

匿名函数的好处就是能够把函数当作表达式的一部分来说过,比较常见的用法在sorted函数中。

偏函数

python2.5 以后的特性,偏函数是在函数式编程中的用。简单点的解释就是固定住参数重的某个参数,以此来形成一个新的函数。也有的语言叫这种函数为偏应用函数。

1
2
3
In [21]: def foo(a, b, c, d):
...: print(a, b,c,d)
In [23]: f1 = partial(foo,1) # 构成了一个新的函数,这个函数中第一个参数始终为1

闭包

1
2
3
4
5
6
7
8
9
10
In [25]: def prefix(pre):
...: def name(name):
...: print(pre, name)
...: return name
...:
In [26]: f = prefix("hello:")
In [27]: f("zhang san")
hello: zhang san

实际上,闭包是使用__closure__这个属性来实现的。

1
2
In [28]: f.__closure__
Out[28]: (<cell at 0x10bae03d8: str object at 0x10bb1bdf8>,)

这点,闭包和类有点类似。

构建闭包

  • 闭包函数必须有内嵌函数,内嵌函数不能和外面函数同名
  • 内嵌函数需要引用该嵌套函数上一级namespace中的变量
  • 闭包函数必须返回内嵌函数
坚持技术分享,您的支持将鼓励我继续创作!