生成器

"""迭代器"""
# l  = [1,2,3,4,5,6,7]
# l1 = l.__iter__()           #调用 .__iter__()使对象变成可迭代对象
# print(l1.__next__())        #再使用 .__next__()进行迭代,一次调用迭代一个
# print(l1.__next__())        #再次调用在原先基础上再迭代,for循环利用的就是这个机制

"""
三元表达式:“yes”    if name == “sjy”    else “no”
    将一个判断语句放在一个表达式中,第一个是True的返回结果,中间是判断条件,最后是False的返回结果
列表解析:n = [i for i in range(10)]
    将循环得到的结果直接放在一个列表中
生成器:自动实现迭代器协议,跳过.__iter__(),可直接使用 .__next__()
    生成器函数:用 yield 代替 return
        调用时使用 .__next__()一次一次迭代得值
    生成器表达式:n = (i for i in range(10)),类似列表解析,但将[] 换成 ()
        print(n)  得到的是生成器的位置,
        print(n.next)  才将内容迭代得出 ,相比较列表解析,节省内存
"""


# 生成器函数
# def f():
#     yield 1
#     yield 2     #yield 和return不同,可以有多个
# n = f()
# print(n.__next__())     #当迭代超过最后的数值时会报错
# print(n.__next__())

# def baozi():
#     for i in range(10):
#         yield "一屉包子%s" %i
# n = baozi()               #必须将函数调用后将其赋值给一个变量,以存放在内存中,否则,就会重新开始迭代
# print(n.__next__())       #方便在得到一个值之后立即进行别的操作而不影响再次迭代下一个值
# print(n.__next__())
# for i in baozi():         #生成器函数时可以用for循环迭代的,遵循迭代器协议
#     print(i)

# 生成器表达式:sum , max , sort等都可以用
# n = (i for i in range(10))
# x = sum(i for i in range(10))
# print(n)
# print(n.__next__())
# print(n.__next__())
# print(x)

 

posted @ 2019-04-08 23:37  saber゛  Views(339)  Comments(0)    收藏  举报