python对象特性对比_Python“不为人知的”特性

装饰器

装饰器使一个函数或方法包装在另一个函数里头,可以在被包装的函数添加一些额外的功能,比如日志,还可以对参数、返回结果进行修改。装饰器有点类似Java中的AOP。下面这个例子是打印被装饰的函数里面的参数的装饰器,

>>> def print_args(function):

>>> def wrapper(*args, **kwargs):

>>> print 'Arguments:', args, kwargs

>>> return function(*args, **kwargs)

>>> return wrapper

>>> @print_args

>>> def write(text):

>>> print text

>>> write('foo')

Arguments: ('foo',) {}

foo

@是语法糖,它等价于:

>>> write = print_args(write)

>>> write('foo')

arguments: ('foo',) {}

foo

for ... else语法

for i in foo:

if i == 0:

break

else:

print("i was never 0")

else代码块只有在for循环正常结束后执行如果遇到break语句那么不会执行else语句块,等价于下面:

found = False

for i in foo:

if i == 0:

found = True

break

if not found:

print("i was never 0")

不过这种语法看起来怪怪地,让人感觉是else块是在for语句块没有执行的时候执行的,很容易让人去类比 if else 的语法,如果是把else换成finally或许更容易理解

python2.5中的__missing__方法

dict的子类如果定义了方法__missing__(self, key),如果key不再dict中,那么d[key]就会调用__missing__方法,而且d[key]的返回值就是__missing__的返回值。

>>> class MyDict(dict):

... def __missing__(self, key):

... self[key] = rv = []

... return rv

...

>>> m = MyDict()

>>> m["foo"].append(1)

>>> m["foo"].append(2)

>>> dict(m)

{'foo': [1, 2]}

在collections模块下有一个叫defaultdict的dict子类,它与missing非常类似,但是对于不存在的项不需要传递参数。

>>> from collections import defaultdict

>>> m = defaultdict(list)

>>> m["foo"].append(1)

>>> m["foo"].append(2)

>>> dict(m)

{'foo': [1, 2]}

变量值交换

>>> a = 10

>>> b = 5

>>> a, b

(10, 5)

>>> a, b = b, a

>>> a, b

(5, 10)

等号右边是一个创建元组的表达式,等号左边解压(没有引用的)元组分别赋给名称(变量)a和b。赋完值后因为没有被其他名字引用,因此被标记之后被垃圾收集器回收,而绑定到a和b的值已经被交换了。

注意:多值赋值其实仅仅就是元组打包和序列解包的组合的过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值