1 #coding=utf-8
2 #生成器 有两种 表现形式,自动实现迭代器
3 #函数 和表达式
4 #函数就有 yield 返回数据, 取代 return 但是 yield 可以多个
5
6 def func():
7 yield 1
8 yield 2
9 yield 3
10 print(func())
11 #<generator object func at 0x00000000003DF8B8> 这就是一个迭代对象,直接可以使用 next 方法
12 print(func().__next__()) # 1
13 print(func().__next__()) # 1
14 print(func().__next__()) # 1 这里每一次都是调用函数 每一次都用不同的迭代器 打印的值 都是第一个yield 返回的值
15
16 f = func()
17 print(f.__next__()) # 1 这里每一次都是调用 f 调用同一个 迭代器
18 print(f.__next__()) # 2
19 print(f.__next__()) # 3
20 #print(f.__next__()) # 只有三个值
21
22 #————————————————————————————————————————————————————————————————
23 #三元表达式: 最多三元 可以二元 不能四元
24 #if 的三元表达式
25 name = "蜗居"
26 ret = "BEST" if name == "蜗居" else "WORST"
27 print (ret)
28 #————————————————————————————————————————————————————————————————
29 #列表解析
30 #下鸡蛋
31 jidan = []
32 for i in range(10):
33 jidan.append("鸡蛋%s"%(i+1))
34 print(jidan)
35 #————————————————————————————————————————————————————————————————
36 #可以用三元表达式
37 jidan=[ "鸡蛋%s"%(i+1) for i in range(10)]
38 print (jidan)
39 #['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9', '鸡蛋10']
40
41 li=["鸡蛋%s"%(i+1) for i in range(10) if i>5]
42 print (li)
43 #['鸡蛋7', '鸡蛋8', '鸡蛋9', '鸡蛋10']
44
45 #————————————————————————————————————————————————————————————————
46 #li=["鸡蛋%s"%(i+1) for i in range(10) if i>5 else i <9] 不能有四元
47 #li= ["鸡蛋%s"%(i+1) for i in range(10) else "就这样多鸡蛋"] 不能只用else
48 #————————————————————————————————————————————————————————————————
49
50 #这个不能进行三元表达式
51 li=[]
52 for i in range(10):
53 li.append(i)
54 else:
55 li.append(i)
56
57 #————————————————————————————————————————————————————————————————
58 #这里就下完放在列表里面, 要占用内存空间 ,如果有很多上亿数量级 这样内存会不够
59
60 jidan=[ "鸡蛋%s"%(i+1) for i in range(5)]
61 print (jidan)
62
63 #['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5']
64
65 #————————————————————————————————————————————————————————————————
66 #这里就有了这样的方法,直接用列表解析,完成三元表达式,生成列表生成器
67 #就是将 上面的方括号 三元表达,变成 圆括号 这就变成 生成器,可以直接使用自己的next方法
68
69
70 laomuji = ("鸡蛋%s"%(i+1) for i in range(5))
71 print(laomuji)
72
73
74 #<generator object <genexpr> at 0x0000000001D3F8B8> 这就是一个生成器
75 #不用iter方法,直接就next方法
76
77 #使用自己的next 方法
78 print(laomuji.__next__())
79 print(laomuji.__next__())
80 print(laomuji.__next__())
81 print(laomuji.__next__())
82 print(laomuji.__next__())
83 #print(laomuji.__next__()) 只有五个鸡蛋 不能有6个 这里直接报错 StopIteration
84 #————————————————————————————————————————————————————————————————
85 #还可以用python 提供的next 方法 不用迭代器自己的 next方法
86 laomuji = ("鸡蛋%s"%(i+1) for i in range(5)) #这就是生成器表达式
87 #使用自己的next 方法
88 print(laomuji.__next__()) #第一个
89 #使用python 的next 方法
90 print(next(laomuji)) #第二个
91 print(laomuji.__next__()) #第三个
92 print(next(laomuji)) #第四个
93 print(laomuji.__next__()) #第五个
94 #不能用第六个
95 #————————————————————————————————————————————————————————————————
96 #python 中 for sum map reduce filter socket 等都是使用迭代器协议的方法
97 li = [1,2,3]
98 print(sum(li)) #6
99
100 print(sum(i for i in range(100000000))) #4999999950000000 结果计算较慢 但电脑不会卡死 这个就是生成器 生成的迭代器
101 #直接可以使用 next 方法 ,但是不会将列表保存在内存里 这样就不会占用大量内存
102
103 #print(sum([i for i in range(100000000]))) #这个电脑会卡死 这就是先创建列表到内存 然后再计算