问题描述
该笔记将记录:在学习 Python 过程中,我们遇到的与其他语言不同的地方,以及常见问题处理。
解决方案
pass
类似于空代码块({});
Ternary Operator(三元运算符)
a, b = 10, 20 min = a if a < b else b # 能够嵌套 min = a < b and a or b # [expression] and [on_true] or [on_false] min = (b, a) [a < b] min = {True: a, False: b} [a < b] min = (lambda: b, lambda: a)[a < b]())
from…import…as
import os import os as RealOs from os import path as p
try…except…else
# 抛出异常 raise Exception('I know Python!') raise NotImplementedError # 捕获异常 try: return True except ZeroDivisionError: print("division by zero!") except IOError as exc: print('An exception flew by!') else: print("result is", result) finally: return False
yield
1)与 return “类似”,但是会从“停止”处继续执行(或者说,继续执行 yield 之后的代码)。
2)yield 返回的是 Generator 对象(但是,在使用时,很像可迭代的列表)。
如下示例,将演示 yield 的特性:
# 示例一: def simpleGeneratorFun(): yield 1 yield 2 yield 3 for value in simpleGeneratorFun(): print(value) # 将顺序打印 1 2 3 # 示例二、使用如下方法,单独调用(与「示例一」类似) gen = simpleGeneratorFun() print(next(gen)) # 1 print(next(gen)) # 2 print(next(gen)) # 3 # 示例三、与前两种不同 # 每次调用 simpleGeneratorFun() 将返回新的 Generator 对象 print(next(simpleGeneratorFun())) # 1 print(next(simpleGeneratorFun())) # 1 print(next(simpleGeneratorFun())) # 1
如下示例,每次从 i += 1 继续执行:
def nextSquare(): i = 1; # An Infinite loop to generate squares while True: yield i*i i += 1 # 下一次,将从这里继续执行 for num in nextSquare(): if num > 100: break print(num) # 将顺序输出 1 4 9 16 ...
with…as
with 提供获取和关闭资源的便捷方法。
如下两种打开文件的方法,显然后者便捷(无需明确关闭文件的代码):
# 方法一、常规的文件打开方法 file = open('file_path', 'w') try: file.write('hello world') finally: file.close() # 方法二、使用 with...as 方法 with open('file_path', 'w') as file: file.write('hello world !') # 当执行结束后,文件会被自动关闭(由内部处理)
我们还能为自定义对象使用 with…as 语句,只需要实现 __exit__() 与 __enter__() 方法:
class MessageWriter(object): def __init__(self, file_name): self.file_name = file_name def __enter__(self): self.file = open(self.file_name, 'w') return self.file def __exit__(self): self.file.close() with MessageWriter('my_file.txt') as xfile: xfile.write('hello world')
还有另外的用法:
from contextlib import contextmanager @contextmanager def simpleGeneratorFun(): yield 1 print(5) with simpleGeneratorFun() as n: print(n) # 这段代码将输出 1 5, # 但是 1 是在 with 中输出的,而 5 则是 yield 之后,由 simpleGeneratorFun() 打印的 # with 要求操作数必须是 Context Manager,否则使用默认的 __enter__() / __exit__() 方法(也是 Context Manager) # 对于 Generator 对象(使用 yield 关键字),控制权会返回到 Generator 中继续执行 # 其实,我们也不懂内部实现,但是它的行为是这样的。
动态方法名
通过字符串形式指定方法名:
>>> s = 'hello' >>> getattr(s, 'replace')('l', 'y') 'heyyo'
参考文献
with statement in Python – GeeksforGeeks
When to use yield instead of return in Python? – GeeksforGeeks
How to Use Generators and yield in Python – Real Python
28.7. contextlib — Utilities for with-statement contexts — Python 2.7.18 documentation
PEP 221 — Import As | Python.org
8. Errors and Exceptions — Python 3.9.2 documentation
Manually raising (throwing) an exception in Python – Stack Overflow
Dynamic Method Call In Python 2.7 using strings of method names – Stack Overflow
python – When to use ‘raise NotImplementedError’? – Stack Overflow
Ternary Operator in Python – GeeksforGeeks