迭代器_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) ))

 

posted @ 2019-02-21 08:46  狂奔~  阅读(233)  评论(0编辑  收藏  举报