【1.43】三元运算 列表解析 生成器表达式

  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])))   #这个电脑会卡死  这就是先创建列表到内存 然后再计算

 

posted @ 2016-04-01 16:13  科学小怪癖  阅读(112)  评论(0)    收藏  举报