Python中的Unicode标识符?
我想写一个Python函数来计算一些东西,
我想把我的求和函数命名为Σ。类似地,我也想用Π来表示乘积,等等。我在想,Python有没有办法让函数用这种方式命名呢?
def Σ (..):
..
..
也就是说,Python支持使用unicode字符作为标识符吗?如果可以的话,有人能给个例子吗?
谢谢!
我最初的想法是因为今天看到一段Clojure代码,里面有这样的内容,
(defn entropy [X]
(* -1 (Σ [i X] (* (p i) (log (p i))))))
其中Σ是一个宏,定义为,
(defmacro Σ
... )
我觉得这个挺酷的。
顺便说一下,针对一些关于可读性的评论——在很多统计和机器学习的代码中,能够用符号来组合操作会非常有帮助。(尤其是对于一些非常复杂的积分等)
φ(z) = ∫(N(x|0,1,1), -∞, z)
和
Phi(z) = integral(N(x|0,1,1), -inf, z)
甚至只是用λ这个字符来表示lambda()!
5 个回答
(这个回答只是一个小补充,不是完整的答案)
关于unicode标识符,还有一个需要注意的地方(@mike-desimone提到过,我在看到这个有趣的话题后也很快发现了),就是每个字符的不同版本在不同平台上并不完全相同。举个例子,Σ(也叫希腊字母大写西格玛,编码是U+03A3,找不到直接的Mac输入法)是可以用的,但不幸的是,∑(也叫做N-元求和,编码是U+2211,在Mac OS X上可以用opt/alt-w输入)就不是一个有效的标识符。
>>> Σ = 20
>>> Σ
20
但是
>>> ∑ = 20
File "<input>", line 1
∑ = 20
^
SyntaxError: invalid character in identifier
如果你专门使用Σ(可能unicode字符一般都是这样)作为标识符,可能会导致一些很难排查的错误,尤其是当多个开发者在不同平台上共同开发代码时。比如,看看这个视觉上的调试:
这两个字符在这个页面上比较容易区分,但根据使用的字体,情况可能就不一样了。
即使是错误追踪信息也不太清楚,除非Σ和∑被打印在一起。
File "~/Dev/play_python33/identifiers.py", line 12
print(∑([2, 2, 2, 2, 2]))
^
SyntaxError: invalid character in identifier
(我觉得这也挺酷的,这可能说明我们是极客。)
你可以用上面那段代码在Python 3里这么做。(至少在我的Python 3.1解释器里是可以的。)看看这里:
- http://docs.python.org/py3k/reference/lexical_analysis.html#identifiers
- http://www.python.org/dev/peps/pep-3131/
不过在Python 2中,变量名只能用ASCII字母、数字和下划线。