不太熟悉Python的匿名函数用法,这里做一个小节;
解包/打包:
以前没见过这种用法,主要是用于可变参数列表的情况下使用;
例如教程中给出的函数:
def f(*args): print(args)
这种形式在其他语言中并没有见过;
打包的含义:将一系列参数合并为一个序列,可以为字典;
解包的含义:将一个序列或者字典,拆分为单个的元素;
所以两者各自逆操作;
打包多为python中任意数量参数的使用之中,其中也涉及到*args和**kargs的具体用法;
对于python中,args代表arguments,代表位置参数,kwargs为keyword arguments,代表关键参数;
其实说白了就是前者接受一个变长序列,在函数实际实参接受的时候,会将多个可变参数打包为序列,而kwargs则接受等号表达式定义的字典元素,打包成字典;
例如:
其中2,3,4作为args接受为列表,kwargs则接受k1=5,k2=6来作为字典元素,最后结果为:
这一过程中其实包含了打包的概念,即2,3,4打包为序列[2,3,4],而剩余的打包为一个dict;
对应也有解包操作,在实际函数调用或者其他的一些代码段中,可以在传递变量之前进行解包;
*,** 分别为序列和字典进行解包,例如:
可以看到,在调用非可变参数函数的时候,直接进行解包,算是一种比较独特的用法;
但是要注意两点:
1.打包和解包不能脱离函数存在,也就是说,只能在函数传参的时候使用;
2.只有函数定义的时候在形参列表时,才被算作打包,内部还是认为是解包;
打包/解包参考
Python中的*args和**kwargs
Map()函数:
map之前以为是类似C++中的容器,结果是一个函数;
旨在为某一个序列中的每一个元素做函数调用,并且返回调用后的列表; map(function, iterable, ...)
上述为具体形式; 对iterable指向的序列调用function,这里的function可以为匿名函数,也可以为实名函数;
Filter()函数:
功能和名字类似,对一哥序列中的元素进行过滤:
其中通过function的布尔值对iterable指向的序列进行过滤;
例如,结合lambda函数的用法;
labmda函数:
lambda的具体形式如下所示:
定义形式十分简单,前为参数列表,expersion为计算表达式,并且会默认返回该结果值;
骚操作和CPP类似,但是少了很多类型捕捉的问题,所以相对来说还是比较简单的;
值得注意的例子:
包含了通过匿名函数赋值调用,以及默认参数列表;
具体讲解博客
所以lambda可以和map函数结合起来,直接传入function,为其中的每个iteration元素进行计算;