Python基础(8)_迭代器、生成器、列表解析

一、迭代器

1、什么是迭代

  1 重复
  2 下次重复一定是基于上一次的结果而来

1 l=[1,2,3,4]
2 count=0
3 while count < len(l):
4     print(l[count])
5     count+=1
迭代举例

 

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保存的

生成器应用举例

 

 1 #模拟tail -f a.txt
 2 import time
 3 def tail(filepath,encoding):
 4     '''从文件读取最后一行内容'''
 5     with open (filepath,encoding='utf-8') as f:
 6         f.seek(0,2)
 7         while True:
 8             line=f.readline()
 9             if line:
10                 yield line
11             else:
12                 time.sleep(0.5)
13 def grep(lines,pattern):
14     '''guolv内容,如果有就返回'''
15     for line in lines:
16         if pattern in line:
17             #print(line)
18             yield line
19 
20 g=tail('homework01.txt')
21 g2=grep(g,'err0r')
22 g3=grep(g2,'404')
23 for i in g3:
24     print(i)
用生成器模拟tail -f |grep 'error'功能

三、列表解析

python的三元运算格式如下:

  result=值1 if x<y else 值2    这个是什么意思呢,就是结果=值1 if 条件1 else 值2

列表解析:

  用三元表达式,将结果写入列表,即为列表解析

 

 

列表解析实例:

 1 要求:列出1~10所有数字的平方
 2 ####################################################
 3 1、普通方法:
 4 >>> L = []
 5 >>> for i in range(1,11):
 6 ...     L.append(i**2)
 7 ... 
 8 >>> print L
 9 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
10 ####################################################
11 2、列表解析
12 >>>L = [ i**2 for i in range(1,11)]
13 >>>print L
14 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
 1 要求:列出1~10中大于等于4的数字的平方
 2 ####################################################
 3 1、普通方法:
 4 >>> L = []
 5 >>> for i in range(1,11):
 6 ...     if i >= 4:
 7 ...         L.append(i**2)
 8 ... 
 9 >>> print L
10 [16, 25, 36, 49, 64, 81, 100]
11 ####################################################
12 2、列表解析
13 >>>L = [ i**2 for i in range(1,11) if i >= 4 ]
14 >>>print L
15 [16, 25, 36, 49, 64, 81, 100]
 1 要求:列出"/var/log"中所有已'.log'结尾的文件
 2 ##################################################
 3 1、普通方法
 4 >>>import os
 5 >>>file = []
 6 >>> for file in os.listdir('/var/log'):
 7 ...     if file.endswith('.log'):
 8 ...         file.append(file)
 9 ... 
10 >>> print file
11 ['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']
12 ##################################################
13 2.列表解析
14 >>> import os
15 >>> file = [ file for file in os.listdir('/var/log') if file.endswith('.log') ]
16 >>> print file
17 ['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']

四、生成器解析

 1 #############################################
 2 egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析
 3 
 4 #############################################
 5 
 6 laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式
 7 print(laomuji)
 8 print(next(laomuji)) #next本质就是调用__next__
 9 print(laomuji.__next__())
10 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)])

 

 

转载于:https://www.cnblogs.com/hedeyong/p/7028303.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angularjs2-EXCEPTION: Response with status: 200 Ok for URL:

利用jsonp跨域请求数居&#xff0c;报错 core.umd.js:3070 EXCEPTION: Response with status: 200 Ok for URL: 参考&#xff1a;stackoverflow 未解决。。。脑仁疼。。。有小伙伴也碰到过这个问题么&#xff1f; 16/11/30 问题解决 1.服务器端API允许跨域访问(返回的数据添加允…

图片无法删除要计算机管理员,存在桌面的图片删不掉,怎么处理?提示是需要管理员权限。...

将下面代码复制到记事本里&#xff0c;重命名为1.bat&#xff0c;然后打开&#xff0c;这时你右键图片会出现管理员取得所有权&#xff0c;然后取得所有权后再删除试试Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\runas]管理员取得所有权NoWorkingDirecto…

Java对象序列化的本机C / C ++类似性能

您是否曾经希望过像使用C 这样的本地语言将Java对象转换成字节流一样快的速度&#xff1f; 如果您使用标准的Java序列化&#xff0c;您可能会对性能感到失望。 Java序列化的目的是与尽可能快而紧凑地序列化对象的目的截然不同。 为什么我们需要快速紧凑的序列化&#xff1f; 我…

WebStrom Sass 编译配置 windows

第一步&#xff1a; 先安装Ruby下载 一路next 安装完成后打开开始菜单 打开后输入 gem install sass sass -v 出现版本号说明成功 第二部配置webstorm 在webstorm中settings中搜索file watchers工具&#xff0c;在此工具中添加一个scss的watcher 确定&#xff0c;打开一个scss…

非本地跳转之setjmp与longjmp

非本地跳转(unlocal jump)是与本地跳转相对应的一个概念。 本地跳转主要指的是类似于goto语句的一系列应用&#xff0c;当设置了标志之后&#xff0c;可以跳到所在函数内部的标号上。然而&#xff0c;本地跳转不能将控制权转移到所在程序的任意地点&#xff0c;不能跨越函数&am…

清华计算机自主招生试题,2017年清华大学自主招生笔试题

2017年清华大学自主招生笔试题2017高考结束后&#xff0c;全国各大高校自主招生面试开始了&#xff0c;以下是百分网小编搜索整理的关于2017年清华大学自主招生笔试题&#xff0c;供各位参考&#xff0c;希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!…

