python note 12 生成器、推导式
1、生成器函数
# 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数
# yield: 相当于return 可以返回数据. 但是yield不会彻底中断函数. 分段执行函数.
# gen.__next__() 执行函数. 执行到下一个yield.
# gen.__next__() 继续执行函数到下一个yield.
不用生成器可能导致内存不够
def order():
lst = []
for i in range(10000):
lst.append("衣服"+str(i))
return lst
ll = order()
print(ll)
使用生成器逐个输出
def order():
for i in range(10000):
yield "衣服"+str(i)
g = order() # 获取生成器
mingwei = g.__next__()
print(mingwei)
#输出衣服0
zhaoyining = g.__next__()
print(zhaoyining)
#输出衣服1
2、send()用法
# send() 和__next__()是一样的. 可以执行到下一个yield, 可以给上一个yield位置传值
def func():
print("我是第一个段")
a = yield 123
print(a)
print("石可心是第二段")
b = yield 456
print(b)
print("赵一宁是第三段")
c = yield 789
print(c)
print("刘伟是最后一个段")
yield 79 # 最后收尾一定是yield,否则会报错
g = func()
print(g.__next__())#没有上一个yield 所以不能使用send() 开头必须是__next__()
print(g.send("煎饼果子"))#赋值给a
print(g.__next__())
print(g.__next__())
#我是第一个段
#
#煎饼果子
#石可心是第二段
#
#None
#赵一宁是第三段
#
#None
#刘伟是最后一个段
#
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("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send( "猫粮")
print(ret4)
#我吃什么啊
#馒头
#a= 胡辣汤
#鸡蛋灌饼
#b= 狗粮
#韭菜盒子
#c= 猫粮
#GAME OVER
# for的内部一定有__next__()
def func():
yield 1
yield 13
yield 26
yield 88
yield 46
yield 100
for i in func(): # for的内部一定有__next__()
print(i)
print(list(func())) # 内部都有__next__()
3、推导式
# 推导式: 用一句话来生成一个列表(列表推导式)
lst = []
for i in range(1, 16):
lst.append("python"+str(i))
print(lst)
#等同于下列推导式
lst = ["python"+str(j) for j in range(1,16)]
print(lst)
# 语法: [结果 for循环 判断]
lst = [i for i in range(100) if i%2==1]
print(lst)
# 100以内能被3整除的数的平方
lst = [i*i for i in range(100) if i%3==0]
print(lst)
# 寻找名字中带有两个e的人的名字
names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,'Joe'],
[ 'Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 1]]
lst = [name for line in names for name in line if type(name) == str and name.count("e") == 2]
print(lst)
#for循环写法
names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,'Joe'],
[ 'Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 1]]
lst = []
for line in names:
for name in line:
if name.count("e") == 2:
print(name)
#字典推导式
# 语法:{k:v for循环 条件筛选}
# [11,22,33,44] => {0:11,1:22,2:33,3:44}
lst = [11,22,33,44]
dic = {i:lst[i] for i in range(len(lst)) if i < 2}#字典推导式就一行
print(dic)
#输出{0: 11, 1: 22}
dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}
d = {v : k for k,v in dic.items()}
print(d)
#输出{'赵四': 'zs', '刘能': 'ln', '周杰伦': 'jay', '林俊杰': 'jj'}
#集合推导式(可去除重复)
lst = [1, 1, 4, 6,7,4,2,2]
s = { el for el in lst }
print(s)
#输出{1, 2, 4, 6, 7}
4、生成器表达式(多看看)
# 生成器函数
def func():
print(111)
yield 222
yield 333
g = func() # 获取生成器
g2 = (i for i in g) # 生成器
g3 = (i for i in g2) # 生成器
print(list(g))#输出111 [222, 333] 源头. 从源头把数据拿走了
print(list(g2))#输出[] 这里执行的时候. 源头已经没有数据
print(list(g3))#输出[] 这里也没有值了
#注意此题思想
# 求和
def add(a, b):
return a + b
# 生成器函数 # 0-3
def test():
for r_i in range(4):
yield r_i
# 0,1,2,3
g = test() # 获取生成器
for n in [2, 10]:
g = (add(n, i) for i in g)
print(list(g))
#输出[20, 21, 22, 23]
5、题目
1.求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
lst = [(i,j) for i in range(5) for j in range(5) if i%2 ==0 and j %2 ==1]
print(lst)
#输出[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
python note 12 生成器、推导式的更多相关文章
- Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...
- python ---12 生成器 推导式
一.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器 一个一个的创建对象 节省内存 1.创建生成器 最后以yield结束 1. 通过⽣成器函数 2. ...
- python之路---12 生成器 推导式
三十.函数进阶 1.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器 一个一个的创建对象 节省内存 ①创建生成器 最后以yield结束 ...
- 12.Python略有小成(生成器,推导式,内置函数,闭包)
Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...
- 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ
一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- Python——生成器&推导式
生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...
- Python之路-迭代器 生成器 推导式
迭代器 可迭代对象 遵守可迭代协议的就是可迭代对象,例如:字符串,list dic tuple set都是可迭代对象 或者说,能被for循环的都是可迭代对象 或者说,具有对象.__iter__方法的都 ...
- python 列表推导式,生成器推导式,集合推导式,字典推导式简介
1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...
随机推荐
- docker-容器,仓库
---恢复内容开始--- 前言: 学技术不能该断时间,连续的学习才是最好的学习方式. 00x1: 创建一个容器:docker create -it xxxx 而启动容器就有两种状态了,第一:新容器启动 ...
- Windows中的备份和还原
1:增量备份 (查看文件属性,只备打了勾的,备完后把勾取消掉,修改后勾都会打上) 2:差异备份(备份有勾的 ,备份完后不会取消勾) 周一:备一 周二:备二 周三:备三 周四:备三,四
- Git 分布式版本管理器 windows环境下使用
首先需要下载Git来安装 没有安装文件的小伙伴可以网盘下载——> https://pan.baidu.com/s/1owwUItDri9skqYzOjzXLsw 之后安装Git 一路很顺 ...
- c++界面库方案
最近的开发需要向java以及c++方向转向:看了些java和c++的东西 最近研究了下,最后觉得使用ogre+mygui来实现c++界面,这样用比较方便: 当前ogre,mygui都可以实现界面,可以 ...
- 请简单介绍一下BootStrap:
1.轻量级的开发响应式页面的框架 2.全局CSS,组件,JS插件 3.栅格系统:将页面分为12个等分(CSS3@media媒体查询) 4.col-xs-*:手机屏幕 5.col-sm-*:平板 6.c ...
- vue.js 自定义事件
<div id="app"> <h2>{{num}}</h2> <h1>全局组件</h1> <my-compone ...
- ubuntu远程windows桌面
最近把系统装成了ubuntu,需要远程windows ,就用到了ubuntu的 rdesktop工具 1.先打开终端输入 rdesktop 看系统是否安装了 rdesktop 如果没有安装需要 ...
- opencv常用api
opencv常用api 一.图像及视频读写 img=cv2.imread('jiang.jpg',1) cv2.imwrite('jiang.jpg',img) cv2.imshow('ji ...
- WIN下的Django安装
转自https://www.cnblogs.com/lfxiao/p/7510002.html
- 读取tensorflow的checkpoint里保存的参数
import tensorflow as tf from tensorflow.python import pywrap_tensorflow import os checkpoint_path = ...