# 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] # [] # []