1 分支结构

在 Python 中,要构造分支结构可以使用ifelif和 else关键字。

if 语句

if 语句是最简单的判断,含义为如果表达式成立(真),就执行后面的代码块;如果表达式不成立(假),就什么也不执行。语法格式如下:

"""
用户身份验证
"""
username = 'admin'
if username == 'admin':
    print('注意,这位是 admin 用户!')  #注意,这位是 admin 用户!

需要说明的是,Python 中使用了缩进的方式来表示代码的层次结构,如果if条件成立的情况下需要执行多条语句,只要保持多条语句具有相同的缩进就可以了。换句话说连续的代码如果又保持了相同的缩进那么它们属于同一个代码块,相当于是一个执行的整体。缩进可以使用任意数量的空格,但通常使用 4 个空格

另外 if 以及后面学到的 elif 和 else关键字的最后面都有一个:,它是用英文输入法输入的冒号,切记不要忘记,否则会抛出语法错误。

if-else 语句

如果要构造出更多的分支,可以使用 if...elif...else... 结构,下面的代码演示了如何利用多分支结构实现分段函数求值。

"""
分段函数求值
"""
x = -5
if x > 1:
    y = 3 * x - 5
elif x >= -1:
    y = x + 2
else:
    y = 5 * x + 3
print(f'f({x}) = {y}')   #f(-5) = -22

嵌套的 if-else 语句

x = 5
if x > 1:
    y = 3 * x - 5
else:
    if x >= -1:
        y = x + 2
    else:
        y = 5 * x + 3
print(f'f({x}) = {y}')  #f(5) = 10

if else 是如何判断表达式成立的?

  1. 对于布尔类型:只有两个值,分别是 True 和 False,Python 会把 True 当做,把 False 当做
  2. 对于数字类型,Python 会把 0 和 0.0 当做,把其它值当做
  3. 对于字符串类型,Python 会把空字符串当做,把其他当做
  4. 对于空值类型 None (None 是 Python 里面的一个关键字,代表空值),Python 会永远把它当做
  5. 对于其他类型(比如 列表、元组、字典等,后续我们学到的时候再详细介绍),Python 会把空列表、空元组、空字典当做,把其他当做

2 循环结构

在 Python 中构造循环结构有两种做法,一种是for-in循环,另一种是while循环。

for-in 循环

for x in range(0, 100):
  print('hello, world')

说明 上面代码中的range(0, 100) 是 Python 的内置函数,它的作用可以用来构造一个从0100(不包括 100)的数字序列,一共 100 个数字;例如,range(0, 5) 将生成数字序列 [0, 1, 2, 3, 4]。当把这样一个范围放到for-in循环中,就可以通过前面的循环变量 x 依次取出从0 到 100的整数。上面的代码虽然没有使用 x 变量,但是代码整整执行了 100 次,实现了需求。

while 循环

如果要构造不知道具体循环次数的循环结构,推荐使用 while 循环。

while 循环通过一个能够产生 bool 值的表达式来控制循环,当表达式的值为 True 时则继续循环,当表达式的值为 False 时则结束循环。

# 计算 1 到 10 的整数之和
i = 1
total = 0
while i <= 10:
    total += i
    i += 1

print(total) #55

break 和 continue

使用 while True 构造了一个条件永远成立的循环,也就意味着如果不做特殊处理,循环是不会结束的,这也就是常说的“死循环”。如果需要在中途退出循环,我们就需要使用 break 关键字,它的作用是提前结束循环。

while True:
    user = input("请输入用户: ")
    if user == "admin":
        print("登录成功。")
        break
    else:
        print("用户名不正确,请重新输入。")
print("循环结束。")

在上述代码中,如果用户输入了正确的用户名,会提示登录成功,break 关键词会提前跳出 while 循环,所以 "循环结束。" 也会立即输出;如果用户永远输入错误的用户名,那么 break 语句一直得不到执行,就会永远的循环下去等待用户的输入。

除了 break 之外,还有另一个关键字是 continue,它可以用来放弃本次循环后续的代码直接让循环进入下一轮。 下面的例子用于找出 1 - 10 这 10 个数字里所有的奇数。

for i in range(1, 11):
    if i % 2 == 0:
        continue
    print(i) # 输出 1 3 5 7 9

如果要输出 1-10, range 的范围应该是 1-11 ,因为 range 输出的数字区间包括第一个参数,但是不包括第二个参数数字本身,也就是数学中区间的的左闭右开。

从输出结果可以看出,在判断到这个变量 i 如果是偶数的时候,代码跳过了本轮循环,没有执行下面的 print 语句,这说明 continue 关键字可以在循环中起到控制流程,跳过本轮循环的作用,这可以更加灵活地控制程序的执行。

嵌套的循环结构

和分支结构一样,循环结构也是可以无限嵌套的,也就是说在循环中还可以嵌套循环结构,甚至无限嵌套下去。如何通过嵌套的循环来输出一个乘法口诀表(九九表)

for i in range(1, 10):
    for j in range(1, i + 1):
        print(f'{i}*{j}={i * j}', end='\t')  # 制表符 \t 
    print() # 此语句什么都不传的话,默认输出 `\n` 换行符

while 和 for 一起嵌套组合

while 和 for 一起组合输出一个乘法口诀表(九九表)

# 打印一个九九乘法表
i = 1
while i <= 9:
    for j in range(1, i+1):
        print(f'{i}*{j}={i * j}', end='\t')
    print()
    i += 1

在上面的代码中,外层循环用来控制一共会产生9行的输出,而内层循环用来控制每一行会输出多少列。内层循环中的输出就是九九表一行中的所有列,所以在内层循环完成时,有一个print()来实现换行输出的效果。

如果知道循环的次数,我们通常使用for循环;如果循环次数不能确定,可以用while循环。在循环中还可以使用break来提前结束循环,也可以使用 continue 来跳过本轮循环。

例子

1 寻找水仙花数

for num in range(100,1000):
    hundred=num//100%100 #百位
    mid=num//10%10       #十位
    unit=num%10          #个位
    if num==unit**3+mid**3+hundred**3:
        print(num)

2 正整数反转

count=int(input("请输入正整数"))
reversed_num=0
while(count>0):
    reversed_num=reversed_num*10+count%10 #count%10获取个位数  
    count//=10  #使用整除运算去除已处理过的最低位数
print(reversed_num)

2 打印100以内的素数

for x in range(2,100):
    is_prime=True
    for y in range(2,x):
        if(x%y==0):
            is_prime=False
            break
    if(is_prime):
        print(x)