一.昨日内容回顾
惰性机制(只有执行__next__()才会取值)
二.今日主要内容
1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样.
※生成器记录的是代码 2.生成器函数
生成器函数: 在函数中return换成yield. 这个函数就是生成器函数
def func():
yield      yield from iterable 相当于 for el in iterable: yield el 取值:
gen.__next__() 下一个
gen.send() 可以给上一个yield传值,第一次执行不能用send(),不能给最后一个yield传值 gen = func() 函数并不会被执行,而是创建一个生成器对象 def func()
print('你好啊,我叫赛利亚.')
yield '西岚的武士刀' #return 和yield都可以返回数据 ret = func() #generator ret是一个生成器
print(ret)
s = ret.__next__()
print(s)      yield from:
      
def func():
lst = ["三国演义", "红楼梦", "北国的雪", "了不起的盖茨比"]
# for el in lst:
# yield el
yield from lst gen = func()
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
def func():
lst = ["三国演义", "红楼梦", "北国的雪", "了不起的盖茨比"]
# for el in lst:
# yield el
yield from lst
        -------------生成器取值-------------------------
def func():
print(111)
yield 222 g = func() # 生成器 g1 = (i for i in g) # 生成器
g2 = (i for i in g1) # 生成器 # print(list(g)) # 才会开始真正的取数据
print(list(g1)) # 222
print(list(g2))
print(list(g))
--------------------------------------
def eat():
print("我吃什么啊")
a = yield "馒头"
print("a=",a)
b = yield "⼤饼"
print("b=",b)
c = yield "⾲菜盒⼦"
print("c=",c)
yield "GAME OVER" gen = eat() # 获取⽣成器
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤") # a胡辣汤'赋值给a
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)
-------------------------------------- 库存10000件衣服,每次领用1件
def func():
for i in range(10000):
yield '衣服%s' % i gen = func() #生成器 注意:生成器不能直接替换到下面yf中,否则会生成新的生成器
yf1 = gen.__next__()
yf2 = gen.__next__()
yf3 = gen.next__()
-----------------一次拿50个---------------------
def func():
lst = []
for i in range(1, 10000):
lst.append('衣服%s' % i)
if i % 50 == 0:
yield lst
lst = [] gen = func()
print(gen.__next__())
print(gen.__next__())
-----------------send()---------------------
def func():
print('韭菜盒子')
a = yield '娃哈哈'
print('肉包子', a)
b = yield '脉动'
print('锅包肉', b)
yield '冰红茶' gen = func()
ret = gen.__next__()
print(ret)
# ret = gen.__next__()
# print(ret) ret = gen.send('大熊猫') #给上一个yield传值
print(ret) ret = gen.send('长颈鹿') #给上一个yield传值
print(ret)
--------------------------------------
# 计算两个数的和
def add(a, b):
return a + b # 生成器函数, 0-3
def test():
for r_i in range(4):
yield r_i # 获取到生成器
g = test() # 惰性机制 for n in [2, 10]:
g = (add(n, i) for i in g) # 循环的内部也是一个生成器 # 生成器记录的是代码 # __next__()
# list() print(list(g)) # 刚开始拿数据 --------------------------------------
-------------------------------------- def func():
print('拿出手机')
print('打开陌陌')
yield '手机'
print('搜索附近的人')
print('找到小姐姐')
yield '电脑'
print('我是最后一行') gen = func()
print(gen.__next__()) #打印到第一个yield
print(gen.__next__()) #从上一次打印结束的位置开始打印到第二个yield, yield起到分段作用
print(gen.__next__()) #报错. 打印完最后一行后找不到yield,所以提示StopIteration. 3.各种推导式
1.列表推导式:[结果 for循环 if条件]
2.字典推导式:{key: value for循环 if条件}
3.集合推导式: {key for循环 if条件} 列表推导式:
lst = ['python%s期' % i for i in range(1, 17)]
print(lst) --------------------------------------
# 创建列表
# for i in range(1,100,2):
lst = [i for i in range(1, 100, 2)]
print(lst) lst = [i for i in range(1, 100) if i % 2 == 1]
print(lst)
在列表中装入python1期到python16期
lst = []
for i in range(1, 17):
lst.append('python%s期'i)
print(lst) --------------------------------------
寻找名字中带有2个e的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] lst = [el2 for el in names for el2 in el if el2.count('e') >= 2]
print(lst) 字典推导式
dic = {'张无忌': '九阳神功', '周芷若': '九阴真经', '楚留香': '帅'}
d = {dic[k]: k for k in dic}
print(d) lst1 = ['东北', '陕西']
lst2 = ['大拉皮儿', '油泼面']
dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic) 集合推导式
{key for if} lst = [1, 1, 2, 2, 3, 3, 45]
s = {el for el in lst}
print(s) 4.生成器表达式(笔试题)
(结果 for循环 if条件)
可以使用生成器表达式直接创建生成器 gen = (i for i in range(10)) #generator
print(gen.__next__())
print(gen.__next__()) 生成器表达式:记录一下代码.然后每次需要的时候去生成器中执行一次这个代码
列表推导式: 一次性把所有的数据创建出来,容易产生内存浪费 特点:
1.节省内存
2.惰性机制 ※
3.只能向前

