python高级特性

一、列表生成式

#过滤条件
[x*x for x in range(10) if x %2==0] [0, 4, 16, 36, 64] #两层循环 [m+n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] #if else 必须写在for之前 [x if x%2==0 else -x for x in range(10)] [0, -1, 2, -3, 4, -5, 6, -7, 8, -9]

二、生成器

如果需要一个超级大的列表,那么内存会不够用,此时要用可以利用某种规则推算元素的生成器。

创建生成器只需要将列表生成式的[]改成()即可,然后可以用next()或for循环迭代生成器对象。

另一种方法时在普通函数中使用yeild关键字,将普通函数变成generator函数,调用生成器函数会返回生成器对象。

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

三、迭代器

用于for循环的数据类型有:

1.集合类型:list、tuple、dict、set、str等;

2.generator:生成器和带yield的generator function

这些直接用于for循环的对象统称为可迭代对象Iterable,可以用isinstance(*, Iterable)

生成器都是Iterator对象,但list、dict、str虽然是迭代器Iterable,但不是迭代器对象Iterator。

这是因为python的Interator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

 

原文地址:https://www.cnblogs.com/LMIx/p/9683021.html