初学python随笔——列表生成器、生成器和迭代器

列表生成器

# 常见的是range()创建一个数字的列表

>>>[ x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


# 后边也可以加上判断语句

>>>[ 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']

  

生成器

# 生成器就是把列表生成器的[]换成(),或者在函数中使用yield关键字

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

# 取值,可以使用next(),但大多数使用for

# 斐波拉契数列
def fib(max):
    n,a,b = 0,0,1

    while n < max:
        #print(b)
        yield  b
        a,b = b,a+b

        n += 1

    return 'done' 

# 使用for循环打印想返回return值,需要捕获StopIteration错误,返回值包含在StopIteration的value中:

  

可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator,它们表示一个惰性计算的序列

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

可以使用isinstance()判断一个对象是否是Iterable对象

猜你喜欢

转载自www.cnblogs.com/CrazyDemo/p/9431139.html