【学习笔记】--- 老男孩学Python,day13 生成器,生成器函数,各种推倒式和生成器表达式
1. 生成器和生成器函数
2. 生成器函数:
函数中包含了yield的就是生成器函数
注意:生成器函数被执行. 获取到的是生成器. 而不是函数的执行生成器表达式:
(结果 for 变量 in 可迭代对象 if 筛选)
取值:
1. __next__()
def func(): print("我是周杰伦") yield "昆凌" # 函数中包含了yield, 当前这个函数就不再是普通的函数了. 是生成器函数 g = func() print(g.__next__()) print(func().__next__()) g1 = func() g2 = func() print(g1.__next__()) print(g1.__next__()) print("==============") print(g2.__next__()) g = func() # 通过函数func()来创建一个生成器 print(g.__next__()) # 周杰伦 print(g.__next__()) # 王力宏 print(g.__next__()) # 笛卡尔积 print(g.__next__()) # return 直接返回结果. 结束函数的调用 # yield 返回结果.可以让函数分段执行 # def func(): lst = [] for i in range(1,100001): lst.append("衣服%s" % i) return lst def gen(): i = 1 while i < 100001: yield "衣服%s" % i i = i + 1 g = gen() print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) def func(): yield 11 yield 22 yield 33 yield 44 g = func() # 拿到的是生成器. 生成器的本质是迭代器. 迭代器可以被迭代 生成器可以直接for循环 for i in g: print(i) # 本质上执行的是__next__() it = g.__iter__() while True: try: print(it.__next__()) except StopIteration: break
2. send(值) 给上一个yield位置传一个值, 第一个和最后一个yield不用传值
def func(): print("大碴粥") a = " print(a) print("狗不理") b = " print(b) print("大麻花") c = " print(c) g = func() print(g.__next__()) print(g.send(1)) print(g.send(2)) print(g.send(3)) # __next__() 可以让生成器向下执行一次 # send() 也可以让生成器向下执行一次, 给上一个yield传一个值, 第一个不能用send(). 最后一个也不要传值 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) def func(): yield 11 yield 22 yield 33 yield 44 g = func() lst = list(g) # 可迭代对象 print(lst)
3. 各种推导式和生成器表达式:
# 生成列表 里面装1-14的数据 lst = [] for i in range(1,15): lst.append("python%s" % i) print(lst) # 列表推倒式; 最终给你的是列表 # 语法 [最终结果(变量) for 变量 in 可迭代对象] lst = [i for i in range(1,15)] print(lst) # [最终结果 for 变量 in 可迭代对象 if 条件] lst = [i for i in range(1,101) if i%2==0] print(lst) # 1. 获取1-100内能被3整除的数 lst = [i for i in range(1,101) if i % 3 == 0] # 2. 100以内能被3整除的数的平方 lst = [i*i for i in range(1,101) if i % 3 == 0] # 3. 寻找名字中带有两个e的⼈的名字 names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' , 'Joe'],['Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 'Eva']] lst = [name for first in names for name in first if name.count("e") == 2] print(lst) lst = ["衣服%s" % i for i in range(10000)] g = (i for i in range(10)) print(list(g)) gen = ("麻花藤我第%s次爱你" % i for i in range(10)) for i in gen: print(i)
生成器的惰性机制
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)) print(list(g2))
列表推倒式 [结果 for 变量 in 可迭代对象 if 筛选]
字典推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key:value
集合推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key
dic = {"a":"b", "c":"d"} # 把字典中的key:value互换 .{"b":"a", "d":"c"} new_dic = {dic[key]:key for key in dic} print(new_dic) lst1 = ["alex", "wusir", "taibai", "ritian"] lst2 = ['sb', "很色", "很白", "很牛"] # {"alex":"sb", "wusir":"很色"} dic = { lst1[i]:lst2[i] for i in range(len(lst1))} print(dic) lst = ["马化腾", "马化腾", "王建忠", "张建忠", "张建忠", "张雪峰", "张雪峰"] s = {i for i in lst} # 集合推倒式 print(s)
【学习笔记】--- 老男孩学Python,day13 生成器,生成器函数,各种推倒式和生成器表达式的更多相关文章
- 【学习笔记】--- 老男孩学Python,day10, 初识函数 形参、实参
函数:对功能的封装语法: def 函数名(形参): 函数体 函数名(实参) 函数名:命名规则和变量一样 函数的返回值: return, 函数执行完毕. 不会执行后面逻辑 1. 如果函数中不写retur ...
- Python3学习笔记(十四):可迭代对象、迭代器和生成器
记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...
- 学习笔记《简明python教程》
学习笔记<简明python教程> 体会:言简意赅,很适合新手入门 2018年3月14日21:45:59 1.global 语句 在不使用 global 语句的情况下,不可能为一个定义于函数 ...
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Python学习笔记(4):容器、迭代对象、迭代器、生成器、生成器表达式
在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...
- 【学习笔记】--- 老男孩学Python,day4 编码,数据类型,字符串方法
今日主要内容 1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 ...
随机推荐
- Flask从入门到精通之使用Flask-Migrate实现数据库迁移
在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库.仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建.因此,更新表的唯一方式就是先删除旧表,不 ...
- PHP之旅8 URL与表单
表单 表单的出现让用户和后台主机有了直接的交互,网站开始变的‘动态起来’,在HTML的各个标记符中,与PHP关系最为紧密的要属表单标记符了,常见的表单标记符有<form>.<inpu ...
- 在阿里云服务器中安装配置mysql数据库完整教程
阿里云ECS服务器CentOS7上安装MySql服务 (可选)1.确保服务器系统处于最新状态 [root@localhost ~]# yum -y update如果显示以下内容说明已经更新完成 Rep ...
- C# 基元类型
C#编程中,初始化一个整数有两种方式: (1).较繁琐的方法,代码如下: Int32 a = new Int32(); (2).极简的方法,代码如下: ; 对比两种方法,分析如下: 第一种:过于繁琐, ...
- 解决waveInOpen录音编译x64程序出错的问题
1.之前也碰到过x86程序升级为x64程序,关键点是类型大小的使用. 之前同事碰到过一个用int表示指针的程序,程序改为x64会出错,找原因找了半天. 2.今天我也碰到了,使用aveInOpen录音, ...
- attachEvent和addEventListener区别总结
1.attachEvent与addEventListener的区别 支持的浏览器不同.attachEvent在IE9以下的版本中受到支持.其它的都支持addEventListener. 参数不同.ad ...
- Android Layout 01_activity_Login.xml
activity_login.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- Office自动生成目录步骤(非常实用)(图文详解)
不多说,直接上干货! 结束 欢迎大家,加入我的微信公众号:大数据躺过的坑 人工智能躺过的坑 同时,大家可以关注我的个人博客: http://www.cnblogs.co ...
- sql 递归树
with CTE as ( -->Begin 一个定位点成员 select ID, PersonName,ParentID,cast(PersonName as nvarchar(max)) a ...
- 数据库-SQLite简介
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库(轻型数据库). 由于资源占用少.性能良好和零管理成本,嵌入式数据库有了它的用武之地,像Android.iPhone都有内置的S ...