web-dev-qa-db-ja.com

PythonのUnicode識別子?

Python計算する関数を作成したいのですが、

alt text

そして、私の総和関数にΣという名前を付けたいと思います。同様に、製品にuseを使用したい、などです。 python関数にこの方法で名前を付ける方法があるかどうか疑問に思っていましたか?

def Σ (..):
 ..
 ..

つまり、PythonはUnicode識別子をサポートしていますか。サポートしている場合、誰かがその例を提供できますか?

ありがとう!


これの元々の動機は、私が今日見たClojureコードの一部でした。

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

ここで、Σは次のように定義されたマクロです。

(defmacro Σ
    ... )

とてもクールだと思いました。


ところで、可読性に関するいくつかのコメントに対処するには、たとえば、多くの統計/ MLコードを使用して、記号で操作を構成できると非常に役立ちます。 (特に本当に複雑な積分などの場合)

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

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

あるいは、lambda()のlambda文字さえ!

50
viksit

(私もそれがかなりクールだと思います、それは私たちがオタクであることを意味するかもしれません。)

Python 3.で上記のコードを使用してこれを実行しても問題ありません(少なくとも、私のPython 3.1インタプリタで動作します)。参照):

ただし、Python 2では、識別子はASCII文字、数字、およびアンダースコアのみにすることができます。

44
Paul D. Waite

Python 3doesはUnicode識別子をサポートしますが、記号のような文字または数字のみを許可することに注意してください(- http://docs.python.org/3.3/reference/lexical_analysis.html#identifiers 完全な詳細)Σが機能するのはそのためです(これは単なる数学記号ではなくギリシャ文字であることを忘れないでください)。 √ありません。

17
asmeurer

(この答えは完全な答えではなく、小さな補遺であることを意図しています)

ユニコード識別子(@ mike-desimoneが言及していて、これがクールなスレッドだと思ってすぐに発見し、それを遊ぶためにターミナルに切り替えた)の追加の落とし穴は、各グリフの複数のバージョンが同等ではないことです。各プラットフォームで各グリフに到達する方法。たとえば、Σ(別名ギリシャ大文字sigma、別名U + 03A3、[直接MAC入力メソッドが見つからない])は問題ありませんが、残念ながら∑(別名N項合計、別名- + 2211、別名opt/alt-w Mac OS Xを使用)は有効な識別子ではありません。

>>> Σ = 20
>>> Σ
20

だが

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

複数のプラットフォームで複数の開発者がコードに関与している場合、たとえば、これを視覚的にデバッグする場合、識別子としてΣを使用すると(おそらく一般的にユニコード文字)、エラーの診断が非常に困難になる可能性があります。

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

このページでは2つのグリフを区別する方が簡単ですが、使用するフォントによっては、これが当てはまらない場合があります。

Σがnearの近くに印刷されない限り、トレースバックも明確ではありません。

  File "~/Dev/play_python33/identifiers.py", line 12
    print(∑([2, 2, 2, 2, 2]))
            ^
SyntaxError: invalid character in identifier
14
Peter Hanley

悪いのか によると、一部のUnicode文字を使用できますが、すべてを使用できるわけではありません。文字として識別される文字に制限されます。

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

その上、Unicodeを識別子として使用できるのはとてもクールだと思います-そして、私が望むのは、すべてを使用できることです。

neo keyboard layout を使用します。これにより、追加のレイヤーにギリシャ語と数学の記号が表示されます。

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

13

Python 2.xはUnicode識別子をサポートしていないため、識別子としてΣをサポートしていません。 Python 3.x does Unicode識別子をサポートしますが、たとえば識別子AやΑ(ラテンAギリシャ語の大文字のアルファ。)シグマは十分に読みやすいことが多いですが、それでもWordシグマほど読みにくいので、なぜわざわざですか。

6
Thomas Wouters