1-04 Python 分支控制

1.4 分支控制

if 语句

可能最为人所熟知的编程语句就是 if 语句了。例如

chap1-4-1-if.py

x = int(input("请输入一个整数: "))
if x < 0:
    x = 0
    print('负数改为 0')
elif x == 0:
    print('0')
elif x == 1:
    print('1')
else:
    print('比 1 大')

可以有零个或多个 elif 部分,以及一个可选的 else 部分。 关键字 ‘elif’ 是 ‘else if’ 的缩写,适合用于避免过多的缩进。 一个 if … elif … elif … 序列可以看作是其他语言中的 switch 或 case 语句的替代,在 Python 中是没有 Switch/Case 语句的。

for 语句
Python 中的 for 语句与 C 或 Pascal 中可能用到的有所不同。 Python 中的 for 语句并不总是对算术递增的数值进行迭代(如同 Pascal),或是给予用户定义迭代步骤和暂停条件的能力(如同 C),而是对任意序列进行迭代(例如列表或字符串),条目的迭代顺序与它们在序列中出现的顺序一致;利用 enumerate() 内置函数遍历并获取元素和对应索引;Python 的强大特性之一是其对列表的解析,它提供一种紧凑的方法,可以通过对列表中的每个元素应用一个函数,从而将一个列表映射为另一个列表。

chap1-4-2-for.py

words = ['cat', 'window', 'defenestrate']
# 对任意序列进行迭代
for w in words:
    print(w, len(w))

# 遍历并获取元素和对应索引
for w in enumerate(words):
    print(w)

# 列表映射
newwords = [word*2 for word in words] 
print(newwords)

dic = {"program":"Python", "database":"mysql"}
#利用列表映射取出键
keys = [k for k, v in dic.items()]
print(keys)

如果在循环内需要修改序列中的值(比如重复某些选中的元素),推荐你先拷贝一份副本。对序列进行循环不代表制作了一个副本进行操作。切片操作使这件事非常简单:

chap1-4-2-for.py

words = ['cat', 'window', 'defenestrate']
for w in words[:]:
    if len(w) > 6:
        words.insert(0, w)

print(words)

如果写成 for w in words: ,这个示例就会创建无限长的列表,一次又一次重复地插入 defenestrate。

while 语句
可以根据 while 后面的判断是来决定何时离开回圈,以下范例就是利用辗转相除法,逐次用较小数去除较大数的余数,直到余数是 0 为止。那么,最后一个除数就是所求的最大公约数,所以判断结束的条件就是余数为 0 。

chap1-4-3-while.py

a, b = map(int, input("请输入两个整数: ").split())
if (b > a): # 确保 a > b
    a, b = b, a
while (a % b):
    a, b = b, (a % b)
print("最大公约数为", b)    

range() 函数

如果你确实需要遍历一个数字序列,内置函数 range() 会派上用场。它生成算术级数,给定的终止数值并不在要生成的序列里。range也可以以另一个数字开头,或者以指定的幅度增加(甚至是负数;有时这也被叫做 ‘步进’)

chap_1_4_4_range.py

# 算术级数: 0, 1, 2, 3, 4
for i in range(5):
    print(i)

# 步进  0, 3, 6, 9
for i in range(0, 10, 3)
   print(i)

# 负数步进 -10, -40, -70
for i in range(-10, -100, -30)
   print(i)

如果你只打印 range,会出现奇怪的结果:

>>> print(range(10))
range(0, 10)

range() 所返回的对象在许多方面表现得像一个列表,但实际上却并不是。此对象会在你迭代它时基于所希望的序列返回连续的项,但它没有真正生成列表,这样就能节省空间。函数 list() 是从可迭代对象中创建列表。

>>> list(range(5))
[0, 1, 2, 3, 4]

break 和 continue 语句,以及循环中的 else 子句

break 语句,和 C 中的类似,用于跳出最近的 for 或 while 循环,循环语句可能带有一个 else 子句;它会在循环遍历完列表 (使用 for) 或是在条件变为假 (使用 while) 的时候被执行,但是不会在循环被 break 语句终止时被执行。 这可以通过以下搜索素数 (prime number) 的循环为例来进行说明:

chap1-4-5-break.py

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0: # 可被整除,所以非素数
            print(n, ' 可被整除,不是素数')
            break
    else:
        print(n, ' 是素数')
        
---------------------------------------
# 输出结果如下:
2  是素数
3  是素数
4  可被整除,不是素数
5  是素数
6  可被整除,不是素数
7  是素数
8  可被整除,不是素数
9  可被整除,不是素数

(这是正确的代码。仔细看: else 子句属于 for 循环, 不属于 if 语句。)

continue 语句也是借鉴自 C 语言,表示继续循环中的下一次迭代:

chap1-4-6-continue.py

for num in range(2, 10):
    if num % 2 == 0:
        print("找到一个偶数", num)
        continue
    print("找到一个奇数", num)

---------------------------------------
# 输出结果如下:
找到一个偶数 2
找到一个奇数 3
找到一个偶数 4
找到一个奇数 5
找到一个偶数 6
找到一个奇数 7
找到一个偶数 8
找到一个奇数 9    

pass 语句什么也不做。当语法上需要一个语句,但程序需要什么动作也不做时,可以使用它。例如:

>>>
>>> while True:
...     pass  # Busy-wait for keyboard interrupt (Ctrl+C)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值