Python中的Unicode标识符?

63 投票
5 回答
25890 浏览
提问于 2025-04-15 21:40

我想写一个Python函数来计算一些东西,

alt text

我想把我的求和函数命名为Σ。类似地,我也想用Π来表示乘积,等等。我在想,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 个回答

22

(这个回答只是一个小补充,不是完整的答案)

关于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
31

值得注意的是,Python 3 支持 Unicode 标识符,但只允许字母或类似数字的符号(想了解更多细节可以查看 这个链接)。所以,Σ这个符号可以用(记住它是个希腊字母,不只是个数学符号),但√就不行。

如果你感兴趣,我做了一个网站,列出了所有可以在 Python 变量中使用的 Unicode 字符 这个链接(要注意,这里面的字符数量非常多,实际上超过了100000个)。

50

(我觉得这也挺酷的,这可能说明我们是极客。)

你可以用上面那段代码在Python 3里这么做。(至少在我的Python 3.1解释器里是可以的。)看看这里:

不过在Python 2中,变量名只能用ASCII字母、数字和下划线。

撰写回答