返回目录

本篇索引

(1)while循环与for循环

(2)一些迭代工具

(3)列表推导与序列解包

(4)迭代器

(1)while循环与for循环

while仅能用于普通循环,而for除了可以做循环外,还可以遍历序列、集合、字典、迭代器等。

需要注意的是,在类似:for i in somelist: 的循环中,迭代变量 i 的作用域并非for语句私有,循环结束后迭代变量依然保留最后一个值。有时候for可以用于直接迭代对象,如下2个例子所示:

直接迭代字典

for key in d:    # 直接对字典进行迭代相当于 for key in d.keys():
print(key, d[key])

直接迭代文件

f = open('a.txt')
for line in f: # 迭代文件对象中的每一行
print(line)

● break

可用于跳出while或for循环。break和下面的continue语句仅应用于正在执行的最内层循环,如果要跳出多层嵌套循环结构,可使用raise()抛出异常。

● continue

结束本循环的当前轮,跳到本循环的下一轮开始。

● else

与while或for循环配对的else代码段,仅在本循环中没有调用过break时执行。

for i in range(0,100):
if i > 100:
break;
else:
print('running else.') # 结果为:running else.

(2)一些迭代工具

● 并行迭代

使用内建zip()函数,它可以把两个序列“压缩”在一起,返回一个元组列表。 当两个序列长度不等时,以短的那个迭代完就会停止。zip()还支持同时对多个(3个及以上)列表进行迭代。

a = 'abc'
b = [1,2,3]
for x,y in zip(a,b):
print(x,y)
# 结果每次迭代依次显示:a 1、b 2、c 3

以上代码相当于:

