Подтвердить что ты не робот

Идентификаторы Unicode в Python?

Я хочу построить функцию Python, которая вычисляет,

alt text

и хотел бы назвать мою функцию суммирования Σ. Аналогичным образом, мы хотели бы использовать Π для продукта и т.д. Мне было интересно, можно ли назвать функцию python таким образом?

def Σ (..):
 ..
 ..

То есть, поддерживает ли Python идентификаторы юникода, и если да, может ли кто-нибудь предоставить ему пример?

Спасибо!


Оригинальная мотивация для этого была частью кода Clojure, который я видел сегодня, который выглядит как

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

где Σ - макрос, определенный как

(defmacro Σ
    ... )

и я подумал, что это довольно круто.


BTW, чтобы рассмотреть пару комментариев о читаемости - с большим количеством статистики/кода ML, например, возможность компоновки операций с символами будет действительно полезна. (Особенно для действительно сложных интегралов и др.)

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

против

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

или даже только символ лямбда для лямбда()!

4b9b3361

Ответ 1

(Я думаю, что это тоже довольно круто, это может означать, что это были geeks.)

Вы можете сделать это с помощью кода, который вы указали выше в Python 3. (Он работает, по крайней мере, в моем интерпретаторе Python 3.1.) См.:

Но в Python 2 идентификаторы могут быть только буквами ASCII, цифрами и символами подчеркивания.

Ответ 2

В соответствии с это плохо, вы можете использовать некоторые символы юникода, но не все: вы ограничены символами, обозначенными как буквы.

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

Кроме того: я считаю, что очень удобно использовать unicode в качестве идентификаторов - и я хочу, я мог бы использовать все.

Я использую раскладка Neo клавиатуры, которая дает мне греческие и математические символы на дополнительных слоях:

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

Ответ 3

Стоит отметить, что Python 3 поддерживает Unicode-идентификаторы, но допускает только буквенные или числовые символы (подробнее см. http://docs.python.org/3.3/reference/lexical_analysis.html#identifiers). Вот почему Σ работает (помните, что это греческая буква, а не только математический символ), но √ нет.

Ответ 4

Python 2.x не поддерживает идентификаторы Unicode и, следовательно, не поддерживает Σ в качестве идентификатора. Python 3.x поддерживает идентификаторы юникода, хотя многие люди получат возможность перекрещиваться, если им придется редактировать исходные файлы, например, с идентификаторами A и A (латинская A и греческая столица альфа.) Sigma часто достаточно читаема, но все же, а не как читается как слово сигма, так зачем беспокоиться?

Ответ 5

(этот ответ должен быть небольшим дополнением, а не полным ответом)

Дополнительные ключи к unicode-идентификаторам (которые @mike-desimone упоминает, и я быстро обнаружил, что, когда я думал, что это крутой поток и переключился на терминал, чтобы играть с ним), несколько версий каждого глифа не эквивалентны, в отношении того, как вы добираетесь до каждого глифа на каждой платформе. Например, Σ (aka греческая прописная сигма, ака U + 03A3, [не может найти метод прямого ввода в макете]) хороша, но, к сожалению, Σ (aka N-ary Summation, aka U + 2211, aka 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