迭代器_iter_,生成器yeild,三元运算,列表解析(十三)
迭代器:
l = [1, 2, 3, 4] iter = l.__iter__() print(iter) print(iter.__next__()) print(iter.__next__()) print(iter.__next__()) print(iter.__next__()) ''' <list_iterator object at 0x0217A230> 1 2 3 4 '''
生成器:这种数据类型自动实现了迭代器协议,其他数据类型要调用内部的iter方法,
所以生成器就是可迭代对象
python中有两种方式提供生成器
1.生成器函数:用yield代替return函数返回,yield
一次返回一个结果,在每个结果中间挂起函数状态,
以便下一次从它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需
产生的一个对象,而不是一次构建一个结果列表
def test(): yield 1 yield 2 iter = test() print(iter) print(iter.__next__()) print(iter.__next__()) ''' <generator object test at 0x01E96BF0> 1 2 '''
# yield 可以让函数一步一步地执行 def run(): print('runnig_1') yield 1 print('runnig_2') yield 2 print('runnig_3') yield 3 print('runnig_4') yield 4 it = run() next(it) print('可以做一些其他的事情...') next(it) # 再接着执行 next(it) next(it) ''' runnig_1 可以做一些其他的事情... runnig_2 runnig_3 runnig_4 '''
三元表达式:
name = ‘alex’
res = ‘SB’ if name ==‘alex’ else ‘shuaige’
列表解析
l = [] for i in range(10): l.append(i) print(l) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 使用列表解析 l = ['第%s' %i for i in range(10)] print(l) # ['第0', '第1', '第2', '第3', '第4', '第5', '第6', '第7', '第8', '第9'] # 加三元表达式,没有四元表达式 l1 = ['第%s' %i for i in range(10) if i > 5] print(l1) # ['第6', '第7', '第8', '第9']
列表解析可以很方便的生成列表,但是当数据比较大时会占很大的内存,这时候使用生成器表达式就可以避免内存占用过大这个问题
生成器的第二种方式:
l = ('第%s' %i for i in range(10)) print(l.__iter__()) # <generator object <genexpr> at 0x02146C70> print(l.__iter__().__next__()) print(l.__iter__().__next__()) print(next(l)) print(next(l)) print(next(l)) print(next(l)) print(next(l)) print(next(l)) print(next(l)) print(next(l)) print(next(l)) # 最后抛出异常 ''' <generator object <genexpr> at 0x015E6C70> 第0 第1 第2 第3 第4 第5 第6 第7 第8 第9 Traceback (most recent call last): File "F:/Python3/demo1.py", line 165, in <module> print(next(l)) StopIteration '''
内置函数sum也是基于迭代器协议
print(sum( (1,2,3,4) ))
# 内置函数sum也是基于迭代器协议 l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(sum(x**2 for x in l)) print(sum( range(1000000) )) print(sum(i for i in range(1000000) ))