一、迭代器

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)_迭代器、生成器、列表解析的更多相关文章

  1. 函数---迭代器&生成器&列表解析&三元表达式

    可迭代对象:obj.__iter__   迭代器:iter1=obj.__iter() 1iter1.__next__ 2iter2.__next__   迭代器: 优点:不依赖索引         ...

  2. python基础6之迭代器&生成器、json&pickle数据序列化

    内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...

  3. Python 迭代器和列表解析

    Python 迭代器和列表解析 1)迭代器 一种特殊的数据结构,以对象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可 ...

  4. Python(五)之迭代器和列表解析

    Python迭代器和列表解析 迭代器 例如: In [1]: l1 = [1,2,3,4,5] dir(i1)可以看到内置方法'__iter__' 生成一个迭代器: l1.__iter__,或i2 = ...

  5. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  6. 第五篇:python基础之循环结构以及列表

    python基础之循环结构以及列表   python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.pyth ...

  7. Python自动化运维之7、生成器、迭代器、列表解析、迭代器表达式

    迭代器和生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...

  8. 3、Python迭代器、列表解析及生成器(0530)

    1.动态语言 sys.getrefcount()    //查看对象的引用计数 增加对象的引用计数场景 对象创建时:以赋值的方式,创建变量名的同时就会创建变量 将对象添加进容器时:类似list.app ...

  9. python基础篇_005_迭代器和生成器

    Python迭代器和生成器 1.迭代器 迭代:可以将某个数据集内的数据“一个挨着一个的取出来” for i in range(1, 10, 2): # in 后面的对象必须是一个可迭代的 print( ...

  10. python学习-迭代器,列表解析和列表生成式

    迭代器为类序列对象提供了一个类序列的接口.Python 的迭代无缝的支持序列对象,而且还允许程序猿迭代非序列类型,包括用户定义的对象. 迭代器是一个next()方法的对象,而不是通过索引计数.当需要下 ...

随机推荐

  1. Stage3D&Away3D整理ppt

    资料下载地址:http://files.cnblogs.com/xignzou/away3D%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0%E5%88%86%E4%BA%AB ...

  2. Python内置函数之len()

    len(s)用来判断对象的长度. 需要说明的是,整型,布尔等是没有长度这一说法的.字符串.字典.列表和元组都有长度. 例子: >>> len() Traceback (most re ...

  3. 设置一个label显示多种颜色,多种字体大小

    UILabel* label = [[UILabel alloc] init]; label.frame = CGRectMake(0, 100, 200, 100); label.textColor ...

  4. Razor 3、MVC 5

    Razor 3 需要vs 2012 update 4 才可以 需要装一个 Microsoft ASP.NET and Web Tools 2013.1 才会有 MVC 5

  5. Web应用程序使用Hibernate

    在本文中,我们将学习使用hibernate创建一个Web应用程序. 对于创建Web应用程序,我们使用JSP表示逻辑层,使用Bean类表示数据,以及使用DAO类操作数据库.在hibernate中创建简单 ...

  6. Eclipse 添加书签

    Eclipse 添加书签 关于书签 Eclipse 中可以在编辑器的任意一行添加书签. 您可以使用书签作为提示信息,或者使用书签快速定位到文件中的指定的行. 添加书签 如果你想设置书签,你只需要在垂直 ...

  7. 003android初级篇之【转】Android开发中颜色的定义方法

    正好用到颜色的定义,但脑子里没有记住具体,转载一篇加强印象 1.使用Color类的常量,如: int color = Color.BLUE; // 创建一个蓝色 是使用Android提供的颜色 int ...

  8. Python 邮箱

    #coding:utf-8from email.header import Headerfrom email.mime.text import MIMETextfrom email.utils imp ...

  9. hdu 3667 (拆边 mcmf)

    注意题目中 边的容量 <= 5.可以把费用权值 a *f ^2化归成 a * f2, 即第一条边费用为 1 * a, 第二条 为 (4 - 1) * a, 第三条为 (9  - 4) * a.. ...

  10. restful demo 演示; jquery min1.1;

    [说明]上午建立了一个restful风格的一个测试,运行通过:下午试了试postman,想看看http请求的具体过程,但是chrome浏览器的network面板也可以查看,并且很方便,就索性用它了 一 ...