原帖已经被 close 封存。python 说实在的惊讶的并不是很多,比较亲民的语言。
连续比较
一般都是需要 and/or 连接的,python 支持 1<x<4 这种表达。
RE 的调试
据说可以在 re.compile 的时候传递 re.DEBUG 进去。不过看不大出来有啥明显的作用…
enumerate
便于需要 index 的遍历
generator
可以直接用于循环而不生成整个序列,好处是类似 lazy 的效果。注意产生 generator 的语法
x = (n for n in range(0, 5)) y = [n for n in range(0, 5)]
其中前者是 generator,后者不是了。
iter
这个常用来遍历容器,但是也可以对 functor 作用,直到返回指定的值为止。
mutable default value
比如默认参数是 list,在函数里面改变这个参数的话是会影响后续的调用的。
generator 的 send
知道了 generator 这个概念之后应该还要知道 a = (yield b) 这种语句是可以接受 send 的,也就是说你可以通过 send 改变这个 generator 里面的状态。例子
def mygen(): """Yield 5 until something else is passed back via send()""" a = 5 while True: f = (yield a) #yield a and possibly get f in return if f is not None: a = f #store the new value
对花括号的支持
默认情况下 python 使用的空白对齐进行的 parsing,你可以如下的弄成 C 风格的
from __future__ import braces
slice 操作第三个参数
对 list 来说除了 1:5 之外还有 1:5:2 这种表达,对,最后一个参数是步长。
decorator
python 的 decorator 就是一个函数的函数,跟 scala 通过 curry 产生的不大一样。
for-else
其实类似语法糖,等价于 break 之后通过某个 flag 进去的那个代码块。
字典的 __missing__
似乎就是为了处理缺失 key 情形。
in-place swap
其实是 tuple 赋值,不晓得 c++ 之类的 tuple 能这样不…
tuple 和字典的 unpack
传递函数参数的时候可以分别用 * 和 ** 将其展开,这也是一种参数化函数调用的方式。
动态产生类型
NewType = type("NewType", (object,), {"x": "hello"})
跟直接定义某个类类似。
with 关键字
2.6 开始支持的一个简化复杂对象的用法,否则得从 __future__ 引入。不过感觉这个写起来简单,不知道的就傻了…
字典的 get
与直接用中括号不一样的是这个在 key 不存在时返回 None 而不是抛出异常。
property
如果希望把一些 method 弄成和 member 一样,那么可以尝试下面的 annoation,
class Property(object): def __init__(self, fget): self.fget = fget def __get__(self, obj, type): if obj is None: return self return self.fget(obj)
这样就能用了
class MyClass(object): @Property def foo(self): return "Foo!"
似乎 2.6 也有 property 这个 annoation 了。
诡异的 if 从句
这个算是 python 接近自然语言的一个设计,奇怪为啥不用 ?:,例如 3 if (y == 1) else 2。
doctest
在文档(一般是 triple quote)里面通过 >>> 写一些简单的 test case。然后可以写 _test 方法,里面 import doctest 进行单元测试。
named formatting
常见的就是字符串里面插入 %{} 作为占位符,然后 % 一个字典,另一种是直接用 {} 占位,而用 string 的 format 传入字典。
try-except-else-finally
一般都是 try-catch-finally,python 加了个 else 用来表示成功之后干的事情,避免这部分混在 try block 里面。
补全
try: import readline except ImportError: print "Unable to load readline module." else: import rlcompleter readline.parse_and_bind("tab: complete")
产生 list
就是可以在括号里面通过 for 产生 list,这个跟 scala 的 for loop 有点类似。
bool 的乘法
据说 true 算 1,而 false 算 0,与字符串也能乘…
functools 的 partial
类似 curry 的作用。
——————
And Jacob went near unto Isaac his father; and he felt him, and said, The voice is Jacob’s voice, but the hands are the hands of Esau.