with语句:如果with语句或语句块中发生异常,会调用默认的异常处理器处理,但文件还是会正常关闭
这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。下面有例子介绍with具体运行过程:
# 这是with的具体运行过程
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
输出结果: In __enter__() sample: Foo In __exit__()
python assert(断言):
assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常
assert 表达式 assert 表达式,表达式 (多个表达式) assert 表达式,‘错误信息’ (添加错误信息参数) # 下面有一个求质数的例子返回True或False: def isPrime(n): assert n >= 2, ‘n必须大于等于2‘ from math import sqrt for i in range(2, int(sqrt(n))+1): if n % i == 0: return False return True print(isPrime(5)) # 传值5>2为质数 print(isPrime(4)) # 传值4>2不为质数 print(isPrime(1)) # 传值1<2 运行结果: True False Traceback (most recent call last): File "E:/My_yanjiu/凤凰财经.py", line 13, in <module> print(isPrime(1)) File "E:/My_yanjiu/凤凰财经.py", line 3, in isPrime assert n >= 2, ‘n必须大于等于2‘ AssertionError: n必须大于等于2 # assert 断言错误信息
try...except...finally语句:
当try语句执行时发生异常,回到try语句层,寻找后面是否有except语句。找到except语句后,会调用这个自定义的异常处理器。except将异常处理完毕后,程序继续往下执行。finally语句表示,无论异常发生与否,finally中的语句都要执行。
try: pass except: pass finally: pass
copy()与deepcopy()的区别:
copy拷贝一个对象,但是对象的属性还是引用原来的,deepcopy拷贝一个对象,把对象里面的属性也做了拷贝,deepcopy之后完全是另一个对象了。下面有代码解释,至于为什么列表套列表才明显这个我还没弄明白以后做补充。
import copy a = [‘a‘, ‘b‘, ‘c‘, [1, 2]] b = copy.copy(a) c = copy.deepcopy(a) a[3].append(‘d‘) print(a) print(b) print(c) b[3].append(‘f‘) print(a) print(b) print(c) 运行结果: [‘a‘, ‘b‘, ‘c‘, [1, 2, ‘d‘]] [‘a‘, ‘b‘, ‘c‘, [1, 2, ‘d‘]] [‘a‘, ‘b‘, ‘c‘, [1, 2]] [‘a‘, ‘b‘, ‘c‘, [1, 2, ‘d‘, ‘f‘]] [‘a‘, ‘b‘, ‘c‘, [1, 2, ‘d‘, ‘f‘]] [‘a‘, ‘b‘, ‘c‘, [1, 2]]
Python装饰器:
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
原文:http://www.cnblogs.com/Egbertbaron/p/7241892.html