愤鸟的Py3入门笔记(Day2)
继续学习语法。
1.列表生成式、生成器
列表生成式
可用于生成一个列表(list)。
基本格式为[生成规则 生成元素]
如 [x*x for x in range(1,11)]
[a+b for a in list_a for b in list_b]
[a+b for a,b in list]
.
可以使用if
语句进行筛选,如[x for x in range(1,11) if x%2==0]
生成一个仅包含偶数的列表,但此时不能加入else
.
可以使用if...else
语句选择生成规则,如[x if x%2==1 else -x for x in range(1,11)]
生成一个“奇正偶负”的列表,但此时不能没有else
。
生成器
生成器的作用和列表生成器类似,都是按一定规则生成元素,区别在于列表生成式是预先计算好所有元素,并保存在一个列表中;生成器是每次计算出一个元素并输出,本身不保存之前生成的元素。生成器是惰性计算,即需要返回下一个元素时才开始计算。
最简单的生成器的写法,是将列表生成式两端的‘[’ ']'改为‘(’ ‘)’如(x*x for x in range(1,11)
,此时,我们可以通过next()
函数获得生成器的下一个返回值,亦可使用for...in
循环获得返回值。需要注意的是,这个生成器能生成的元素是有限的,因此使用next()
函数时需要注意错误处理。
生成器的另一种写法,是在函数的基础上得到的。
比如下列生成斐波那契数列中元素的生成器:
def fun():
a,b=0,1
while True:
yield b
a,b = b,a+b
return 'done'
生成器的特征代码是yield
,生成器从这里返回一个值,下次调用时从这里进入,并保存有上一次的变量值。
2.函数式编程
高阶函数
Py3中,变量可以指向一个函数,函数名也可以作为变量使用,因此,可以将函数作为参数和返回值使用,
例:map
map()
函数的作用是,用一个函数(作为参数传入)将一个Iterable
类型的数据(一为集合类型,如数组、元组、字典等,二为生成器)中的每一个元素进行处理,并将结果作为Iterator
(如生成器)返回。
例如list(map(lambda x: x*x,[1,2,3,4,5,6,7,8,9]))
,会生成一个平方数列表。此处的lambda x: x*x
作为匿名函数存在。
例:reduce
reduce()
函数的作用是,将一个函数作用于一个序列上。效果为:
reduce(f,[x1,x2,x3,x4]) == f(f(f(x1,x2),x3),x4)
例:filter
filter()
函数的作用是,按照一定规则筛选一个序列,根据参数函数的返回True
还是False
决定元素是否被保留。其返回一个Iterator
例如list(filter(no_empty,['A',' ',None,'','wdnmd']))
偏函数
将一个现有函数重新封装,并指定默认参数,即得到一个偏函数。
例如int2 = functools.partital(int,base=2)
需要注意的是,偏函数中指定的默认参数之后的位置参数需写出参数名。
封面pixiv id:78323993