流控制工具
if语句
>>> x = 0
>>> if x < 0:
... x = 0
... print('Negative changed to zero')
... elif x == 0:
... print('Zero')
... elif x == 1:
... print('Single')
... else:
... print('More')
...
Zero
for语句
- python中的for语句像c中是给予用户定义迭代步骤和结束条件的能力,而是在列表或者字符串等任意序列的元素上迭代,按它们在序列中出现的顺序。
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words:
... print(w, len(w))
...
cat 3
window 6
defenestrate 12
- 在python中很难正确的在迭代多项集的同时修改多项集的内容,一般是迭代多项集的副本或者创建新的多项集
>>> users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
>>> for user, status in users.copy().items():
... if status == 'inactive':
... del users[user]
...
>>> users
{'Hans': 'active', '景太郎': 'active'}
>>> active_users = {}
>>> for user, status in users.items():
... if status == 'active':
... active_users[user] = status
...
>>> active_users
{'Hans': 'active', '景太郎': 'active'}
rang函数
-
range生成的序列不会包括给定的终止值,range可以不从0开始,且可以按给定的步长递增,即使是负数步长
list(range(5, 10)) [5, 6, 7, 8, 9] list(range(0, 10, 3)) [0, 3, 6, 9] list(range(-10, -100, -30)) [-10, -40, -70]
-
要按照索引迭代序列,可以组合使用range和len
a = ['Mary', 'had', 'a', 'little', 'lamb'] for i in range(len(a)): print(i, a[i]) 0 Mary 1 had 2 a 3 little 4 lamb
循环中的break,continue语句和else子句
- break 语句将跳出最近的一层
for
或while
循环。for
或while
循环可以包括else
子句。在for
循环中,else
子句会在循环成功结束最后一次迭代之后执行。在while
循环中,它会在循环条件变为假值后执行。无论哪种循环,如果因为break
而结束,那么else
子句就 不会 执行。下面的搜索质数的for
循环就是一个例子:
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'equals', x, '*', n//x)
... break
... else:
... # loop fell through without finding a factor
... print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
没错,这段代码就是这么写。仔细看:
else
子句属于for
循环,不属于if
语句。)else
子句用于循环时比起if
语句的else
子句,更像try
语句的。try
语句的else
子句在未发生异常时执行,循环的else
子句则在未发生break
时执行。try
语句和异常详见 异常的处理。
continue语句同样借鉴自c语言
>>> for num in range(2, 10):
... if num % 2 == 0:
... print("Found an even number", num)
... continue
... print("Found an odd number", num)
...
Found an even number 2
Found an odd number 3
Found an even number 4
Found an odd number 5
Found an even number 6
Found an odd number 7
Found an even number 8
Found an odd number 9
match语句
- match语句接受一个表达式并把它的值与一个或多个 case 块给出的一系列模式进行比较。这表面上像 C、Java 或 JavaScript(以及许多其他程序设计语言)中的 switch 语句,但其实它更像 Rust 或 Haskell 中的模式匹配。只有第一个匹配的模式会被执行,并且它还可以提取值的组成部分(序列的元素或对象的属性)赋给变量。 -> 就是说这里的match语句不需要在每一个后面都写上break
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
- 这里最后一个_被作为通配符并必定会匹配成功,如果没有case匹配成功,则不会执行任何分支
- 还可以使用 | (or)在一个模式中组合几个字面值