返回目录

本篇索引

(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. JCC 指令

    JCC跳转指令 JCC指条件跳转指令,CC就是指条件码. JCC指令 中文含义 英文原意 检查符号位 典型C应用 JZ/JE 若为0则跳转:若相等则跳转 jump if zero;jump if eq ...

  2. dubbo 获取不到本地地址,返回 127.0.0.1

    2019-08-14 12:29:09.609  WARN 1079 --- [           main] org.apache.dubbo.config.AbstractConfig   :  ...

  3. HTTP 400 与 SpringMVC的 HttpPutFormContentFilter、FormContentFilter

    前端发送了一个http PUT请求,如下, json_xml: {,},,}},,},,}},},}},,},{,}],,},,}},,,,},,}},},}},,},{,}],,},,}},,},{ ...

  4. vue路由进阶

    一..全局路由前置守卫 1.首先看一下文档结构 Dashboard和Login是一级页面  home about mine是在Dashboard下的二级页面 2.router.js代码如下 impor ...

  5. Prometheus学习系列(二)之Prometheus FIRST STEPS

    前言 本文来自Prometheus官网手册 和 Prometheus简介 说明 Prometheus是一个监控平台,通过在监控目标上的HTTP端点来收集受监控目标的指标.本指南将向您展示如何使用Pro ...

  6. SpringMVC的工作流程?Mybatis和hibernate区别?

    SpringMVC的工作流程?1. 用户发送请求至前端控制器DispatcherServlet2. DispatcherServlet收到请求调用HandlerMapping处理器映射器.3. 处理器 ...

  7. docker chromium/chrome: error while loading shared libraries: libXcursor.so.2: cannot open shared object file: No such file or directory

    在运行 pyppeteer 的时候,因为依赖浏览器,出现上述情况. 解决办法: 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误.原因一般有两个, 一个是操作系统里确实没有包含 ...

  8. Nexus-在项目中使用Maven私服,Deploy到私服、上传第三方jar包、在项目中使用私服jar包

    场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  9. SSH框架之Spring第二篇

    1.1 基于注解的IOC配置 既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样. 1.2 环境搭建 1.2.1 第一步:拷贝必备的jar包 需要多拷贝一个sp ...

  10. C lang:Pointer operation

    Xx_Pointer opteration Do not dereference initialized Pointers Ax_Code #include<stdio.h> int ma ...