第零章 学前准备
第一章 数据结构 – 基本数据类型
第一章 数据结构 – 字符串
第一章 数据结构 – 列表、元组和切片
第一章 数据结构 – 字典
第一章 数据结构 – 集合
第一章 – 数组、队列、枚举
第一章 数据结构 – 序列分类
第二章 控制流程
文章目录
第二章 控制流程
2.1 if...elif...else...
score = 10
if score == 100:
print("unbelievable")
if score >= 90:
print("excellent")
elif score >= 80:
print("great")
elif score >= 70:
print("good")
elif score >= 60:
print("pass")
else:
print("come on")
come on
2.2 for...in...
for score in [90, 95, 59, 59]:
print(score)
print("*"*30)
for index in range(10, 0, -2):
print(index)
90
95
59
59
******************************
10
8
6
4
2
2.3 while
python没有do...while
语法
x = 0
while x <= 5:
x += 1
print(x)
1
2
3
4
5
6
2.4 break
和continue
x = 0
while x <= 5:
x += 1
if x == 3:
break
print(x)
print("-"*30)
for x in range(5):
if x % 2:
continue
print(x)
1
2
------------------------------
0
2
4
2.5 try...except...finally...
try:
print("try block above")
raise ValueError()
print("try block down")
except ValueError as e:
print("ValueError occurs.")
finally:
print("finally block.")
print('-'*30)
try:
print("try block above")
print("try block down")
except ValueError as e:
print("ValueError occurs.")
finally:
print("finally block.")
try block above
ValueError occurs.
finally block.
------------------------------
try block above
try block down
finally block.
2.5 else
for/else
, while/else
和 try/else
else
子句的行为如下:
for
:仅当for循环运行完毕时(即for循环没有被break语句中止)才运行else块。while
:仅当while循环因为条件为假值而退出时(即while循环没有被break语句中止)才运行else块。try
:仅当try块中没有异常抛出时才运行else块。
在所有情况下,如果异常或者return
、break
或continue
语句导致控制权跳到了复合语句的主块之外,else
子句也会被跳过。
for x in range(5):
if x % 2:
continue
print(x)
else:
print("else block")
print("*"*20)
for x in range(6):
if x % 2:
break
print(x)
else:
print("else block")
0
2
4
else block
********************
0
2.6 pass
The pass statement does nothing. It can be used when a statement is required syntactically but the program requires no action.
2.7 with
语句上下文管理器
with
语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文。这么做能避免错误并减少样板代码,因此 API
更安全,而且更易于使用。
with
语句的目的是简化 try/finally
模式。这种模式用于保证一段代码运行完毕后执行某项操作,即便那段代码由于异常、 return
语句或 sys.exit()
调用而中止,也会执行指定的操作。 finally
子句中的代码通常用于释放重要的资源,或者还原临时变更的状态。
上下文管理器协议包含 __enter__
和 __exit__
两个方法。 with
语句开始运行时,会在上下文管理器对象上调用 __enter__
方法。 with
语句运行结束后,会在上下文管理器对象上调用 __exit__
方法,以此扮演 finally
子句的角色。
解释器调用 __enter__
方法时,除了隐式的 self
之外,不会传入任何参数。传给 __exit__
方法的三个参数列举如下。
exc_type
异常类(例如ZeroDivisionError
)。exc_value
异常实例。有时会有参数传给异常构造方法,例如错误消息,这些参数可以使用exc_value.args
获取。tracebacktraceback
对象
class LookingGlass:
def __enter__(self): # ➊ 除了self之外,Python调用__enter__方法时不传入其他参数。
import sys
# ➋ 把原来的sys.stdout.write方法保存在一个实例属性中,供后面使用。
self.original_write = sys.stdout.write
sys.stdout.write = self.reverse_write # ➌ 为sys.stdout.write打猴子补丁,替换成自己编写的方法。
return 'JABBERWOCKY' # ➍ 返回'JABBERWOCKY'字符串,这样才有内容存入目标变量what。
def reverse_write(self, text): # ➎ 这是用于取代sys.stdout.write的方法,把text参数的内容反转,然后调用原来的实现。
self.original_write(text[::-1])
# ➏ 如果一切正常,Python调用__exit__方法时传入的参数是None, None, None;如果抛出了异常,这三个参数是异常数据,如下所述。
def __exit__(self, exc_type, exc_value, traceback):
import sys # ➐ 重复导入模块不会消耗很多资源,因为Python会缓存导入的模块。
sys.stdout.write = self.original_write # ➑ 还原成原来的sys.stdout.write方法。
if exc_type is ZeroDivisionError: # ➒ 如果有异常,而且是ZeroDivisionError类型,打印一个消息
print('Please DO NOT divide by zero!')
return True # ➓ 然后返回True,告诉解释器,异常已经处理了。
# ⓫ 如果__exit__方法返回None,或者True之外的值,with块中的任何异常都会向上冒泡。
with LookingGlass() as what:
print('Alice, Kitty and Snowdrop')
print(what)
print(what)
print('Back to normal.')
pordwonS dna yttiK ,ecilA
YKCOWREBBAJ
JABBERWOCKY
Back to normal.