循环的技巧
2020-03-14 22:54:55 # Python

Python 的 for 语句与 C语言中的不同,它是不支持迭代算术递增数值这种方式的,但Python迭代列表或者字符串等任意序列,元素的迭代顺序与在序列中出现的顺序一致。

比如:

1
2
3
4
5
6
7
8
9
names = ['Python','dart','Swift','Objective-C']
for name in names:
print(name,len(name))

print result:
Python 6
dart 4
Swift 5
Objective-C 11

在遍历的同时修改序列内容,通常是开发中的大忌,所以执行这种操作时,需要创建一个新的序列或者遍历序列的副本:

1
2
3
4
5
6
7
8
names = ['Python','dart','Swift','Objective-C']
for name in names.copy():
if name == 'dart':
names.remove(name)
print(names)

print result:
['Python', 'Swift', 'Objective-C']

range() 搭配 len()

内置函数range()常用于遍历数字序列。

如果希望以迭代算术递增数值 这种方式做迭代,通常是以range() + len() 这种方式实现,当然也是对便捷的。

例如,希望获取某个值的下标,可以这样实现:

1
2
3
4
5
for i in range(len(names)):
if names[i] == 'Swift':
print(i)
print result:
2

当然也可以将下标和值仪器打印,像这样:

1
2
3
4
5
6
7
8
for i in range(len(names)):
print(i,names[i])

print result:
0 Python
1 dart
2 Swift
3 Objective-C

但这种实现方式,通常使用enumerate() 函数会更加便捷一些。

enumerate()函数

enumerate()函数返回的是一个枚举对象,该枚举对象里是一个个的元组:(index下标, 值)。

1
2
3
4
5
6
7
8
for i,v in enumerate(names):
print(i,v)

print result:
0 Python
1 dart
2 Swift
3 Objective-C

reversed()函数

reversed()函数是将序列翻转。

假如想将一个list倒序输出的话,可以这样:

1
2
3
4
5
6
7
8
for name in reversed(names):
print(name)

print result:
Objective-C
Swift
dart
Python

当然也可以配合range()函数做一些事情,例如将10以内的奇数倒序输出,像这样:

1
2
3
4
5
6
7
8
9
for i in reversed(range(1,10,2)):
print(i)

print result:
9
7
5
3
1

sorted()函数

如果想按指定顺序循环序列,就可以使用sorted()来完成。像这样,在不改动原序列的基础上,返回一个重新的序列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
languages = ['Python','dart','flutter','shell','ruby','Python','Objective-C','Swift','Objective-C']
for language in sorted(languages):
print(language)

print result:
Objective-C
Objective-C
Python
Python
Swift
dart
flutter
ruby
shell

set()函数

set()函数可以去除序列中重复的元素。

如果想’将一个序列中的重复元素去掉,并排序的话,使用set() 和 sorted()函数结合是一个不错的选择,像这样:

1
2
3
4
5
6
7
8
9
10
11
for language in sorted(set(languages)):
print(language)

print result:
Objective-C
Python
Swift
dart
flutter
ruby
shell

zip()函数

同时循环两个或多个序列时,用zip()函数可以将其内的元素一一匹配:

1
2
3
4
5
6
7
8
9
10
qustions = ['你是什么语言?','很厉害吗?','有什么用处?']
answers = ['Python','超厉害','我是一门开源性,面向对象的语言,,功能十分强大,有很多内置库,内置工具,而且是语法表达优美,可移植,可扩展']

for q,a in zip(qustions,answers):
print(q,a)

print result:
你是什么语言? Python
很厉害吗? 超厉害
有什么用处? 我是一门开源性,面向对象的语言,,功能十分强大,有很多内置库,内置工具,而且是语法表达优美,可移植,可扩展

如果两个数组的大小不对等,zip()函数仍然能做到一一匹配,并将不能匹配到的元素丢弃掉,而不是抛出异常,这是一个很好的处理方式。

1
2
3
4
5
6
7
8
9
10
qustions = ['你是什么语言?','很厉害吗?','有什么用处?','其他语言能替代你吗?','你真厉害!']
answers = ['Python','超厉害','我是一门开源性,面向对象的语言,,功能十分强大,有很多内置库,内置工具,而且是语法表达优美,可移植,可扩展','不能']
for q,a in zip(qustions,answers):
print(q,a)

print result:
你是什么语言? Python
很厉害吗? 超厉害
有什么用处? 我是一门开源性,面向对象的语言,,功能十分强大,有很多内置库,内置工具,而且是语法表达优美,可移植,可扩展
其他语言能替代你吗? 不能