python修炼之路-day12

一、生成器

  生成器实质就是迭代器

  获取生成器的方式:

    1.通过生成器函数

    2.通过推导式实现生成器

    3.通过数据转换实现生成器

获取生成器函数 __next__():

 1 def func():
 2     print('假装我是一个功能')
 3     yield '然而并不是'
 4     print('假装我是小蝌蚪')
 5     yield '你看不见我'
 6     print('假装我是一阵风')
 7     yield '无影无形'
 8 
 9 s = func()
10 print(s.__next__())
11 print(s.__next__())
12 print(s.__next__())

节省内存的方法:

 1 def eggs():
 2     i = 1
 3     while i < 101:
 4         yield '鸡蛋%s' % i
 5         i += 1
 6 s = eggs()
 7 print(s.__next__())
 8 print(s.__next__())
 9 print(s.__next__())
10 print(s.__next__())

获取生成器函数 send():

 1 def eat():
 2     print("我吃什么啊")
 3     a = yield "馒头"
 4     print("a=",a)
 5     b = yield "⼤饼"
 6     print("b=",b)
 7     c = yield "⾲菜盒⼦"
 8     print("c=",c)
 9     yield "GAME OVER"
10 gen = eat() # 获取⽣成器
11 ret1 = gen.__next__()
12 print(ret1)
13 ret2 = gen.send("胡辣汤")
14 print(ret2)
15 ret3 = gen.send("狗粮")
16 print(ret3)
17 ret4 = gen.send("猫粮")
18 print(ret4)

列表推导式:

  [结果 for 变量 in 可迭代对象 if 条件]

1 # 获取1-100内能被3整除的数
2 lst = [i for i in range(1,101)  if i % 3 == 0]
3 print(lst)
1 # 寻找名字中带有两个e的人的名字
2 names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,'Joe'],['Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 'Eva']]
3 lst = [a for i in names for a in i  if a.count('e') == 2]
4 print(lst)

字典推导式:

  {结果 for 变量 in 可迭代对象 if 条件}  结果是键值对=》key:value

1 # 字典推导式
2 
3 list1 = ['', '', '', '', '', '', '']
4 list2 = ['','','','','6','', '']
5 
6 dic = {list1[i]:list2[i]  for i in range(len(list1))}
7 print(dic)

集合推导式:

  {结果 for 变量 in 可迭代对象 if 条件}  结果是 key

1 lst = [1, -1, 8, -8, 12]
2 # 绝对值去重
3 s = {abs(i) for i in lst}
4 print(s)

生成器表达式和列表推导式的区别:

  1.列表推导式比较耗内存. 一次性加载. 生成器表达式几乎不占用内存. 使用的时候才分 配和使用内存

  2.得到的值不一样. 列表推导式得到的是一个列表. 生成器表达式获取的是一个生成器

猜你喜欢

转载自www.cnblogs.com/child-king/p/9329510.html
今日推荐