跳到主要内容

控制语句

条件

在 Python 中,判断的值可以分为:

  • 假值 :None、空列表、空集合、空字典,空元组、空字符串、0、False 等。
  • 真值 :非空列表、非空集合、非空字典,非空元组、非空字符串、非 0 数值、True 等。

if

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

# 示例
>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
x = 0
print('Negative changed to zero')
elif x == 0:
print('Zero')
elif x == 1:
print('Single')
else:
print('More')

当然如果要构造出更多的分支,可以使用if...elif...else...结构或者嵌套的if...else...结构。

match

match 语句接受一个表达式并将它的值与以一个或多个 case 语句块形式给出的一系列模式进行比较。 这在表面上很类似 C, Java 或 JavaScript (以及许多其他语言) 中的 switch 语句,但它还能够从值中提取子部分 (序列元素或对象属性) 并赋值给变量。

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 ”)在一个模式中组合几个字面值:

case 401 | 403 | 404:
return "Not allowed"

循环

for

Python 的 for 语句与 C 或 Pascal 中的不同。Python 的 for 语句不迭代算术递增数值(如 Pascal),或是给予用户定义迭代步骤和暂停条件的能力(如 C),而是迭代列表或字符串等任意序列,元素的迭代顺序与在序列中出现的顺序一致。

"""
用for循环实现1~100求和
"""

sum = 0
for x in range(101):
sum += x
print(sum)

内置函数 range() 表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。

range(101)可以用来构造一个从 1 到 100 的范围,当我们把这样一个范围放到 for-in 循环中,就可以通过前面的循环变量 x 依次取出从 1 到 100 的整数。当然,range 的用法非常灵活,下面给出了一个例子:

  • range(101):可以用来产生 0 到 100 范围的整数,需要注意的是取不到 101。
  • range(1, 101):可以用来产生 1 到 100 范围的整数,相当于前面是闭区间后面是开区间。
  • range(1, 101, 2):可以用来产生 1 到 100 的奇数,其中 2 是步长,即每次数值递增的值。
  • range(100, 0, -2):可以用来产生 100 到 1 的偶数,其中 -2 是步长,即每次数字递减的值。

while

如果要构造不知道具体循环次数的循环结构,那么使用while循环通过一个能够产生或转换出bool值的表达式来控制循环,表达式的值为True则继续循环;表达式的值为False则结束循环。

"""
猜数字游戏
"""
import random

answer = random.randint(1, 100)
counter = 0
while True:
counter += 1
number = int(input('请输入: '))
if number < answer:
print('大一点')
elif number > answer:
print('小一点')
else:
print('恭喜你猜对了!')
break
print('你总共猜了%d次' % counter)
if counter > 7:
print('你的智商余额明显不足')

break

break 语句和 C 中的类似,用于跳出最近的 for 或 while 循环。

continue

continue 语句也借鉴自 C 语言,表示继续执行循环的下一次迭代。

else

循环语句支持 else 子句;for 循环中,可迭代对象中的元素全部循环完毕时,或 while 循环的条件为假时,执行该子句;break 语句终止循环时,不执行该子句。

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
"""

异常

try、except、finally

img

  1. except语句不是必须的,finally语句也不是必须的,但是二者必须要有一个,否则就没有try的意义了。
  2. except语句可以有多个,Python会按except语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except语句。
  3. except语句可以以元组形式同时指定多个异常,参见实例代码。
  4. except语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。
  5. 如果要捕获异常后要重复抛出,请使用raise,后面不要带任何参数或信息。
  6. 不建议捕获并抛出同一个异常,请考虑重构你的代码。
  7. 不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。
  8. 尽量使用内置的异常处理语句来替换try/except语句,比如with语句,getattr()方法。
def div(a, b):
try:
print(a / b)
except ZeroDivisionError:
print("Error: b should not be 0 !!")
except Exception as e:
print("Unexpected Error: {}".format(e))
else:
print('Run into else only when everything goes well')
finally:
print('Always run into finally block.')

# tests
div(2, 0)
div(2, 'bad type')
div(1, 2)

# Mutiple exception in one line
try:
print(a / b)
except (ZeroDivisionError, TypeError) as e:
print(e)

# Except block is optional when there is finally
try:
open(database)
finally:
close(database)

# catch all errors and log it
try:
do_work()
except:
# get detail from logging module
logging.exception('Exception caught!')

# get detail from sys.exc_info() method
error_type, error_value, trace_back = sys.exc_info()
print(error_value)
raise

with

Python 的 with 语句支持通过上下文管理器所定义的运行时上下文这一概念。 此对象的实现使用了一对专门方法,允许用户自定义类来定义运行时上下文,在语句体被执行前进入该上下文,并在语句执行完毕时退出该上下文。

通过上下文管理器,我们可以更好的控制对象在不同区间的特性,并且可以使用 with 语句替代 try...except 方法,使得代码更加的简洁,主要的使用场景是访问资源,可以保证不管过程中是否发生错误或者异常都会执行相应的清理操作,释放出访问的资源。

# with 读写文件
with open("myfile.txt") as f:
for line in f:
print(line, end="")
# 基本思想是 with 所求值的对象必须有一个 enter() 方法,一个 exit() 方法。
# 紧跟 with 后面的语句被求值后,返回对象的 enter() 方法被调用,并将返回值赋值给 as 后面的变量。
# 当 with 的代码块全部被执行完之后,将调用前面返回对象的 exit() 方法。

class Sample:
def __enter__(self):
print("In __enter__()")
return "Foo"

def __exit__(self, type, value, trace):
print("In __exit__()")


def get_sample():
return Sample()


with get_sample() as sample:
print("sample:", sample)

raise

raise语句支持强制触发指定的异常。例如:

raise NameError('HiThere')

Traceback (most recent call last):
File "<stdin>", line 1, in <module>

NameError: HiThere

其他

assert

Python 断言(assert)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

简单形式 assert expression 等价于:

if __debug__:
if not expression: raise AssertionError

扩展形式 assert expression1, expression2 等价于:

if __debug__:
if not expression1: raise AssertionError(expression2)

pass

pass 语句不执行任何操作。语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句。例如:

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

# 最小的类
class MyEmptyClass:
pass

# 三个点 等同于 pass
class MyEmptyClass:
...

del

目标列表的删除将从左至右递归地删除每一个目标

del a
del b[]

return

return 会离开当前函数调用,并以表达式列表 (或 None) 作为返回值。

yield

生成迭代器

def foo(num):
print("starting...")
while num<10:
num=num+1
yield num
for n in foo(0):
print(n)

# 输出
starting...
1
2
3
4
5
6
7
8
9
10