day12-2018-11-1 生成器

# def gen():
#     print("我是一个函数")
#     return "娃哈哈" # 返回 娃哈哈, 返回给调用者
#     print("你好")
#     print("你好")
#     print("你好")
#
# ret = gen()
# print(ret) # 娃哈哈

# 生成器函数. 就是把return换成yield
# def gen():
#     print("爽歪歪")
#     yield "娃哈哈" # 可以让我们的函数分段运行
#     print("酸酸乳")
#     yield "AD钙奶"
#     print("黄焖鸡米饭")
#
# ret = gen() # 不会执行你的函数, 获取到生成器对象
# # 迭代器不能等价代换
# print(ret) # <generator object gen at 0x00000195518CFE60> generator 生成器
# print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 娃哈哈
# print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 AD钙奶
# print(ret.__next__()) # StopIteration 迭代器, 就找yield, 执行不到才会报错


# 生成器函数有什么用
# 普通的程序会占用内存
# def buy():
#     lst = []
#     for i in range(10000):
#         lst.append("衣服%s" % i)
#     return lst
#
# lst = buy()
# print(lst)

# def gen():
#     lst = []
#     for i in range(1, 10000):
#         lst.append("衣服%s" % i)
#         if i % 50 == 0: #  1 2 3 4 5 6 7 8 9 .. 49  50
#             yield lst
#             lst = [] # 每次生成一个新列表
#
# g = gen() # 获取到生成器
#
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

# 迭代器
# # 节省内存
# # 惰性机制
# # 只能往前

# 生成器还可以使用__next__(), send()来访问生成器
# send()可以给上一个yield位置传值

# def func():
#     print("水饺")
#     a = yield "大馅水饺"
#     print("a=", a)
#     print("烧饼")
#     b = yield "武大郎烧饼"
#     print("b=",b)
#     print("老婆饼")
#     c = yield "只要老婆不要饼"
#     print("c=", c)
#
#
# gen = func() # 生成器
# print("返回值是:", gen.__next__())
# print("返回值是:",gen.send("混沌面")) #  和__next__()一样也是向下找yield. 给上一个yield传值
# print("返回值是:",gen.send("胡辣汤")) #  和__next__()一样也是向下找yield. 给上一个yield传值
# print("返回值是:",gen.send("马拉")) #  和__next__()一样也是向下找yield. 给上一个yield传值

#  send()不可以在第一个位置和最后一个位置出现
#  最后的yield后的代码是可以执行的但是会报错. StopIteration

# 生成器函数里不要写return
# def  func():
#     print("哈哈")
#     yield  "呵呵"
#     print("吼吼")
#     return  "嘻嘻" # don't do this!
#
# gen = func()
# gen.__next__()
# gen.__next__()



# def gen():
#     lst = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]
#     yield from lst # 把列表中的每一个元素返回
#     # yield  lst[0]
#     # yield  lst[1]
#     # yield  lst[2]
#     # yield  lst[3]
#
# g = gen() # 生成器函数 -> 获取生成器
# for el in g:
#     print(el)

# def gen():
#     lst = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]
#     lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"]
#     yield from lst
#     # yield lst[0]
#     # yield lst[1]
#     # yield lst[2]
#     # yield lst[3]
#     yield from lst2
#     # yield lst2[0]
#     # yield lst2[1]
#     # yield lst2[2]
#     # yield lst2[3]
#
# g = gen() # 获取生成器
# for el in g: # 从生成器获取数据
#     print(el) # 打印


def func():
    print(111)
    yield 222

g = func()
print(g.__next__())
g = func()
print(g.__next__())

gg = (i for i in range(10))
print(list(gg))
# lst = []
# for i in range(1, 18):
#     lst.append("python全栈%s期" % i)
#
# print(lst)

# 列表推导式 快速的简单的创建一个列表
# lst = ["python全栈%s期" % i for i in range(1, 17)]
# 语法: [结果 for循环 if判断]

# lst = [ i for i in range(1, 21) if i % 2 == 1]
# print(lst)
# lst = ["中岛美雪", "夏川美里", "原由子", "汪峰", "田震","那英","周杰伦"]
#
# # for el in lst:
# #     if len(el) == 2:
# #         pass
# new_lst = [ el for el in lst if len(el) == 2]
# print(new_lst)

# 生成列表: 1-20 所有的奇数的2次方
# print([ i*i for i in range(1,21) if i % 2 == 1])



# [3,6,9]  已知
# [(1,2,3), (4,5,6), (7,8,9)]
# lst = [3,6,9]
# new_lst = [(el-2, el-1, el) for el in lst]

# for el in lst: # 3
#     new_lst.append((el-2, el-1, el))
# print(new_lst)

# 寻找名字中带有两个e的⼈的名字 name.count("e") == 2
# names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
#          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
#
# lst = [name for el in names for name in el if name.count("e") == 2]
# print(lst)

# 语法: [结果 for循环 if判断]


# 字典推导式和集合推导式
# {结果 for循环 if判断}
# {结果 for循环 if判断}

# lst = [11, 22, 33]  #  => {0:11, 1:22, 2:33}
# dic = {i:lst[i] for i in  range(len(lst)) }
# print(dic)
#
# dic = {"张无忌":"赵敏", "杨过":"小龙女", "郭靖":"黄蓉"}
# # 把字典中的key和value互换
# # dic = {"赵敏":"张无忌", "小龙女":"杨过", "黄蓉":"郭靖"}
# dic1 = { v:k for k, v in dic.items()}  # 强化
# print(dic1)
#
# dic2 = { dic[k]:k for k in dic} # 强化
# print(dic2)


# 集合推导式 # 不可变. 不重复, 无序
# {结果 for循环 if判断}
# s = {i*"胡辣汤" for i in range(10)}
# print(s)


# 没有元组推导式
# 生成器表达式  (结果  for循环 if判断)   =>   生成器表达式
# 特点:  本质是迭代器. __next__()
    # 1. 省内存
    # 2. 惰性机制
    # 3. 只能向前

# def gen():
#     yield 1
#
# r = gen()
# r....

# g = (i for i in range(10))
# print(g) # <generator object <genexpr> at 0x000001F32B74FEB8>
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__()) #  StopIteration

# lst = ["衣服%s" % i for i in range(100000000)] # 占内存
# print(lst)

# g = ("衣服%s" % i for i in range(100000000)) # 生成器表达式. 节省内存
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

# g = (i for i in range(10))
# # s = {1,2 , 3, 4, 5}
# print(list(g)) # 把传递进来的数据转化成列表.  里面包含了for循环
# # list() => for=> __iter__() ==> __next__()
#
# print(list(g)) # 上一次已经拿没了
# print(g.__next__())
# for el in g:
#     print(el)
# for el in g: # 已经没有数据了 惰性机制-> 只能往前
#     print(el)


# def func(): # 生成器函数
#     print(111)
#     yield 222
#
# g = func() #  生成器 -> 没有执行过__next__()
# g1 = (i for i in g) # 生成器表达式. 也没有__Next__()
# g2 = (i for i in g1) # 生成器表达式. 也没有__Next__()
# # 到此为止, 没有人拿过值
#
# print(list(g2)) # 111 [222]
# print(list(g)) #  []
# print(list(g1)) # []

# 111
# [222]
# []
# []
原文地址:https://www.cnblogs.com/VastTry/p/9890557.html