Identificateurs Unicode en Python?

je veux construire une fonction Python qui calcule,

alt text

et je voudrais nommer ma fonction de sommation Σ. De la même façon, je voudrais utiliser Π pour le produit, et ainsi de suite. Je me demandais s'il y avait un moyen de nommer une fonction python de cette façon?

def Σ (..):
 ..
 ..

Qui est, Python unicode identifiants, et si oui, quelqu'un pourrait-il donner un exemple?

Merci!


la motivation originale pour ceci était un morceau de code Clojure que j'ai vu aujourd'hui qui ressemble,

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

Où Σ est une macro définie comme,

(defmacro Σ
    ... )

et j'ai trouvé ça plutôt cool.


BTW, afin de régler un couple de commentaires au sujet de la lisibilité - avec beaucoup de stats/ML code par exemple, être capable de composer des opérations avec des symboles serait vraiment utile. (En particulier pour les intégrales très complexes et al)

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

vs

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

ou même juste le personnage lambda pour lambda()!

41
demandé sur Community 2010-04-16 02:52:31

5 réponses

(je crois que c'est assez cool aussi, qui pourrait dire que nous sommes des geeks.)

vous pouvez le faire avec le code que vous avez ci-dessus en Python 3. (Cela fonctionne au moins dans mon interpréteur Python 3.1.) Voir:

Mais dans Python 2, les identificateurs ne peuvent être que des lettres ASCII, des nombres et des underscores.

41
répondu Paul D. Waite 2014-07-06 12:40:36

il vaut la peine de souligner que Python 3 ne accepte les identificateurs Unicode, mais ne permet que la lettre ou le nombre comme des symboles (voir http://docs.python.org/3.3/reference/lexical_analysis.html#identifiers pour plus de détails). C'est pourquoi Σ fonctionne (rappelez-vous que c'est une lettre grecque, pas seulement un symbole mathématique), mais √ ne fonctionne pas.

15
répondu asmeurer 2014-02-18 23:31:46

(cette réponse se veut un addenda mineur et non une réponse complète)

le gotcha supplémentaire aux identificateurs unicode (que @mike-desimone mentionne et que j'ai découvert rapidement quand j'ai pensé que c'était un thread cool et commuté sur un terminal pour jouer avec), est les versions multiples de chaque glyphe ne sont pas équivalentes, en ce qui concerne la façon dont vous obtenez à chaque glyphe sur chaque plate-forme. Par exemple Σ (alias lettre majuscule grecque sigma, alias U + 03A3, [ne peut pas trouver un mac direct la méthode de saisie]) est très bien, mais malheureusement ∑ (aka N-aire de Sommation , alias U+2211 , alias opt/alt-w à l'aide de Mac OS X) n'est pas un identificateur valide.

>>> Σ = 20
>>> Σ
20

mais

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

en utilisant Σ spécifiquement (et probablement unicode chars en général) comme un identifiant pourrait générer quelques erreurs très difficiles à diagnostiquer si vous avez plusieurs développeurs sur plusieurs plates-formes contribuant à votre code, par exemple, déboguez visuellement:

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

les deux glyphes sont plus faciles à différencier sur cette page, mais selon la police utilisée, cela peut ne pas être le cas.

même le traceback n'est pas beaucoup plus clair à moins que Σ ne soit imprimé près du ∑

  File "~/Dev/play_python33/identifiers.py", line 12
    print(∑([2, 2, 2, 2, 2]))
            ^
SyntaxError: invalid character in identifier
13
répondu Peter Hanley 2015-04-24 18:43:50

selon est-il mauvais , vous pouvez utiliser certains caractères unicode, mais pas tous: vous êtes limité aux caractères identifiés comme des lettres.

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

D'ailleurs: je pense qu'il est très cool de pouvoir utiliser unicode comme identificateurs - et je souhaite, je pourrais utiliser tout.

j'utilise le disposition de clavier néo , qui me donne des symboles grecs et mathématiques sur les couches supplémentaires:

αβχδεφγήμικλνοπήστ [&ωξυ

∀⇐ℂΔ∃ΦΓΨ∫Λ⇔Σ∈ℚℝ∂⊂√∩Ξ

13
répondu Arne Babenhauserheide 2017-04-12 07:31:22

Python 2.x ne supporte pas les identificateurs unicode, et par conséquent ne supporte pas Σ comme un identifiant. Python 3.x does supporte les identificateurs unicode, bien que de nombreuses personnes obtiendront cross si elles doivent éditer des fichiers source avec, par exemple, les identificateurs A et Α (latin a et Majuscule alpha).) Sigma est souvent assez lisible, mais tout de même, pas aussi lisible que le mot sigma, pourquoi s'embêter?

6
répondu Thomas Wouters 2010-04-15 22:59:31