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入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...
随机推荐
- elasticsearch概念及倒排索引简单介绍
一.概念 集群:一个或者多个节点组织在一起 节点:一个节点是集群中的一个服务器,由一个名字来标识,默认是一个随机的漫威角色名字. 分片:将索引划分为多份的能力,允许水平分割和扩展容量,多个分片相应请求 ...
- 使用ultraiso制作启动盘安装windows操作系统
1. 使用ultraiso制作u盘启动盘 在电脑上安装ultraiso: 启动ultraiso,文件->打开->选中iso镜像文件 菜单栏->启动->写入硬盘映像 a. 便捷启 ...
- linux 地址解析协议 arp
随便转载,保留出处:http://www.cnblogs.com/aaron-agu/ arp –na #查看 arp –s 123.253.68.209 00:19:56:6F:87:D4 #添加
- PLSQL过期:Your trial period for PL/SQL Developer is over .If you want to continue using this software ,you must purchase the retail version.
PLSQL过期:Your trial period for PL/SQL Developer is over .If you want to continue using this software ...
- 魔术方法:__set、__get
__set: 在设置对象里边不能直接设置(或没有)的属性值的时候,自动去被调用 class Track { private $track_name; public function __set($na ...
- H5(仅仅是个地址)
http://www.w3school.com.cn/html5/html_5_intro.asp (▼ヘ▼#) 怕你不看,我特地给你记个地址,应该不能再故意不看了吧 (▼ヘ▼#)
- 学习 Spring (一) Spring 介绍
Spring入门篇 学习笔记 Spring 是什么 Spring 是一个轻量级的 IoC (控制反转)和 AOP (面向切面)的容器框架 框架与类库的区别 框架一般是封装了逻辑.高内聚的,类库则是松散 ...
- c++ 怎么输出保留2位小数的浮点数
//添加头文件 #include<iomanip> //定义变量 folat a=9.1; cout<<setiosflags(ios::fixed)<<setpr ...
- micro-fusion & macro-fusion
micro-fusion 随着技术的发展,CPU内部指令处理单元(execution unit)以及端口(port)增多,在Pentium 4的时候,发出到Execution Unit的μops的th ...
- Python小练习
1.计算x的n次方 2.计算x的阶乘 3.计算1x1 + 2x2 + 3x3 ...+ NxN之和 def fun(n): s=0 while n > 0: s = s + n*n n = n ...