扩展剂:模式还是反模式?

扩展器模式在最近几年变得很流行&#xff0c;甚至已经在OSGi标准&#xff08;例如&#xff0c;蓝图服务和Web应用程序规范&#xff09;中使用。 在处女座&#xff0c;我们从一开始就与扩展程序一起工作&#xff0c;但是尽管它们具有优势&#xff0c;但它们仍有一些明显的缺点。…

python html格式编码

web应用如用到ace等网络编辑器的时候&#xff0c;如要支持html,xml等格式的文件编辑&#xff0c;输入ace 的文本内容必须先进行html格式编码&#xff1a; def html_escape(content): import cgi return cgi.escape(content)转载于:https://www.cnblogs.com/zhouxiaoming/p/703…

字符串替换

题目: 给定一个英文的字符串, 要求你将其中的元音删除掉, 返回新的字符串. 例如:"This website is for losers LOL!" --> "Ths wbst s fr lsrs LL!" 当看到这个题目的时候, 第一个想起的就是re模块的正则表达式. 不过由于最近使用过字符串的replace方…

小学计算机技术指导纲要,《中小学信息技术课程指导纲要(试行)》

《中小学信息技术课程指导纲要(试行)》2000年11月教育部颁发的《中小学信息技术课程指导纲要(试行)》教学目标&#xff1a;1、 增强信息意识&#xff0c;了解信息技术的发展变化及其对工作和社会的影响。2、 初步了解计算机基本工作原理&#xff0c;学会使用与学习和实际生活直…

JavaFX 2.0布局窗格– FlowPane和TilePane

FlowPanes和TilePanes是不错的布局窗格&#xff0c;如果您想一个接一个地连续地水平或垂直地布局子级&#xff0c;则可以。 它们彼此非常相似&#xff0c;因为它们都将子级布置成列&#xff08;在水平Flow / TilePane的情况下&#xff09;并按其宽度或行&#xff08;在垂直Flow…

EasyRMS录播管理服务器项目实战:windows上开机自启动NodeJS服务

本文转自EasyDarwin开源团队成员Penggy的博客&#xff1a;http://www.jianshu.com/p/ef840505ae06 近期在EasyDarwin开源团队开发一款基于EasyDarwin在录播服务器EasyRMS过程中,我采用node作为EasyRMS录播服务器录播管理服务器的开发平台,基于node开发关于设备管理,录像计划,录…

windows10搭建django1.10.3+Apache2.4

很多教程都是在linux上搭建&#xff0c;windows上似乎天生不太适合&#xff0c;但是我还是愿意试试这个坑。 首先 交代一下自己的环境 python3.5.2 64位 django 1.10.3 apache 2.4 64位 windows 10 重点在apache上。 python 和django 相信有兴趣看这篇文章的基本上也都已经了解…

深入理解计算机系统 视频教程,深入理解计算机系统1

第一章 计算机系统漫游代码段的生命周期hello.c#include int main(){printf("hello world!\n");return 0;}1.1 前序源程序(源文件)实际上就是一个由0和1组成的位(又成比特bit)序列,8个位被组组成一组,称为字节。每个字节表示程序中的某些文本字符(大部分的现代计算机…

Java与iOS对话:Java对象与Apple plist序列化

我很高兴地宣布我的第一个开源项目java-plist-serializer可以帮助您将Java&#xff08;尤其是基于Spring的应用程序&#xff09;与iOS应用程序集成。 背景 我正在将Java Webapp作为后端并且客户端是iOS设备的项目。 最近&#xff0c;我收到了创建Web服务的任务&#xff0c;该服…

web.cofing(新手必看)

花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法。很适合新手参看&#xff0c;由于Web.config在使用很灵活&#xff0c;可以自定义一些节点。所以这里只介绍一些比较常用的节点。 <?xml version"1.0"?> <!--注意: 除了手动编辑此文件以外&…

MIPS下CPU和RAM的数据流动情况详解

这是计算机硬件间的数据路径&#xff08;即数据流动的路径&#xff09;&#xff0c;下面将较详细分析此图&#xff1a; PC&#xff08;program counter&#xff0c; 程序计数器&#xff09;是一个用于记录当前计算机正在执行的指令的地址的寄存器&#xff08;register&#xff…

计算机乱程序怎么办,我的电脑程序乱了怎么办

我的电脑程序乱了&#xff0c;想用光盘恢复一下系统的修复安装方法第一种方法&#xff1a;1、点击“开始”菜单&#xff0c;点击“运行”2、输入CMD回车3、输入命令SFC/SCANNOW4、插入系统光盘系统会自动将硬盘中的系统文件于系统盘中的文件比较并进行修复如果不行&#xff0c;…

【计算机网络】网络层——IP协议

目录 一. 基本概念 二. 协议报文格式 三. 网段划分 1. 第一次划分 2. CIDR方案 3. 特殊的IP地址 四. IP地址不足 1. 私有IP和公网IP 2. DHCP协议 3. 路由器 4. NAT技术 内网穿透(NAT穿透) 五. 路由转发 路由表生成算法 结束语 一. 基本概念 IP指网络互连协议…

完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第2部分

托管豆 这篇文章是本教程第1部分的继续。 在“ com.mb”包中&#xff0c;您将需要创建以下类&#xff1a; package com.mb;import org.primefaces.context.RequestContext;import com.util.JSFMessageUtil;public class AbstractMB {private static final String KEEP_DIALOG…