Python编程语言中有哪些鲜为人知但很有用的特性?
尽量将答案限制在Python核心。
每个回答一个特征。
给出一个例子和功能的简短描述,而不仅仅是文档链接。
使用标题作为第一行标记该特性。
快速链接到答案:
参数解包
牙套
链接比较运算符
修饰符
可变默认参数的陷阱/危险
描述符
字典默认的.get值
所以测试
省略切片语法
枚举
其他/
函数作为iter()参数
生成器表达式
导入该
就地值交换
步进列表
__missing__物品
多行正则表达式
命名字符串格式化
嵌套的列表/生成器推导
运行时的新类型
.pth文件
ROT13编码
正则表达式调试
发送到发电机
交互式解释器中的制表符补全
三元表达式
试着/ / else除外
拆包+打印()函数
与声明
__getattr__ ()
getattr是一种创建泛型类的好方法,在编写API时尤其有用。例如,在FogBugz Python API中,getattr用于无缝地将方法调用传递给web服务:
class FogBugz:
...
def __getattr__(self, name):
# Let's leave the private stuff to Python
if name.startswith("__"):
raise AttributeError("No such attribute '%s'" % name)
if not self.__handlerCache.has_key(name):
def handler(**kwargs):
return self.__makerequest(name, **kwargs)
self.__handlerCache[name] = handler
return self.__handlerCache[name]
...
当有人调用FogBugz.search(q='bug')时,他们实际上不会调用搜索方法。相反,getattr通过创建一个新函数来处理调用,该函数包装了makerequest方法,该方法将适当的HTTP请求发送给web API。任何错误都将由web服务分派并传递回用户。
Monkeypatching对象
Python中的每个对象都有__dict__成员,用于存储对象的属性。所以,你可以这样做:
class Foo(object):
def __init__(self, arg1, arg2, **kwargs):
#do stuff with arg1 and arg2
self.__dict__.update(kwargs)
f = Foo('arg1', 'arg2', bar=20, baz=10)
#now f is a Foo object with two extra attributes
可以利用这一点向对象任意添加属性和函数。这也可以用来创建一个快速和肮脏的结构类型。
class struct(object):
def __init__(**kwargs):
self.__dict__.update(kwargs)
s = struct(foo=10, bar=11, baz="i'm a string!')
...dict.get()有一个默认值None,从而避免KeyErrors:
In [1]: test = { 1 : 'a' }
In [2]: test[2]
---------------------------------------------------------------------------
<type 'exceptions.KeyError'> Traceback (most recent call last)
<ipython console> in <module>()
<type 'exceptions.KeyError'>: 2
In [3]: test.get( 2 )
In [4]: test.get( 1 )
Out[4]: 'a'
In [5]: test.get( 2 ) == None
Out[5]: True
甚至在“现场”指定这个:
In [6]: test.get( 2, 'Some' ) == 'Some'
Out[6]: True
你可以使用setdefault()来设置一个值,如果它不存在就返回:
>>> a = {}
>>> b = a.setdefault('foo', 'bar')
>>> a
{'foo': 'bar'}
>>> b
'bar
元组在for循环、列表推导式和生成器表达式中的解包:
>>> l=[(1,2),(3,4)]
>>> [a+b for a,b in l ]
[3,7]
在这个习语中,用于迭代字典中的(键,数据)对:
d = { 'x':'y', 'f':'e'}
for name, value in d.items(): # one can also use iteritems()
print "name:%s, value:%s" % (name,value)
打印:
name:x, value:y
name:f, value:e
列举
用enumerate包装一个可迭代对象,它将生成项目及其索引。
例如:
>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>
引用:
Python教程循环技术
Python文档-内置函数-枚举
PEP 279