python基础之迭代与解析
先简单看一下文件迭代器
>>> f=open('file1')
>>> f.readline()
"'aaa','bbb','ccc'\n"
>>> f.readline()
'asdfasdf\n'
>>> f.readline()
'asdfasdf\n'
>>> f.readline()
'asdfasdf\n'
现在,有和个next()方法,差不多有同样的效果,每次调用时,返回文件中的下一行。
>>> f.seek(0)
0
>>> next(f)
"'aaa','bbb','ccc'\n"
>>> next(f)
'asdfasdf\n'
>>> next(f)
'asdfasdf\n'
>>> next(f)
'asdfasdf\n'
这个接口就是python中所谓的迭代协议,有__next__方法的对象会前进到下一个结果(上面的next()方法其实就是调用的__next__()),而在结果的末尾时,则会引发StopIteration。
在python中,任何对象都认为是可迭代的。任何这类对象都能被for循环或其他迭代工具遍历,因为所有的迭代工具内部工作起来都是在调用 __next__(),并捕捉StopIteration异常离开。
而列表和很多其他内置对象,不是自身的迭代器,所以不能直接用next()方法,必须调用iter启动迭代。
>>> L = [1,2,3,4]
>>> next(L)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not an iterator
>>> I = iter(L)
>>> next(I)
1
>>> next(I)
2
>>> next(I)
3
列表解析入门
在之前,遍历列表的时候,可以使用for循环,但是现在,可以用列表解析,需要更少的代码,并且运行的更快。
>>> L=[1,2,3,4]
>>> for i in range(len(L)):
... L[i]+=10
...
>>> L
[11, 12, 13, 14]
>>>
>>> L = [x+10 for x in L]
>>> L
[21, 22, 23, 24]
列表解析写在一个方括号中,因为它最终是构建一个新的列表的一种方式。它以一个任意的表达式开始(在上面的例子中是x+1),后面跟着for循环部分,声明了循环变量以及一个可迭代对象(for x in L)
运行列表解析时,python解释器在内部执行一个L的迭代,按顺序将元素赋值给x,并对各元素运行左边的表达式,将结果收集起来,形成新的列表。
扩展列表解析语法
在列表解析中还可以加上if判断
>>> L
[21, 22, 23, 24]
>>>
>>> I = [x for x in L if x%2==0 ]
>>> I
[22, 24]
在上面的代码中,只留下能被2整除的元素。
生成器函数
一般来说,生成器函数和常规函数一样,但是使用yield语句,一次返回一个结果,在每个结果之间挂起和继续它们的状态。当它创建时,自动实现迭代协议。生成器也可以有return语句,用来终止生成器。
>>> def func(N):
... for i in range(N):
... yield i
...
>>> type(func)
<class 'function'>
>>> f = func(10)
>>> f
<generator object func at 0x7f9c112b3c60>
>>> next(f)
0
>>> next(f)
1
>>> next(f)
2
send方法
>>> def func(N):
... for i in range(N):
... r = yield i
... print(r)
...
>>> f = func(10)
>>> f.__next__()
0
>>> f.send(10)
10
1
>>> f.send(20)
20
2
>>> f.__next__()
None
3
通过send方法发送一个值给生成器,它会先执行后面的代码,然后恢复生成器的代码,并且生成器返回了send的值。如果在生成器结束之前调用 next()方法,yield返回None。
生成器表达式
它类似于上面的列表解析,不同的是,它一次返回一个结果,而不是一次返回整个列表
>>> G = (x for x in "spam")
>>> G
<generator object <genexpr> at 0x7f9c112b3d80>
>>> next(G)
's'
>>> next(G)
'p'
>>> next(G)
'a'
>>> next(G)
'm'
>>> next(G)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
通过上面的代码可以看出,生成器表达式和列表解析的创建方式几乎一样,只是中括号换成了小括号。
python基础之迭代与解析的更多相关文章
- python 基础 切片 迭代 列表生成式
对list 进行切片 如列表 L = ['Adam', 'Lisa', 'Bart', 'Paul'] L[0:3] ['Adam', 'Lisa', 'Bart'] L[0:3]表示,从索引0开始取 ...
- Python基础:08列表解析与生成器表达式
一:列表解析 列表解析(List comprehensions)来自函数式编程语言Haskell .它可以用来动态地创建列表.它在 Python 2.0 中被加入. 列表解析的语法: [exp ...
- Python基础部分的疑惑解析——pycharm(4)
PyCharm部分设置: 1.安装后破解 2.创建的项目project实际上就是文件夹,可以在右键--show in explorer显示文件夹 3.右键-new--directory是建文件夹 ...
- Python基础部分的疑惑解析——运算符和数据类型(3)
补充上一篇: #! /user/bin/env python 代码内声明这一个就可以用1.py类似的文件直接执行,但是要在linux内加权限, 不需要在前面加python 1.py执行了.文件可以 ...
- Python基础部分的疑惑解析(2)
变量: 变量名由 字母.数字.下划线构成,数字不能做为开头 不能用关键字:另外一些内置的方法也别用 推荐使用下划线命名间两个单词user_id 变量在最后底层处理的时候没什么意义,但是在命名的时候有利 ...
- Python基础部分的疑惑解析(1)
Python介绍: 是一种全能的语言,虽然执行效率低,但是开发效率高 现在也存在多种版本,IPYTHON,JPYTHON,但最重要的是CPYTHON,其他都是作用于各种语言的粘合剂版本,执行效率低,C ...
- Python基础(迭代)
# from collections import Iterable#collections模块的Iterable类型判断 # dict1 = {'a':111,'b':222,'c':333} # ...
- Python基础部分的疑惑解析——运算符和数据类型(5)
运算符 最后得到数值的: 算数运算符 赋值运算符 最后得到布尔值的: 成员运算符:in not in 逻辑运算符 and or 没有优先级就是按顺序执行 比较运算符 数据类型 1.整 ...
- python基础---递归函数真题解析
方法一.有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中. 即: {'k ...
随机推荐
- jquery'中的匿名函数
//jquery'中的匿名函数 (function(){ alert("this is a test"); })(); //和这个基于jQuery的比较下: $(funct ...
- H5页面在QQ和微信上分享,为什么不能自定义设置图片和摘要?
[记录]title标签中的页面标题为抓取标题.body内第一个img标签内的图片为自动抓取缩略图,图片宽高要大于300,如果不希望显示出来,将标签宽高皆设置为0.摘要显示为来源链接,如需自定义需要通过 ...
- Vigenère密码
来源 NOIP2012复赛 提高组 第一题 描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法--Vigenère密码.Vigenère密码的加密解密算法简单易用 ...
- C#将exe运行程序嵌入到自己的winform窗体中
以下例子是将Word打开,然后将它嵌入到winform窗体中,效果如下图:C将exe运行程序嵌入到自己的winform窗体中 - kingmax_res - iSport注意:该方法只适用于com的e ...
- mysql密码重置
忘记了Mysql的root用户密码,尝试连接时提示: mysqladmin: connect to server at 'localhost' failed ERROR : Access denied ...
- [Maven] - 安装与Eclipse搭建
Maven的具体参考书可以看:<Maven实战> 下载maven可以到:http://maven.apache.org/ Maven的eclipse基本使用可以在这里看到:http://w ...
- Delphi、C C++、Visual Basic数据类型的对照 转
Delphi.C C++.Visual Basic数据类型的对照 变量类型 Delphi C/C++ Visual Basic 位有符号整数 ShortInt char -- 位无符号整数 Byte ...
- Python与PHP通过XMLRPC进行通信
Python与PHP通过XMLRPC进行通信:服务器端用Python,客户端用PHP. 服务器端:xmlrpc_server.py #!/usr/bin/python # coding: UTF-8 ...
- 项目管理-Kick OFF 简称KO
KO的内容包括以下几个过程: 1.项目背景 我们项目在哪里?说过去,做项目之前的“悲惨境地”,明确问题根源在哪里,明白为什么要做这个项目. 2.项目意义.目的与目标 我们项目去哪里?说将来,项目完成之 ...
- ife-task0003学习收获总结
+ 编写可维护的css原则是,尽量减少改动时要编辑的地方(减少代码重复). + CSS布局奇淫技巧之-高度自适应 高度自适应:通过绝对定位来解决高度自适应的问题,元素不设置高度,设置绝对定位,将top ...