第二章 控制流程

第零章 学前准备
第一章 数据结构 – 基本数据类型
第一章 数据结构 – 字符串
第一章 数据结构 – 列表、元组和切片
第一章 数据结构 – 字典
第一章 数据结构 – 集合
第一章 – 数组、队列、枚举
第一章 数据结构 – 序列分类
第二章 控制流程


第二章 控制流程

简单语句
复合语句

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 breakcontinue

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/elsetry/else

else子句的行为如下:

  • for:仅当for循环运行完毕时(即for循环没有被break语句中止)才运行else块。
  • while:仅当while循环因为条件为假值而退出时(即while循环没有被break语句中止)才运行else块。
  • try:仅当try块中没有异常抛出时才运行else块。

在所有情况下,如果异常或者returnbreakcontinue语句导致控制权跳到了复合语句的主块之外,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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值