Python基础(8)_迭代器、生成器、列表解析
一、迭代器
1、什么是迭代
1 重复
2 下次重复一定是基于上一次的结果而来
- l=[,,,]
- count=
- while count < len(l):
- print(l[count])
- count+=
迭代举例
2、可迭代对象
可进行.__iter__()操作的为可迭代对象
#print(isinstance(str1,Iterable)),判断str1是否是可迭代对象
3、迭代器
进行.__iter__()操作操作后的结果为迭代器
iter1=obj.__iter__() #iter1为迭代器
优点:
1 提供了一种不依赖于索引的取值方式
2 惰性计算,节省内存
缺点:
1 取值不如按照索引取值方便
2 一次性,只能往后取,不能回退
3 无法获取长度
迭代器的应用:
1.提供了一种不依赖索引的统一的迭代方法
2. 惰性计算,比如取文件的每一行
4、迭代器对象
可进行.__next__()操作的为可迭代对象
#print(isinstance(str1,Iterator)),判断str1是否是迭代器对象
二、生成器
生成器函数:函数体内包含有yield关键字
生成器:生成器函数执行的结果是生成器
yield的功能:
1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的
生成器应用举例
- #模拟tail -f a.txt
- import time
- def tail(filepath,encoding):
- '''从文件读取最后一行内容'''
- with open (filepath,encoding='utf-8') as f:
- f.seek(,)
- while True:
- line=f.readline()
- if line:
- yield line
- else:
- time.sleep(0.5)
- def grep(lines,pattern):
- '''guolv内容,如果有就返回'''
- for line in lines:
- if pattern in line:
- #print(line)
- yield line
- g=tail('homework01.txt')
- g2=grep(g,'err0r')
- g3=grep(g2,'')
- for i in g3:
- print(i)
用生成器模拟tail -f |grep 'error'功能
三、列表解析
python的三元运算格式如下:
result=值1 if x<y else 值2 这个是什么意思呢,就是结果=值1 if 条件1 else 值2
列表解析:
用三元表达式,将结果写入列表,即为列表解析
列表解析实例:
- 要求:列出1~10所有数字的平方
- ####################################################
- 、普通方法:
- >>> L = []
- >>> for i in range(,):
- ... L.append(i**)
- ...
- >>> print L
- [, , , , , , , , , ]
- ####################################################
- 、列表解析
- >>>L = [ i** for i in range(,)]
- >>>print L
- [, , , , , , , , , ]
- 要求:列出1~10中大于等于4的数字的平方
- ####################################################
- 、普通方法:
- >>> L = []
- >>> for i in range(,):
- ... if i >= :
- ... L.append(i**)
- ...
- >>> print L
- [, , , , , , ]
- ####################################################
- 、列表解析
- >>>L = [ i** for i in range(,) if i >= ]
- >>>print L
- [, , , , , , ]
- 要求:列出"/var/log"中所有已'.log'结尾的文件
- ##################################################
- 、普通方法
- >>>import os
- >>>file = []
- >>> for file in os.listdir('/var/log'):
- ... if file.endswith('.log'):
- ... file.append(file)
- ...
- >>> print file
- ['anaconda.ifcfg.log', 'Xorg.0.log', 'anaconda.storage.log', 'Xorg.9.log', 'yum.log', 'anaconda.log', 'dracut.log', 'pm-powersave.log', 'anaconda.yum.log', 'wpa_supplicant.log', 'boot.log', 'spice-vdagent.log', 'anaconda.program.log']
- ##################################################
- .列表解析
- >>> import os
- >>> file = [ file for file in os.listdir('/var/log') if file.endswith('.log') ]
- >>> print file
- ['anaconda.ifcfg.log', 'Xorg.0.log', 'anaconda.storage.log', 'Xorg.9.log', 'yum.log', 'anaconda.log', 'dracut.log', 'pm-powersave.log', 'anaconda.yum.log', 'wpa_supplicant.log', 'boot.log', 'spice-vdagent.log', 'anaconda.program.log']
四、生成器解析
- #############################################
- egg_list=['鸡蛋%s' %i for i in range()] #列表解析
- #############################################
- laomuji=('鸡蛋%s' %i for i in range())#生成器表达式
- print(laomuji)
- print(next(laomuji)) #next本质就是调用__next__
- print(laomuji.__next__())
- print(next(laomuji))
总结:
1.把列表解析的[]换成()得到的就是生成器表达式
2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。
例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:
sum(x ** 2 for x in xrange(4))
而不用多此一举的先构造一个列表:
sum([x ** 2 for x in xrange(4)])
Python基础(8)_迭代器、生成器、列表解析的更多相关文章
- 函数---迭代器&生成器&列表解析&三元表达式
可迭代对象:obj.__iter__ 迭代器:iter1=obj.__iter() 1iter1.__next__ 2iter2.__next__ 迭代器: 优点:不依赖索引 ...
- python基础6之迭代器&生成器、json&pickle数据序列化
内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...
- Python 迭代器和列表解析
Python 迭代器和列表解析 1)迭代器 一种特殊的数据结构,以对象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可 ...
- Python(五)之迭代器和列表解析
Python迭代器和列表解析 迭代器 例如: In [1]: l1 = [1,2,3,4,5] dir(i1)可以看到内置方法'__iter__' 生成一个迭代器: l1.__iter__,或i2 = ...
- Python装饰器、迭代器&生成器、re正则表达式、字符串格式化
Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...
- 第五篇:python基础之循环结构以及列表
python基础之循环结构以及列表 python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.pyth ...
- Python自动化运维之7、生成器、迭代器、列表解析、迭代器表达式
迭代器和生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...
- 3、Python迭代器、列表解析及生成器(0530)
1.动态语言 sys.getrefcount() //查看对象的引用计数 增加对象的引用计数场景 对象创建时:以赋值的方式,创建变量名的同时就会创建变量 将对象添加进容器时:类似list.app ...
- python基础篇_005_迭代器和生成器
Python迭代器和生成器 1.迭代器 迭代:可以将某个数据集内的数据“一个挨着一个的取出来” for i in range(1, 10, 2): # in 后面的对象必须是一个可迭代的 print( ...
- python学习-迭代器,列表解析和列表生成式
迭代器为类序列对象提供了一个类序列的接口.Python 的迭代无缝的支持序列对象,而且还允许程序猿迭代非序列类型,包括用户定义的对象. 迭代器是一个next()方法的对象,而不是通过索引计数.当需要下 ...
随机推荐
- class文件简介及加载
Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中, ...
- python模块学习之os
16.1. os-复杂的操作系统接口 Source code: Lib/os.py 该模块提供了使用操作系统相关功能的便携式方法. 如果您只想读或写一个文件,请参阅open(),如果要操作路径,请参阅 ...
- html-解决乱码问题
1.创建HTML时,需将文件编码设置为UTF-8: 2.需要在<head>元素下,借用<meta>元素设置内容的编码: 1)文件的编码:在webstorm中设置文件编码的问题: ...
- VM603:1 Uncaught SyntaxError: Unexpected token o in JSON at position 1
再用JQuery解析json的时候出现了这样一个问题 VM603: Uncaught SyntaxError: Unexpected token o 通过查阅资料发现,是由于解析json文件的时候解析 ...
- YII安装步骤(windows)
一.首先你得下个YII框架的源码 :下载地址:http://www.yiiframework.com/download/ 二.把下载到的源码解压放到一个PHP可访问的位置:如我的 F:\site(已具 ...
- Tomcat无法启动:Server Tomcat v8.5 Server at localhost failed to start
Tomcat无法启动 项目状态 Maven项目:基础环境(依赖,基本配置文件)搭建完成,前端页面都导入,部署测试项目环境,出现该问题 问题情景: 1.弹窗提示Tomcat启动失败 2.Console ...
- yii rule
https://blog.csdn.net/ljfrocky/article/details/46373691 http://www.yiichina.com/tutorial/997 http:// ...
- PHP中如何配置smarty框架实现PHP代码和HTML代码分离
header('Cache-Control:Private');//保留用户填写的信息 session_start();//开启缓存 define('MYCMS','UTF-8');//定义网站编码常 ...
- js 时间戳转换为指定的日期格式
function formatDate(date, fmt) { if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFul ...
- Javascript中的函数中的this值
看下面这段代码会在控制台上输出什么内容? <script> var url="fang.com"; var obj={ url:"soufun.com&quo ...