for i in range(min(len(a),len(b)):
print(a[i],b[i])

● 编号迭代

使用内建的enumerate()函数,可以在迭代的同时,同时获取迭代的次数索引。

a = 'abc'
for i,x in enumerate(a):
print('i=%d,x=%s' %(i,x))
# 结果依次显示:i=0,x=a、i=1,x=b、i=2,x=c

(3)列表推导与序列解包

● 列表推导(list comprehension)

“列表推导”是利用for循环来快速创建新列表的一种方法。

a. 基本用法:

[ x运算表达式 for x in 迭代器 ]

举例:

[x*2 for x in range(5)]    # 结果生成新序列:[0,2,4,6,8]

b. 条件判断用法:

每次迭代时,只有当“条件表达式”的值为真时,才会对x进行运算,并将结果放入新序列。语法如下:

[ x运算表达式 for x in 迭代器 if 条件表达式 ]

举例:

[x for x in range(10) if x%2]    # 取出range(10)范围内的所有奇数,结果为:[1,3,5,7,9]

c. 完整用法:

可以同时使用多个嵌套的for循环并对每个循环使用if条件表达式,语法如下:

[ i_1,i_2,...,i_n运算表达式 for i_1 in iter1 if 条件表达式1
for i_2 in iter2 if 条件表达式2
......
for i_n in itern if 条件表达式n ]

以上语法大致相当于如下等价代码:

s = []
for i_1 in iter1:
if 条件表达式1:
for i_2 in iter2:
if 条件表达式2:
......
for i_n in itern:
if 条件表达式n:
s.append(i_1,i_2,...,i_n运算表达式)

举例:

a = 'abc'
b = [1,2,3]
[(i1,i2) for i1 in a
for i2 in b if i2 % 2]
# 结果为:[('a',1), ('a',3), ('b',1), ('b',3), ('c',1), ('c',3) ]

● 迭代序列解包(sequence unpacking)

当可迭代对象返回元组时,这个特性比较有用。例如需要获取字典中的键-值对时,可使用序列解包方法:

for k,v in d.items():   # 每次循环同时取出字典中的键与值,分别放入k与v中
print(k,v)

(4)迭代器

可以使一个普通对象也支持迭代操作,此时需要为这个对象实现__iter__()方法和__next__()方法。

● __iter__()方法:

本方法要求返回一个迭代器对象(通常可直接返回对象自身,详见下例)。

● __next__()方法:

__next__()方法由刚才通过__iter__()方法返回的迭代器对象进行调用,其作用是计算并返回迭代的下一个对象。当迭代器已迭代完所有的内容时,__next__()方法应该引发一个StopIteration异常,以通知外部的调用者结束迭代。

以下代码实现一个类似于 “列表[1,2,3,4,5]” 的迭代器:

class MyIterator:
v = 0
def __iter__(self):
return self
def __next__(self):
self.v += 1
if self.v > 5:
raise StopIteration
return self.v myiter = MyIterator()
for i in myiter:
print(i) # 运行结果为,依次显示:1、2、3、4、5

● 迭代的外部原理:

上例中,当运行for语句进行迭代时,等效于运行以下代码:

_iter = myiter.__iter__()
while 1:
try:
i = _iter.__next__()
except StopIteration:
break
print(i) # 本句即为 for 循环中用户自己写的循环内容

从上面的代码中可以看到,迭代是使用__iter__()返回的对象来调用__next__()方法的,所以可以不一定是self。另外,内置函数iter()可以从可迭代的对象中获得迭代器,内置函数next()可以自动访问可迭代对象的__next__()方法。

因此,上面的第1行和第4行语句可等效为:

_iter = iter(s)    # 相当于 _iter = myiter.__iter__()
i = next(_iter) # 相当于 i = _iter.__next__(),甚至直接写成:i = next(myiter) 也是可以的

● 将迭代和序列互相转换:

用list()的构造方法能显式地将迭代器转换为列,也能用内置函数iter()将序列转换为迭代器。

# ......
# 前面已定义MyIterator类 myiter = MyIterator()
s = list(myiter)
print(s) # 结果为:[1,2,3,4,5]

返回目录

Python语法速查: 6. 循环与迭代的更多相关文章

  1. Python语法速查: 4. 字符串常用操作

    返回目录 (1)字符串常用方法 Python3中,字符串全都用Unicode形式,所以省去了很多以前各种转换与声明的麻烦.字符串属于序列,所有序列可用的方法(比如切片等)都可用于字符串. 注意:字符串 ...

  2. Python语法速查:目录

    1. 数据类型与内置函数 2. 列表.元组.字典.集合操作 3. 字符串格式化 4. 字符串常用操作 5. 运算符.math模块.表达式 6. 循环与迭代 7. 函数基础 8. 类与对象 9. 函数进 ...

  3. Python语法速查: 12. 文件与输入输出

    返回目录 (1)文件基本操作 ● 文件常用操作 内置函数或方法 描述 open(name [,mode [,buffering]]) 内置函数.用来打开文件,返回一个文件对象(file对象).详见下述 ...

  4. Python语法速查: 14. 测试与调优

    返回目录 本篇索引 (1)测试的基本概念 (2)doctest模块 (3)unittest模块 (4)调试器和pdb模块 (5)程序探查 (6)调优与优化 (1)测试的基本概念 对程序的各个部分建立测 ...

  5. Python语法速查: 15. 常用数据结构

    返回目录 本篇索引 (1)array (2)bisect (3)deque (4)defaultdict (5)namedtuple (6)heapq (7)itertools (1)array ar ...

  6. Python语法速查: 7. 函数基础

    返回目录 (1)函数基本 ● 函数是第一类对象 Python中万物皆对象,所有对象都是第一类的(first class),函数也不例外,也是第一类对象.既然是对象,那就可以当作普通的对象数据处理,比如 ...

  7. Python语法速查: 20. 线程与并发

    返回目录 本篇索引 (1)线程基本概念 (2)threading模块 (3)线程间同步原语资源 (4)queue (1)线程基本概念 当应用程序需要并发执行多个任务时,可以使用线程.多个线程(thre ...

  8. Python语法速查: 13. 操作系统服务

    返回目录 本篇索引 (1)sys模块 (2)os模块 (3)与Windows相关模块 (4)subprocess模块 (5)signal模块 (1)sys模块 sys模块用于Python解释器及其环境 ...

  9. Python语法速查: 1. 数据类型与内置函数

    返回目录 (1)常用内置数据类型 分类 类型名称 描述 数字 int 整数 float 浮点数 complex 复数 bool 布尔值 序列 str 字符串(不可变序列) list 列表 tuple ...

随机推荐

  1. 没想到Spring Boot居然这么耗内存,有点惊讶

    Spring Boot总体来说,搭建还是比较容易的,特别是Spring Cloud全家桶,简称亲民微服务,但在发展趋势中,容器化技术已经成熟,面对巨耗内存的Spring Boot,小公司表示用不起.如 ...

  2. localStorage和sessionStorage的共同点和区别

    共同点: 1.localStorage和sessionStorage都是用来存储客户端临时信息的对象. 2.他们均只能存储字符串类型的对象. 3.不同浏览器无法共享localStorage或sessi ...

  3. SpringCloud(八):springcloud遇到的坑总结

    spring boot 版本演信息: 文章链接:https://github.com/spring-projects/spring-boot/releases?after=v2.0.0.M3 http ...

  4. 剑指offer笔记面试题8----二叉树的下一个节点

    题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右子节点的指针,还有一个指向父节点的指针. 测试用例: 普通二叉树(完全二叉树,不完全二叉树). ...

  5. CSS入门(边框、轮廓、元素的分类、盒子模型的三个构成部分)

    一.边框属性 作用:给元素加上一个边框 第一种: border-top border-bottom border-left boder-right 三个属性值: 粗细 线型 颜色 第二种: borde ...

  6. ES6-WeakSet数组结构

    WeakSet 也会去重 总结: 1.成员都是对象: 2.成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏: 3.不能遍历,方法有 add.delete.has. ...

  7. [转]UiPath Build Data Table

    本文转自:https://docs.uipath.com/activities/docs/build-data-table UiPath.Core.Activities.BuildDataTable ...

  8. Android 使用 aapt 命令查看 apk 包名

    一.aapt 是什么 aapt 即Android Asset Packaging Tool,在SDK的build-tools目录下.该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, ...

  9. Python读字节某一位的值,设置某一位的值,二进制位操作

    Python读字节某一位的值,设置某一位的值,二进制位操作   在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1.True和Fa ...

  10. Python3操作MySQL基于PyMySQL封装的类

    Python3操作MySQL基于PyMySQL封装的类   在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类, ...