Python中的Unicode标识符?

时间:2010-04-15 22:52:32

标签: python unicode identifier

我想构建一个计算的Python函数,

alt text

并想命名我的求和函数Σ。以类似的方式,想用Π作产品,依此类推。我想知道是否有办法以这种方式命名python函数?

def Σ (..):
 ..
 ..

也就是说,Python是否支持unicode标识符,如果是这样,有人可以为它提供一个示例吗?

谢谢!


最初的动机是我今天看到的Clojure代码,看起来像,

(defn entropy [X]
      (* -1 (Σ [i X] (* (p i) (log (p i))))))

其中Σ是定义为的宏,

(defmacro Σ
    ... )

我觉得这很酷。


BTW,为了解决一些关于可读性的评论 - 例如,使用大量的统计数据/ ML代码,能够用符号组合操作将非常有用。 (特别是对于非常复杂的积分等)

φ(z) = ∫(N(x|0,1,1), -∞, z)

VS

Phi(z) = integral(N(x|0,1,1), -inf, z)

甚至只是lambda()的lambda字符!

5 个答案:

答案 0 :(得分:43)

(我认为这也很酷,这可能意味着我们是极客。)

你可以使用上面在Python 3中的代码执行此操作。(至少在我的Python 3.1解释器中有效。)请参阅:

但在Python 2中,标识符只能是ASCII字母,数字和下划线。

答案 1 :(得分:16)

值得指出的是,Python 3 支持Unicode标识符,但只允许使用字母或数字符号(有关完整详细信息,请参阅http://docs.python.org/3.3/reference/lexical_analysis.html#identifiers)。这就是为什么Σ有效(记住它是一个希腊字母,而不仅仅是一个数学符号),但√没有。

答案 2 :(得分:14)

(这个答案是一个次要的附录而不是一个完整的答案)

unicode标识符的附加问题(当我认为这是一个很酷的线程并切换到一个终端来玩它时,@ mike-desimone提到我很快就发现了),每个字形的多个版本都不相同,关于如何到达每个平台上的每个字形。例如Σ(又名希腊大写字母sigma,又名U + 03A3,[找不到直接的mac输入法])很好,但不幸的是Σ(又名 N-ary Summation ,又名 U + 2211 ,又名 opt / alt-w ,使用Mac OS X)不是有效的标识符。

>>> Σ = 20
>>> Σ
20

但是

>>> ∑ = 20
File "<input>", line 1
  ∑ = 20
  ^
SyntaxError: invalid character in identifier

如果在多个平台上有多个开发人员为您的代码做出贡献,那么使用Σ专门(通常可能是unicode字符)作为标识符可能会产生一些非常难以诊断的错误,例如,可视化调试:

∑ looks very similar to Σ, depending on the typeface selected

这两个字形在此页面上更容易区分,但根据使用的字体,可能不是这种情况。

除非在Σ

附近打印Σ,否则即使回溯也不太清楚
  File "~/Dev/play_python33/identifiers.py", line 12
    print(∑([2, 2, 2, 2, 2]))
            ^
SyntaxError: invalid character in identifier

答案 3 :(得分:13)

根据is it bad,您可以使用一些unicode字符,但不是全部:您只能使用标识为字母的字符。

>>> α = 3  
>>> Σ = sum   
>>> import math  
>>> √ = math.sqrt  
  File "<stdin>", line 1  
    √ = 3  
      ^  
SyntaxError: invalid character in identifier

此外:我认为能够使用unicode作为标识符非常酷 - 我希望,我可以使用所有。

我使用neo keyboard layout,它在额外的图层上提供了希腊语和数学符号:

αβχδεφγψιθκλνοπφστ[&安培;ωξυζ
∀⇐ℂΔ∃ΦΓΨ∫Λ⇔Σ∈ℚℝ∂⊂√∩Ξ

答案 4 :(得分:6)

Python 2.x不支持unicode标识符,因此不支持Σ作为标识符。 Python 3.x 确实支持unicode标识符,但是如果他们必须使用例如标识符A和Α(拉丁语A和希腊语大写字母alpha)来编辑源文件,许多人将会交叉。足够可读,但仍然不像 sigma那样可读,为什么还要麻烦?