函数与生成器

函数

由若干语句组成的语句块,函数名,参数列表构成,是组织代码的最小单元,完成一定的功能,结构化编程对代码的最基本的封装,封装的目的是为了复用

函数中没有return,隐式会返回一个none值

定义中的参数列表成为形式参数,只是一种形式表达,简称形参

调用时写的参数是实际参数,是实实在在传入的值,简称实参

函数的定义,只是声明了参数,不会执行,可以进行调用,定义需要在调用前,也就是说调用时,已经被定义过了

函数是否可调用,用callable(函数名)进行检测

参数调用时传入的参数要和定义的个数相匹配(可变参数例外)

位置参数:按照参数定义顺序传入实参

关键字参数:使用形参的名字来输入实参的方式,如果使用了形参名字,那么传参顺序就可和定义顺序不同,要求位置参数必须在关键字参数之前,位置参数是按照位置对应传入的

在形参前使用*表示该形参是可变参数,可以接受多个实参(包括0个),收集多个实参为一个tuple,不能进行更改

在形参前使用**符号,表示可以接收多个关键字参数,收集的实参名称和值组成一个字典

如果在一个星号参数后,或者一个位置可变参数后,出现的普通参数,实际上已经不是普通参数了,而是keyword-only参数,args可以看作已经截获了所有的位置参数,普通参数不使用关键字参数就不可能拿到实参

参数列表的一般顺序是,普通参数,缺省参数,可变位置参数,keyword-only参数(可带缺省值),可变关键字参数

参数解构:给函数提供实参的时候,可以在集合类型前使用*或者**,把集合类型的结构解开,提取出所有元素作为函数的实参,非字典类型使用*解构成位置参数,字典类型使用**解构成关键字参数,提取出来的元素数目要和参数的要求匹配,也要和参数的类型匹配

def fn(x, y, z=3, *arg, m=4, n, **kwargs):

 

匿名函数

匿名函数,即没有名字的函数,借助lambda表达式构建匿名函数

格式:  lambda参数列表:表达式

参数列表不需要小括号,冒号是用来分割参数列表和表达式的,不需要使用return,表达式的值,就是匿名函数的返回值,lambda表达式(匿名函数)只能写在一行上,称为单行函数

print((lambda *args: (x for x in args))(*range(5)))

 

生成器

列表解析式:返回值for元素in可迭代对象if条件,使用中括号[ ],内部是for循环,if条件语句可选,返回一个新的列表

生成器表达式:返回值for元素in可迭代对象if条件,列表解析式的中括号换成小括号就行了,返回一个生成器

集合解析式:返回值for元素in可迭代对象if条件,列表解析式的中括号换成大括号{}就行了,立即返回一个集合

字典解析式:返回值for元素in可迭代对象if条件,列表解析式的中括号换成大括号{}就行了,使用key:value形式,立即返回一个字典

 

生成器表达式:只需将列表解析式中的[ ]换位()即可,延迟计算,惰性求值,列表解析式立即返回结果

生成器为可迭代对象,迭代器,迭代器是可迭代对象,可迭代对象不一定是迭代器

迭代器不可从头再走,不回头,若为列表,可进行再次迭代,可回头

生成器表达式省内存,列表解析式返回新的列表

生成器没有数据,内存占用少,但是使用时候,虽一个个返回数据,但合起来所占内存差不多

迭代器未必是生成器

is可用来看地址是否相同

 

 

 

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96306

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code