您的位置:首页 > 编程语言 > Python开发

python迭代器和生成器

2018-06-28 21:15 155 查看

1 推到

推导式是可以从一个数据序列构建另一个新的数据序列的结构体, 共有三种推导:
列表(list)推导式
字典(dict)推导式
集合(set)推导式

列表(list)推导式

使用[]生成list

#实现数字0-9的平方组成的列表
squares = [x**2 for x in range(10)]
print(squares)

结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

def squared(x):
return x*x
multiples = [squared(i) for i in range(30) if i % 3 is 0]
print multiples

结果:
[0, 9, 36, 81, 144, 225, 324, 441, 576, 729]

字典(dict)推导式

字典推导和列表推导的使用方法是类似的,只不过中括号改成大括号。

#交换字典键与值
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print(mcase_frequency)

结果:
{10: ‘a’, 34: ‘b’}

集合(set)推导式

集合推导与推到类似,也是使用大括号。

strings = ['a','is','with','if','file','exception']
print({len(s) for s in strings}) #有长度相同的会只留一个

结果:
{1, 2, 4, 9}

2 迭代器

  它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了iternext()方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。
  iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。next()也是python内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,
  迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。

  (1)迭代器的四大特性

    1.跌代集合,字符串,有序依次———即有可迭代对象

    2.线程不安全的,多线程访问同一个集合修改报错。

    3.对于无法随机访问的数据结构,迭代器是唯一选择

    4.只迭代当前元素,迭代前后均可不存

3 生成器

  生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。有两种方式可以返回一个生成器:
        1.推导 (x+1 for x in lst) 生成器表达式,返回迭代器

        2.或者yield :生成 且 只生成一次,且停止到此
   yield的功能:
    1 把函数的结果做生迭代器(以一种优雅的方式封装好iter,next
    2 函数暂停与再继续运行的状态是由yield
yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
print (next(it))   # 输出迭代器的下一个元素
print (next(it))

结果:
1
2

def func():
print('first')
yield 11111111
print('second')
yield 2222222
print('third')
yield 33333333
print('fourth')
g=func()
print(g)        # 返回对象
from collections import Iterator
print(isinstance(g,Iterator)) #判断是否为迭代器对象
print(next(g))
print('======>')
print(next(g))
print('======>')
print(next(g))
print('======>')
print(next(g))

结果:

True
first
11111111 #第一次next(g)
======>
second
2222222 #第二次next(g)
======>
third
33333333 #第三次next(g)
======>
fourth
Traceback (most recent call last):
File “E:/python/python/python/迭代器.py”, line 105, in
print(next(g))
StopIteration #第四次next(g)

  在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

#斐波那契数列
def fb():
a=0
b=1
for i in range(5)
yield b
a,b=b,a+b
f=fb()   #f为对象生成器
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())     #f中没有更多元素了,则抛出StopIteration异常

结果:
1
1
2
3
5
Traceback (most recent call last):
File “E:/python/python/python/迭代器.py”, line 86, in
print(f.next())
StopIteration

yield与return的比较:
相同:都有返回值的功能
不同:return只能返回一次值,而yield可以返回多次值

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: