Day12--Python--生成器,生成器函数,推导式,生成器表达式
一.昨日内容回顾
惰性机制(只有执行__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--生成器,生成器函数,推导式,生成器表达式的更多相关文章
- python 生成器函数.推导式.生成器表达式
一.生成器 什么是生成器,生成器的实质就是迭代器 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 1 def func ...
- day13 python生成器函数 推导式 生成器
day13 python 一.生成器 生成器的本质就是迭代器 生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__()) 由生成器函数或生成器表达式来创建 ...
- Python_Mix*生成器,生成器函数,推导式,生成器表达式
生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...
- python之生成器(~函数,列表推导式,生成器表达式)
一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- python全栈开发day13-迭代器、生成器、列表推导式等
昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...
- python基础(14):生成器、列表推导式
1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...
- python学习笔记013——推导式
1 推导式简介 推导式comprehensions(又称解析式),是Python的一种独有特性. 推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 推导式有三种形式: 1)列表推导式 (li ...
- Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...
随机推荐
- Java HashMap的put操作(Java1.6)
https://www.cnblogs.com/skywang12345/p/3310835.html // 存储数据的Entry数组,长度是2的幂. // HashMap是采用拉链法实现的,每一个E ...
- Lodop生成文档式模版
Lodop模版有两种方法,一种是传统的JS语句,可以用JS方法里的eval来执行,一种是文档式模版,是特殊格式的base64码,此篇博文介绍文档式模版的生成方法.两种模版都可以存入一下地方进行调用,比 ...
- jedis集群版应用
1.pom文件添加依赖: 2.创建配置文件 <!-- jedis集群版配置(JedisCluster通过构造传参(2个参数)) --> <bean id="redisCli ...
- linux读取Windows的txt文件问题
问题:Windows下生成的txt文件,在Linux下读取时会读取到多余字符(如: ^M) 原因:Windows和Linux下的换行符不一致 解决:在Linux代码中将多余字符去掉 ) buf = b ...
- 洛谷P1209修理牛棚题解
题目 这个题一眼看上去是一个贪心,但是一个贪心题就一定要用一个贪心的做法来做吗,为什么不能写一个DP呢,这个题我们可以从他修理牛棚的角度来看,价值就是一个木板可以修几个,但是也同时消耗掉了一个木板的长 ...
- jsp小测试--猜大小
page1.jpg: <%@ page language="java" import="java.util.*" pageEncoding="g ...
- springMVC整理03--处理数据模型 & 试图解析器 & @ResponseBody & HttpEntity
1.处理模型数据 SpringMVC 中的模型数据是非常重要的,因为 MVC 中的控制(C)请求处理业务逻辑来生成数据模型(M),而视图(V)就是为了渲染数据模型的数据.当有一个查询的请求,控制器(C ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- SVG图片如何调整大小和颜色
设计妹子给了SVG图片,在开发的时候尺寸不对,颜色也要修改,应当如何解决? 1.修改大小:在<svg> 标签中修改width.height 属性(默认单位是px)2.修改颜色:在<p ...
- SSL加速卡调研的原因及背景
SSL加速卡调研的原因及背景 SSL加速卡调研的原因及背景 网络信息安全已经成为电子商务和网络信息业发展的一个瓶颈,安全套接层(SSL)协议能较好地解决安全处理问题,而SSL加速器有效地提高了网络安全 ...