第3章 选择与循环
3.1 条件表达式
- 算术运算符:+、-、*、/、//、%、**
- 关系运算符:>、<、==、<=、>=、!=,且可连续使用,如
>>> 1<2<3
True
>>> 1<2>3
False
>>> 1<3>2
True
- 测试运算符:in、not in、is、is not
- 逻辑运算符:and、or、not,注意短路求值
- 位运算符:~、&、|、 ^、 <<、>> (前述文章有涉及)
- 矩阵乘法运算符:@
- 条件表达式的值只要不是 False、0(或0.0、0j等)、空值None、空列表、空元组、空集合、空字典、空字符串、空 range 对象或其他空迭代对象,解释器均认为与 True 等价。
>>> if 3: #使用整数作为条件表达式
print(5)
5
>>> a = [1, 2, 3]
>>> if a: #使用列表作为条件表达式
print(a)
[1, 2, 3]
>>> a = []
>>> if a:
print(a)
else:
print('empty')
empty
>>> i = s = 0
>>> while i <= 10: #使用关系表达式作为条件表达式
s += i
i += 1
>>> print(s)
55
>>> i = s = 0
>>> while True: #使用常量True作为条件表达式
s += i
i += 1
if i > 10:
break
>>> print(s)
55
>>> s = 0
>>> for i in range(0, 11, 1): #遍历迭代对象中的所有元素
s += i
>>> print(s)
- 条件表达式中不允许使用赋值运算符“=”。
>>> if a=3:
SyntaxError: invalid syntax
>>> if (a=3) and (b=4):
SyntaxError: invalid syntax
3.2.1 单分支选择结构
语法:
if 表达式:
语句块
x = input('Input two number:')
a, b = map(int, x.split())
if a > b:
a, b = b, a #序列解包,交换两个变量的值
print(a, b)
3.2.2 双分支结构
if 表达式:
语句块1
else:
语句块2
>>> chTest = ['1', '2', '3', '4', '5']
>>> if chTest:
print(chTest)
else:
print('Empty')
['1', '2', '3', '4', '5']
- 双分支简洁形式:
value1 if condition else value2
当条件表达式condition的值与 True 等价时,表达式的值为 value1,否则表达式的值为 value2。另外,在 value1 和 value2 中还可以使用复杂表达式,包括函数调用和基本输出语句。这个结构的表达式也具有惰性求值的特点。
>>> a = 5
>>> print(6) if a>3 else print(5)
6
>>> print(6 if a>3 else 5)
6
>>> b = 6 if a>13 else 9
>>> b
9
x = math.sqrt(9) if 2>3 else random.randint(1, 100)
x
86
3.2.3 多分支结构
if 表达式1:
语句块1
elif 表达式2:
语句块2
elif 表达式3:
语句块3
else:
语句块4
其中,关键字 elif 是 else if 的缩写。
例子:
def func(score):
if score > 100:
return 'wrong score.must <= 100.'
elif score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
elif score >= 60:
return 'D'
elif score >= 0:
return 'E'
else:
return 'wrong score.must >0'
3.2.4 选择结构的嵌套
if 表达式1:
语句块1
if 表达式2:
语句块2
else: 语句块3
else:
if 表达式4:
语句块4
例子:
>>> def func(score):
degree = 'DCBAAE'
if score > 100 or score < 0:
return 'wrong score.must between 0 and 100.'
else:
index = (score - 60)//10
if index >= 0:
return degree[index]
else:
return degree[-1]
3.2.5 构建跳转表实现多分支选择结构
- 使用列表、元组或字典可以很容易构建跳转表,在某些场合下可以更快速地实现类似于多分支选择结构的功能。
funcDict = {'1':lambda:print('You input 1'),
'2':lambda:print('You input 2'),
'3':lambda:print('You input 3')}
x = input('Input an integer to call different function:')
func = funcDict.get(x, None)
if func:
func()
else:
print('Wrong integer.')
3.3.1 for 循环与 while 循环
Python提供了两种基本的循环结构语句——while语句、for语句。
- while 循环一般用于循环次数难以提前确定的情况,也可以用于循环次数确定的情况。
- for 循环一般用于循环次数可以提前确定的情况,尤其是用于枚举序列或迭代对象中的元素。
while 循环:
while 条件表达式:
循环体
[else:
else子句代码块]
for 循环:
for 取值 in 序列或迭代对象:
循环体
[else:
else子句代码块]
- 在编写循环语句时,应尽量减少循环内部不必要的计算,将与循环变量无关的代码尽可能地提取到循环之外。
优化前的代码:
digits = (1, 2, 3, 4) for i in range(1000): result = [] for i in digits: for j in digits: for k in digits: result.append(i*100+j*10+k)
优化后的代码:
for i in range(1000): result = [] for i in digits: i = i*100 for j in digits: j = j*10 for k in digits: result.append(i+j+k)
3.4 break 和 continue 语句
- break 语句在 while 循环和 for 循环中都可以使用,一般放在 if 选择结构中,一旦 break 语句被执行,将使得整个循环提前结束。
- continue 语句的作用是终止当前循环,并忽略 continue 之后的语句,然后回到循环的顶端,提前进入下一次循环。
- 除非 break 语句让代码更简单或更清晰,否则不要轻易使用。
下面的代码用来计算小于100的最大素数,注意break语句和else子句的用法。
for n in range(96, 1, -1): for i in range(2, n): if n%i == 0: break else: print(n) break
97
- 删除上面代码中最后一个 break 语句,则可以用来输出 100 以内的所有素数。
for n in range(100, 1, -1): for i in range(2, n): if n%i == 0: break else: print(n)
- 每次进入循环时的 i 已经不再是上一次的 i,所以修改其值并不会影响循环的执行。
>>> for i in range(7): print(id(i),':',i) 10416692 : 0 10416680 : 1 10416668 : 2 10416656 : 3 10416644 : 4 10416632 : 5 10416620 : 6
例:输出序列中的元素。
a_list=['a', 'b', 'mpilgrim', 'z', 'example'] for i,v in enumerate(a_list): print('列表的第', i+1, '个元素是:', v) (0, 'a') (1, 'b') (2, 'mpilgrim') (3, 'z') (4, 'example')
例:判断一个数是否为素数。
import math n = input('Input an inter:') n = int(n) m = math.ceil(math.sqrt(n)+1) for i in range(2, m): if n%i == 0 and i<n: print('No') break else: print('Yes')