Skip to content
On this page

前置基础-玩转Python遍历工具for..in【加推篇】


前置基础:玩转Python遍历工具for..in

前言

for循环是所有编程语言中普遍使用的一种语法。

Python中for..in循环结构用于遍历列表、元组、字典、字符串、集合、文件等。

其实for和in是两个独立的语法:

  • for语句是Python内置的迭代器工具,用于从可迭代容器对象(如列表、元组、字典、字符串、集合、文件等)中逐个读取元素,直到容器中没有更多元素为止,工具和对象之间只要遵循可迭代协议即可进行迭代操作。
  • in的存在使得python在操作可迭代对象时变得简单得多,用于配合for使用逐个取可迭代对象的元素。

for..in迭代过程

for语句参与的具体迭代的过程为:可迭代对象通过__iter__方法返回迭代器,迭代器具有__next__方法,for循环不断地调用__next__方法,每次按序返回迭代器中的一个值,直到迭代到最后,没有更多元素时抛出异常StopIteration(python自动处理异常)。

模拟迭代的过程如下所示:

# 迭代的过程
x = [1,2,3]
its = x.__iter__() #列表是可迭代对象,否则会提示不是迭代对象
print(its)
# 打印结果:
<list_iterator object at 0x100f32198>
print(next(its)) # its包含此方法,说明its是迭代器
# 打印结果:
1
print(next(its)) 
# 打印结果:
2
print(next(its)) 
# 打印结果:
3
print(next(its)) 
# 打印结果:
Traceback (most recent call last):
 	File "<stdin>", line 1, in <module>
StopIteration

迭代的优点是无需把所有元素一次加载到内存中,可以在调用next方法时逐个返回元素,避免出现内存空间不够的情况。

for..in使用技巧

接下来我们介绍下for..in循环结构的使用技巧。

1、遍历一个范围内的数字

通过range()函数创建一个整数列表用于 for 循环遍历,range(start, stop[, step])

  • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5)
  • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
  • step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

示例代码如下所示:

for i in range(6):# [0, 1, 2, 3, 4, 5]
    print(i)

2、正向遍历/反向遍历一个集合

关于正向遍历和反向遍历的实现方法,各有两种,此处推荐使用后一种更简练的方法。

示例代码如下所示:

colors = ['red', 'green', 'blue', 'yellow']
#正向遍历
for i in range(len(colors)):
    print(colors[i])
# 推荐更好的简练方法
for color in colors:
    print(color) #返回 'red', 'green', 'blue', 'yellow'

#反向遍历
for i in range(len(colors)-1, -1, -1):
    print(colors[i])
# 推荐更好的简练方法
for color in reversed(colors):
    print(color) #返回 'yellow', 'blue', 'green', 'red'

3、遍历一个集合及其下标

当遍历一个集合及其下标时,推荐使用enumerate这种效率高、优雅的写法。

enumerate()函数可将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,如(0, seq[0]), (1, seq[1]), (2, seq[2])等帮我们省去亲自创建和自增下标,避免在操作集合的下标时出错。

示例代码如下所示:

colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
    print(i, '--->', colors[i])
# 推荐更好的简练方法
for i, color in enumerate(colors):
    print(i, '--->', color)
#返回结果:
#0 ---> red
#1 ---> green
#2 ---> blue
#3 ---> yellow

4、遍历两个集合

当同时遍历两个集合时,推荐使用zip这种写法。

zip方法用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,在返回内容方面 Python 2 和 Python 3 中会有所不同。

在 Python 2.x中zip() 返回的是由这些元组组成的列表,而在 Python 3.x 中为了减少生成列表所占用的内存,zip() 返回的是一个对象,如需得到列表,可以手动 list() 转换。

示例代码如下所示:

names = ['raymond', 'rachel', 'matthew']
colors = ['red', 'green', 'blue', 'yellow']

n = min(len(names), len(colors))
for i in range(n):
    print(names[i], '--->', colors[i])
# 推荐更好的简练方法
for name, color in zip(names, colors):
    print(name, '--->', color)
#返回结果:
#raymond ---> red
#rachel ---> green
#matthew ---> blue

5、有序地遍历

Python 3.x中的sorted(iterable, key=None, reverse=False)函数可对所有可迭代的对象进行排序操作,其中各个参数定义如下所示:

  • iterable:可迭代对象
  • key:可选项,默认值为None,主要作用是指定一个函数,该函数只能输入一个参数,参数值取自于可迭代对象中的一个元素,以此作为排序的关键字
  • reverse:排序规则,reverse=True 降序 , reverse=False 升序(默认)

示例代码如下所示:

colors = [('red',1), ('green',3), ('blue',5), ('yellow',2)]
# 正序 key=none
for color in sorted(colors):
    print(color)
#返回结果:
#('blue', 5)
#('green', 3)
#('red', 1)
#('yellow', 2)

# 正序 key=lambda s:s[1]
for color in sorted(colors, key=lambda s:s[1]):
    print(color)
#返回结果:
#('red', 1)
#('yellow', 2)
#('green', 3)
#('blue', 5)

# 倒序 key=none
for color in sorted(colors, reverse=True):
    print(color)
#返回结果:
#('yellow', 2)
#('red', 1)
#('green', 3)
#('blue', 5)

# 倒序 key=lambda s:s[1]
for color in sorted(colors, key=lambda s:s[1], reverse=True):
    print(color)
#返回结果:
#('blue', 5)
#('green', 3)
#('yellow', 2)
#('red', 1)

6、遍历一个字典的key和value

Python 3.x 中:iteritems()viewitems()这两个方法都已经废除了,而items() 得到的结果和Python2.x中viewitems()一致(viewitems返回一个view对象,(key,value)列表,类似于视图)。在Python 3.x中items()的行为和iteritems()很接近,可以用items() 替代iteritems()用于 for循环遍历。因此推荐使用items ()

示例代码如下所示:

d = {'matthew': 'blue', 'rachel': 'green', 'raymond': 'red'}
# 并不快,每次必须要重新哈希并做一次查找
for k in d:
    print(k, '--->', d[k])

# Python2.x中产生一个很大的列表
for k, v in d.items():
    print(k, '--->', v)
# Python2.x中推荐更好的简练方法
for k, v in d.iteritems():
    print(k, '--->', v)

总结

本小节我们介绍了Python中for..in循环的原理和使用技巧,这也是我们使用Python编程时候普遍使用的一种语法,在小册接下来的《股票数据分析:遍历DataFrame格式股票数据的方法》一节中我们会用例程来看看for..in循环是如何解决实际问题的。