继续学习语法。

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

标签: none

添加新评论