Python 推导式、迭代器、生成器浅析

Admin 2019-10-25 15:09:45 Python

推导式是一个或多个迭代器快速简洁创建数据结构的一种方法。

列表推导式

number = [i for i in range(1, 10)]  # 简单形式
number = [i for i in range(1, 10) if i %2 == 1] # 加上条件判断
number = [(k, v) for k in range(1, 10) for v in range(2, 20)] # 多for嵌套

字典推导式

str = "12345612"
number = { i:str.count(i) for i in str}

集合推导式

number = { i for i in range(1, 10) }

生成器推导式(元组没有推导式,圆括号是用来生成器推导式的)

number = ( i for i in range(1, 10) )

# 生成器转list list(number)
# 生成器只能运行一次, 仅在运行中产生值,不会存储。

生成器

生成器是来创建一个序列对象,可以迭代庞大的序列,且不需要在内存创建和存储。它会记录上次调用的位置,并且返回下一个值。

创建一个比较大的序列,使用生成器推导式代码略长,可以写成生成器函数。

def func(a=0, b=10, s=1):
   n = a
   while n < b:
     yield n
     n += s
# func 返回一个生成器对象,可以使用这个生成器进行迭代

>>> func()
<generator object func at 0x10b3a9550>
>>> for i in func():
...   i
... 
0
1
2
3
4
5
6
7
8
9

使用zip并行迭代

zip()可以对多个序列进行并行迭代

>>> one = {"one", "two", "three"}
>>> two = {"a", "b", "c"}
>>> three = {"1", "2", "3"}
>>> for a,b,c in zip(one, two, three):
...   print a,b,c
... 
one a 1
three c 3
two b 2

# zip()函数再最短序列用完就会停止,最长的后面无法填充
# zip() 和 dict() 可以得到一个字典
>>> dict(zip(["1","2"], ["a","b"]))
{'1': 'a', '2': 'b'}

迭代器

__iter__的方法返回一个迭代器(iterator),具有next方法,在调用next会返回下一个值,当没有值可以返回时就会引发stopIteration异常。

一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。

相关文章
最新推荐