2010-04-15 16 views
36

ich eine Python-Funktion bauen möchten, die,Unicode-Bezeichner in Python?

alt text

und möchte meine Summenfunktion Σ nennen berechnet. In ähnlicher Weise möchte ich Π für Produkt und so weiter verwenden. Ich habe mich gefragt, ob es eine Möglichkeit gibt, eine Python-Funktion auf diese Weise zu benennen?

def Σ (..): 
.. 
.. 

Das heißt, Python-Unterstützung Unicode-Kennungen, und wenn ja, könnte jemand ein Beispiel dafür zur Verfügung stellen?

Danke!


Ursprüngliche Motivation dafür war ein Stück Clojure Code sah ich heute, die wie, wie, dass

(defmacro Σ 
    ...) 

und ich dachte, definiert sieht

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

wo Σ ist ein Makro war ziemlich cool.


BTW, ein paar Kommentare über die Lesbarkeit zu adressieren - mit vieler Statistik/ML Code zum Beispiel wäre wirklich hilfreich in der Lage, Operationen mit Symbolen zu komponieren. (Vor allem für wirklich komplexe Integrale et al)

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

vs

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

oder auch nur das Lambda-Zeichen für Lambda()!

+6

Obwohl nicht so cool, Pythons Summenfunktion ziemlich elegant ist: 'Summe()' –

+0

zustimmen. Ich meinte mehr für andere Dinge hier, wie Integrale, griechische Buchstaben, et al. – viksit

+2

Klingt wie eine schreckliche Idee für eine einfache Eingabe (vermutlich $ \ sum $ nicht funktionieren würde, nicht wahr?) –

Antwort

39

(Ich denke, es ist ziemlich cool zu, das könnte bedeuten, wir Geeks sind.)

Sie sind fein diese Sie oben mit dem Code zu tun haben, in Python 3. (Es funktioniert in meinem Python 3.1 Interpreter Siehe mindestens):.

Aber in Python 2, Bezeichner nur Buchstaben ASCII sein können, Zahlen und unders Kerne.

+1

... "Buchstaben" bedeutet hier "ASCII-Buchstaben". – EOL

6

Python 2.x unterstützt keine Unicode-Identifikatoren, und folglich auch nicht als Kennung Σ unterstützen Fall ist. Python 3.x tut Unterstützung Unicode-Kennungen, obwohl viele Menschen Kreuz bekommen, wenn sie müssen Quelldateien mit beispielsweise bearbeiten, Kennungen A und Α (lateinisch A und griechische Hauptstadt alpha.) Sigma ist oft lesbar genug, aber immer noch , nicht so leserlich wie die wort sigma, also warum stören?

+7

Ich denke, Lesbarkeit von Wörtern gegenüber Symbolen hängt vom Kontext ab. Wenn ich etwas mathy lese, finde ich Symbole (z. B. "x + y") besser lesbar als die wortgleichen Entsprechungen, die man in AppleScript erhalten würde (z. B. "addiere x zu y"). Die Symbole sind "tserer", und im Allgemeinen lässt man die Formerkennung allein ausklingen, was meiner Meinung nach leichter für das Gehirn ist als das Lesen. Ich mache nicht genug mathy Sachen, um das Bedürfnis zu haben, meinem Code ein Sigma-Zeichen hinzuzufügen. –

+0

Sicher, es gibt viele Fälle, in denen Symbole besser lesbar sind als Wörter. Oder wo Nicht-ASCII-Zeichen Dinge besser ausdrücken. Ich habe hauptsächlich die Tatsache kommentiert, dass ein Bezeichner, der aus einem einzelnen Sigma besteht, nicht wirklich eine Verbesserung gegenüber dem Wort "Sigma" ist :) –

+0

Ich habe gerade einen Eintrag dafür hinzugefügt. Versuchen Sie, etwas wie, Return (Lambda x: N/(sigma * (2 * numpy.pi) **. 5) * numpy.e ** (- (x-mu) ** 2/(2 * sigma **) 2))) hehe. – viksit

13

Nach is it bad, können Sie einige Unicode-Zeichen verwenden, aber nicht alle: Sie sind Zeichen als Buchstaben identifiziert beschränkt.

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

Übrigens: Ich denke, es ist sehr cool zu können, Unicode als Bezeichner verwenden - und ich wünsche, ich alle nutzen könnten.

Ich benutze die neo keyboard layout, die mir griechische und mathematische Symbole auf zusätzliche Schichten gibt:

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

+3

Außerdem gibt es oft unterschiedliche Versionen von Zeichen, die auch griechische Buchstaben sind. Zum Beispiel ist das griechische Hauptsigma U + 03A3, während das mathematische Sigma U + 1D6BA, U + 1D6F4, U + 1D72E, U + 1D768 oder U + 1D7A2 ist, je nach Styling. In ähnlicher Weise ist das griechische Haupt-Omega U + 03A9, das Mathematik-Omega beginnt bei U + 1D6C0 und das Ohms-Symbol ist U + 2126. –

+1

Eine weitere nette Möglichkeit, die meisten Symbole einzugeben, ist der Verfassen-Schlüssel, z. unter Windows über [WinCompose] (https://github.com/SamHocevar/wincompose) –

11

(diese Antwort soll ein kleiner Nachtrag keine vollständige Antwort sein)

Die zusätzliche Gotcha zu Unicode-Kennungen (das @ mike-DeSimone erwähnt und ich entdeckte schnell, als ich dachte, das ist ein cooles Thread war und eingeschaltet zu einem Terminal, um damit zu spielen), ist die Vielzahl von Versionen jeder Glyphe nicht gleichwertig, in Bezug darauf, wie Sie zu jeder Glyphe auf jeder Plattform gelangen. Zum Beispiel ist Σ (aka griechischer Großbuchstabe Sigma, alias U + 03A3, [kann eine direkte Mac-Eingabemethode nicht finden]) in Ordnung, aber leider Σ (alias N-äre Summation, alias U + 2211, alias opt/alt-w mit Mac OS X) ist kein gültiger Bezeichner.

>>> Σ = 20 
>>> Σ 
20 

aber

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

Mit Σ speziell (und wahrscheinlich auch im allgemeinen Unicode-Zeichen) als Kennung könnte einige sehr schwer erzeugen Fehler zu diagnostizieren, wenn Sie Ihren Code mehrere Entwickler auf mehreren Plattformen haben einen Beitrag, zum Beispiel debug diese optisch:

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

Die beiden Glyphen sind leichter zu unterscheiden auf Diese Seite, aber abhängig von der verwendeten Schriftart, kann dies nicht der Fall sein.

Auch die Zurückverfolgungs nicht viel klarer ist, es sei denn Σ in der Nähe des

Σ gedruckt wird
File "~/Dev/play_python33/identifiers.py", line 12 
    print(∑([2, 2, 2, 2, 2])) 
      ^
SyntaxError: invalid character in identifier 
+1

Ein weiterer Fehler ist, dass es mehrere Glyphen gibt, die * äquivalent sind. Definiere "φ = 5", dann "φ ist φ" → True – endolith