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 生成器、推导式的更多相关文章

  1. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  2. python ---12 生成器 推导式

    一.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 1.创建生成器 最后以yield结束 1. 通过⽣成器函数   2. ...

  3. python之路---12 生成器 推导式

    三十.函数进阶 1.生成器    函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 ①创建生成器       最后以yield结束 ...

  4. 12.Python略有小成(生成器,推导式,内置函数,闭包)

    Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...

  5. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

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

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

  7. Python——生成器&推导式

    生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...

  8. Python之路-迭代器 生成器 推导式

    迭代器 可迭代对象 遵守可迭代协议的就是可迭代对象,例如:字符串,list dic tuple set都是可迭代对象 或者说,能被for循环的都是可迭代对象 或者说,具有对象.__iter__方法的都 ...

  9. python 列表推导式,生成器推导式,集合推导式,字典推导式简介

    1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...

随机推荐

  1. spring boot 使用 EnvironmentAware 加载配置文件

    @Configuration public class PropertiesUtils implements EnvironmentAware { private int redisExpireTim ...

  2. 获取cpu和内存使用情况

    public class SystemInfo { [DllImport("kernel32")] public static extern void GetSystemDirec ...

  3. 最长重复字符串题解 golang

    最长重复字符串题解 package main import ( "fmt" "strings" ) type Index map[int]int type Co ...

  4. 学习MeteoInfo二次开发教程(十)

    1.复制文件cloud_1009271330.000,I-01.pal 2.改: GridData cloud = aDataInfo.GetGridData(""); 为: Gr ...

  5. docker学习记录

    Container 容器是一种基础工具, 泛指任何容纳其他物品的工具, 可以部分或者完全封闭,被用于容纳,储存, 运输物品, 物体可以放置在容器中, 而容器可以保护内容物 1 Docker Objec ...

  6. directive

    var myModule = angular.module(...); myModule.directive('directiveName', function factory(injectables ...

  7. Android Jetpack 组建介绍(一)——Lifecycler

    转自带你领略Android Jetpack组件的魅力 Android Jetpack 对于任何一个产品来说,我们开发中都会面对哪些问题?如:产品交互.用户体验.代码结构.数据获取.数据存储.网络优化. ...

  8. 深入理解Java虚拟机读书笔记7----晚期(运行期)优化

    七 晚期(运行期)优化 1 即时编译器(JIT编译器)     ---当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,包括被多次调用的方法和被多次执行的循环体.     ...

  9. sys模块学习记录

    import sys s = sys.argv #命令行参数List,第一个元素是程序本身路径 #sys.exit() #退出程序,正常退出时exit(0) s = sys.version #获取Py ...

  10. Python module ---- abc

    python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类.  ABC,Abstract Base Class(抽象基类),主要定义了 ...