Day12--Python--生成器,生成器函数,推导式,生成器表达式的更多相关文章

  1. python 生成器函数.推导式.生成器表达式

    一.生成器 什么是生成器,生成器的实质就是迭代器 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 1 def func ...

  2. day13 python生成器函数 推导式 生成器

    day13 python   一.生成器     生成器的本质就是迭代器     生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__())     由生成器函数或生成器表达式来创建   ...

  3. Python_Mix*生成器,生成器函数,推导式,生成器表达式

    生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...

  4. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  5. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  6. python全栈开发day13-迭代器、生成器、列表推导式等

    昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...

  7. python基础(14):生成器、列表推导式

    1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...

  8. python学习笔记013——推导式

    1 推导式简介 推导式comprehensions(又称解析式),是Python的一种独有特性. 推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 推导式有三种形式: 1)列表推导式 (li ...

  9. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

随机推荐

  1. ArcGIS DeskTop 10.2 的安装与破解

    ArcGIS DeskTop 10.2套件作为一组常用的ArcGIS软件为我们提供了对地图原始数据进行加工以及各种操作,通过这组软件我们能够很好地定制我们最终的地图样式,但是更多的时候我们需要对这组软 ...

  2. 老男孩python学习自修第十九天【异常处理】

    1.常见的错误 TypeError 类型错误 NameError 没有该变量 ValueError 不期望的值 AttributeError 没有该属性 UnboundLocalError 没有该局部 ...

  3. JavaScript之Json的使用

    Json字符串转JavaScript对象 <html> <body> <h3>通过 JSON 字符串来创建对象</h3> <p> First ...

  4. Python——POP3邮件协议

    一.POP3协议用于收取邮件 二.POP3协议常用方法 user(login):想服务器发送登录名,并显示服务器的响应,表示服务器正在等待该用户的输入密码 pass_(passwd):在用户使用use ...

  5. 动态追加js

    判断是否已引用js,如果没有会引发异常,在异常时添加引用 try { if (layui) {} } catch (ex) { var s = document.createElement('scri ...

  6. table-layui

    本文章为原创文章,转载请注明出处 html <div class="layui-btn-group tableBtn"> <button class=" ...

  7. 第二十二天 logging hashlib re 模块

    今日内容 logging功能完善的日志模块 re正则表达式模块主要处理字符串匹配 查找 搜索给你一个字符串 要从中找到你需要的东西 爬虫大量使用 hashlib hash算法相关的库 算法怎么算不需要 ...

  8. 提高SqlServer数据库的安全性,禁用掉sa账户

    Sqlsever 数据库有两种登陆身份验证模式,一种是windows身份验证:一种是sqlserver 账户验证模式,在sqlserver 账户验证模式中,sa账户是大家所熟知的,并且sa也是内置的默 ...

  9. Map Labeler POJ - 2296(2 - sat 具体关系建边)

    题意: 给出n个点  让求这n个点所能建成的正方形的最大边长,要求不覆盖,且这n个点在正方形上或下边的中点位置 解析: 当然是二分,但建图就有点还行..比较难想..行吧...我太垃圾... 2 - s ...

  10. 从快感到成就感:多巴胺vs内啡肽

    从快感到成就感:多巴胺vs内啡肽 来源 https://zhuanlan.zhihu.com/p/24697188   作者:朱良      编辑于 2017-06-20 努力不一定成功,但不努力一定 ...