Hidden Feature 系列(Python 篇)

原帖已经被 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.

Advertisements
Hidden Feature 系列(Python 篇)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s