Python开发基础-Day9-生成器、三元表达式、列表生成式、生成器表达式
生成器
生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器。
def foo():
print('first------>')
yield 1
print('second----->')
yield 2
print('third----->')
yield 3
print('fouth----->')
g=foo()
from collections import Iterator
print(isinstance(g,Iterator))
print(g)
yield的功能:
1.与return类似,都可以返回值,但不一样的地方在于可以有多个yield,每个yield能够返回一次值,而return只能返回一次值就结束了
2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的
生成器的使用
def foo():
print('first------>')
yield 1
print('second----->')
yield 2
print('third----->')
yield 3
print('fouth----->')
g=foo()
print(g.__next__())
print(g.__next__())
print(g.__next__())
# print(g.__next__()) 输出结果
first------>
1
second----->
2
third----->
3
第一次g.__next__()在函数体的第一个yield结束后暂停,并执行前面的指令
第二次g.__next__()在函数体的第二个yield结束后暂停,并执行前面的指令
第三次g.__next__()在函数体的第三个yield结束后暂停,并执行前面的指令
如果来第四次g.__next__()方法,将抛出StopIteration提示错误
for循环调用:for会自动处理StopIteration,当遇到StopIteration自动停止
for i in g: #obj=g.__iter__() #obj.__next__()
print(i)
输出结果
first------>
1
second----->
2
third----->
3
fouth----->
如果生成器函数不赋值变量,那么每次执行都是全新的生成器函数,并没有迭代的效果,如下:
def foo():
print('first------>')
yield 1
print('second----->')
yield 2
print('third----->')
yield 3
print('fouth----->')
print(foo().__next__())
print(foo().__next__())
print(foo().__next__()) 输出结果
first------>
1
first------>
1
first------>
1
使用print测试foo函数,会发现,同一时间输出的foo函数,内存地址并不同
print(foo(),foo(),foo()) 输出结果:
<generator object foo at 0x00000251392F1E60> <generator object foo at 0x00000251392F1DB0> <generator object foo at 0x00000251392F1EB8>
生成器示例:一个yield返回多个值
def countdown(n):
print('starting countdown') while n > 0:
yield n
n-=1
print('stop countdown')
g=countdown(5)
for i in g:
print(i) 输出结果
starting countdown
5
4
3
2
1
stop countdown
生成器模拟linux命令:tail -f a.txt |grep 'error' |grep '404'
当在a.txt文件中输入字符串,如果包含error并且包含404,那么将打印出该行,其他不打印
import time
def tail(filepath,encoding='utf-8'):
with open(filepath,encoding=encoding) as f:
f.seek(0,2)
while True:
# f.seek(0, 2) #不行
line=f.readline()
if line:
# print(line,end='')
yield line
else:
time.sleep(0.5) def grep(lines,pattern):
for line in lines:
if pattern in line:
# print(line)
yield line g1=tail('a.txt')
g2=grep(g1,'error')
g3=grep(g2,'')
for i in g3:
print(i)
三元表达式
简化代码量:比较两个数的大小,可以用以下if语句完成
x=2
y=3
if x > y:
print(x)
else:
print(y)
使用三元表达式:可以简化成一行解决
res='x' if x > y else 'y'
print(res)
三元表达式即 'x' if x > y else 'y'
当条件为真,那么输出条件左边的值,当条件为假则输出右边的值
示例:
def max2(x,y):
# if x > y:
# return x
# else:
# return y
return x if x > y else y
print(max2(1,2))
列表生成式
简化生成列表的代码量
如:将s='hello'的字符串转化成大写,并将每一个字符转化成列表元素,即['H','E','L','L','O']
普通循环代码:
s='hello'
l=[]
for i in s:
res=i.upper()
l.append(res)
print(l)
列表解析代码:
s='hello'
res=[i.upper() for i in s]
print(res)
使用列表解析能够简化简单的代码生成
列表生成式说明:

示例:
l=[1,31,73,84,57,22]
print([i for i in l if i > 50]) #l列表中大于50的元素生成一个新列表
print([i for i in l if i < 50]) #l列表中小于50的元素生成一个新列表
print([i for i in l if i > 20 and i < 50]) #l列表中大于20小于50的元素生成一个新列表
生成器表达式
类似于列表生成式,只不过将中括号换成小括号,每次执行next将输出一个元素,占用内存小,每次只占用一个元素的内存空间
g=(i for i in range(1000))
print(g) #生成器
print(next(g)) #每次执行next(g)即可输出一个元素
print(next(g))
print(next(g))
print(next(g)) 输出结果
<generator object <genexpr> at 0x00000205FFE91E60>
0
1
2
3
Python开发基础-Day9-生成器、三元表达式、列表生成式、生成器表达式的更多相关文章
- Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
- Python 函数递归-三元表达式-列表生成式-字典生成式-匿名函数-内置函数
上节课复习: 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res ...
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- python基础之协程,列表生成式,生成器表达式
三元表达式 #三元表达式 name = 'alex' name = 'egon' res='SB' if name == 'alex'else 'shuai' print(res)#输出:shuai ...
- Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式
一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...
- python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04
递归 递归: # 函数在调用阶段直接或间接地又调用了自身 应用场景: # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点) --> l = [1, [2, [3, [4, [5, ...
- python迭代器 生成器 三元运算 列表解析
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- Python学习之==>内置函数、列表生成式、三元表达式
一.内置函数 所谓内置函数就是Python自带的函数 print(all([0,2,3,4])) #判断可迭代的对象里面的值是否都为真 print(any([0,1,2,3,4])) #判断可迭代的对 ...
随机推荐
- gitlab通过api创建组、项目、成员
前戏 获取gitlab中admin用户的private_token Groups API 获取某个组的详细 curl --header "PRIVATE-TOKEN: *********&q ...
- Bzoj3481 DZY Loves Math III
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 310 Solved: 65 Description Input Output Sample Input ...
- iOS-Apple苹果iPhone开发公开API
iOS-Apple苹果iPhone开发 //技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilo ...
- 【转载】Quick-Cocos2d-x文件结构分析
在上一章我们讲过了Quick-Cocos2d-x中的环境搭建,这章我们分析下quick中的文件结构吧!打开quick的文件夹,可以看到如下的这些目录和文件: bin:存放各种与引擎相关的脚本 comp ...
- POJ 3279 Fliptile ( 开关问题)
题目链接 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give ...
- Jquery checkbox 遍历
checkbox 全选\全部取消 $("#ChkAll").click(function(){ $("#divContent input[type='checkbo ...
- js_md5加密和base64的加密解密
1.最近有些人在爬我们公司的数据,然有了这个md5加密的小需求.为什么叫小需求呢?嗯,之前没做过,会以为很复杂. 其实,是想多了. 2.前端md5加密,其实也并不是安全的,因为代码是可见的.也就是说, ...
- 使用ubuntun16.04代码笔记
(1)cd /代表到根目录下面:ls表示将盘中内容列出:cd /home表是打开根目录下的home文件夹:(注意:凡是根目录下的文件夹前面都要加 /) (2)快捷键方式:可以用tab自动补全 (1 ...
- kndo grid:通过checkbox 实现多选和全选
在kendo grid 里要想通过checkbox 实现多选和权限,我们就要通过templeate 和input 标签对kendo grid 进行自定义 1. 在column 里面加入一列checkb ...
- pcap的安装
pcap,即 packet capture library 抓包库,这个抓包库给抓包系统提供了一个高层次的接口.所有网络上的数据包,甚至是那些发送给其他主机的,通过这种机制,都是可以捕获的.它也支持把 ...