it-swarm.cn

在变量名中使用Unicode字符是否不好?

我最近尝试将排名算法AllegSkill实施为Python 3。

这是数学的样子:

alt text

不,真的。

这就是我写的:

t = (µw-µl)/c  # those are used in
e = ε/c        # multiple places.
σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

我实际上以为Python= 3不接受 要么 ²作为变量名。

>>> √ = lambda x: x**.5
  File "<stdin>", line 1
    √ = lambda x: x**.5
      ^
SyntaxError: invalid character in identifier

我疯了吗?我应该求助于ASCII版本吗?为什么? ASCII仅上述版本更难验证公式的等效性?

请注意,我了解一些Unicode字形看起来非常相似,而有些像(或者是▗▖)或like在书面代码中毫无意义。但是,数学或箭头字形几乎不是这种情况。


对于每个请求,仅ASCII版本将类似于以下内容:

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

...算法的每个步骤。

84
badp

我强烈感到,只用ssigma替换σ会很愚蠢,几乎是脑死了。

潜在的收益是什么?好的,我们等着瞧 …

  • 它会提高可读性吗?不,一点也不。如果是这样,那么原始公式无疑也将使用拉丁字母。

  • 它会改善可写性吗?乍一看,是的。但是第二,没有。因为这个公式是永不改变(嗯,“永不”)。通常,无需更改代码,也无需使用这些变量进行扩展。因此,可写性-仅此一次-不是问题。

就个人而言,我认为编程语言比数学公式具有一个优势:您可以使用有意义的表达性标识符。在数学中,通常不是这种情况,因此我们求助于一个字母的变量,有时使它们成为希腊文。

但是希腊语不是问题。非描述性的一个字母的标识符是。

因此,要么保留原始符号……毕竟,如果编程语言does支持标识符中的Unicode,那么就不会有技术障碍。或使用有意义的标识符。不要只用拉丁字形代替希腊字形。或阿拉伯文或印地文。

54
Konrad Rudolph

就个人而言,我不希望看到代码,我必须调出字符映射表才能再次键入它。即使unicode紧密匹配算法中的内容,也确实损害了可读性和编辑能力。一些编辑器甚至可能没有支持该字符的字体。

那有什么替代方案,只需顶上//µ = u并用ascii编写所有内容?

34
TheLQ

此参数假定您输入Unicode或阅读希腊字母都没有问题

这是争论:您想要pi还是circular_ratio?

在这种情况下,我更喜欢pi,而不是circular_ratio,因为自从我上小学以来就已经了解了pi,并且可以预期pi的定义对于每个值得他深造的程序员都根深蒂固。因此,我不介意键入π来表示circular_ratio。

但是,那

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

要么

σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

对我来说,这两个版本都是不透明的,就像piπ一样,except我在小学时没有学过这个公式。 winner_sigmaWwin对我或任何其他阅读代码的人没有任何意义,并且不使用σw不会使它变得更好。

因此,使用描述性名称,例如total_scorewinning_ratio等将比使用仅发音希腊字母的ascii名称更好地提高可读性。问题不是我无法阅读希腊字母,但我无法将字符(无论是否希腊语)与变量的“含义”相关联。

当您发表评论时,您当然可以理解问题所在:You should have seen the paper. It's just eight pages...。问题是,如果您将变量命名基于纸张,那么该纸张的命名是出于简洁而不是可读性的考虑而选择单字母名称(无论它们是否是希腊字母),那么人们将不得不阅读纸张才能将字母与字母相关联。 “含义”;这意味着您为人们理解您的代码设置了人为的障碍,这总是一件坏事。

即使您生活在仅ASCII的世界中,a * b / 2alpha * beta / 2都是三角形区域公式height * base / 2的同等不透明渲染。随着公式复杂度的增加,使用单字母变量的不可读性呈指数增长,而AllegSkill公式当然不是一个琐碎的公式。

单个字母变量仅作为简单的循环计数器才可接受,无论它们是希腊字母还是ascii单字母,我都不会在意;其他变量不应仅由单个字母组成。我不在乎您是否使用希腊字母作为名称,但是当您使用它们时,请确保我可以将这些名称与“含义”相关联,而无需阅读其他地方的任意论文。

在读小学时,我绝对不会介意使用诸如+,-,×,÷等符号表示基本算术的数学表达式,而√()将是平方根函数。小学毕业后,我不介意添加一个闪亮的新符号:∫用于整合。注意趋势,这些都是运算符。与变量名相比,运算符的使用率要高得多,但是它们以完全不同的含义被重用的频率较小(在数学家重用运算符的情况下,新含义通常仍具有旧含义的一些基本属性;情况并非如此)重用变量名时)。

总之,不,使用Unicode字符作为变量名也不错。但是,使用单字母名称作为变量名称总是很糟糕,并且允许使用Unicode名称不是使用单字母变量名称的许可。

31
Lie Ryan

你懂代码吗?还有其他需要阅读的人吗?如果是这样,那没有问题。

我个人很高兴看到纯ASCII源代码的背面。

14
user4051

是的,您失去了理智。我会亲自在注释中引用纸张和公式编号,然后将所有内容都以纯ASCII格式编写。这样,任何有兴趣的人都可以将代码和公式关联起来。

9
zvrba

我会说使用Unicode变量名称是一个坏主意,原因有两个:

  1. 他们是要输入的PITA。

  2. 它们通常看起来与英文字母几乎相同。这就是为什么我讨厌在数学符号中看到希腊字母的原因。试着将p告诉rho。这是不容易的。

5
dsimcha

在这种情况下,我会说一个复杂的数学公式。

我可以说,在20年的时间里,我从未编写过如此复杂的代码,而希腊字母使它更接近原始数学。如果您听不懂,就不要维护它。

这样说,如果我不得不在遗赠给我的沼泽标准代码中维护µ和σ,我will就会找到你的住所...

4
gbn
  • 优点:看起来不错
  • 缺点:Unicode字符,因此整个含义可能会在工具链(编辑器,代码格式化程序,版本控制,较旧的编译器)中丢失

您面临的风险有多大?收益大于风险吗?

3
LennyProgrammers

在不太遥远的将来的某个时候,我们都会使用文本编辑器/ IDE/Web浏览器,这些文本编辑器/ IDE/Web浏览器可以轻松编写包括古典希腊字符等在内的编辑文本。(或者也许我们所有人都已经学会使用这种“隐藏的“我们当前使用的工具中的功能...)

但是在此之前,许多程序员很难处理程序源代码中的非ASCII)字符,因此如果要编写可能需要由其他人维护的应用程序,则不是一个好主意。 。

(顺便说一句,您可以在Python标识符中使用希腊字符,但不能使用平方根符号的原因很简单。希腊字符被归类为Unicode字母,但是平方根符号是非字母;请参见 http://www.python.org/dev/peps/pep-3131/

2
Stephen C

您没有说使用什么语言/编译器,但是通常变量名的规则是它们必须以字母字符或下划线开头,并且仅包含字母数字和下划线。 Unicode√将不被视为字母数字,因为它是一个数学符号而不是字母。但是,σ可能是(因为它在希腊字母中),并且á可能被视为字母数字。

2
tcrosley

我在 StackOverflow 上发布了类似的问题

我绝对认为在与数学有关的大量问题中使用unicode是值得的,因为它使直接读取公式成为可能,而普通ASCII则不可能。

想象一下一个调试会话:当然,您总是可以手写代码应该计算的公式以查看其是否正确。但是百分之九十的时间,您不会打扰,并且该错误可以长时间隐藏。而且没有人愿意看这个深奥的7行纯文本ASCII公式。当然,使用unicode不如tex渲染的公式好,但是它会更好。

使用长描述性名称的替代方法不可行,因为在数学中,如果标识符不短,则公式看起来会更加复杂(为什么您认为人们在十八世纪左右就开始用“ +”代替“ +”和“减”的“-”?)。

就个人而言,我还将使用一些下标和上标(我只是从 此页面 复制粘贴它们)。例如:(必须python允许√作为标识符))

√ = math.sqrt #function alias
c² = c**2
σʷ² = σʷ**2
γ² = γ**2
σ′ʷ = √(σʷ² * (1 - (σʷ²/c²)*Wʷⁱⁿ(t, e)) + γ²)

我使用上标的地方,因为unicode中没有下标等效项。 (不幸的是,unicode下标字符集非常有限。我希望有一天,将unicode下标视为变音符号,即,一个字符用于下标,另一个字符用于下标字母的组合)

最后一件事,我认为关于使用非ASCII字符的讨论主要是有偏见的,因为许多程序员从未处理过“公式密集的数学符号”。因此他们认为这个问题并不那么重要,因为他们从未经历过需要使用非ASCII标识符的大部分代码。如果您是其中之一(我直到最近才是),请考虑以下问题:假设字母“ a”不是ASCII的一部分。然后,您将对在计算非平凡的数学公式时没有希腊字母,下标和上标的问题有了一个很好的认识。

1
Bérenger

就我个人而言,我很乐意在这种情况下将编程语言视为数学家的工具,因为我实际上并没有使用生活中看起来像这样的数学。 :D当然,为什么不使用ɛ或σ或其他任何值-在这种情况下,它实际上more清晰可辨。

(尽管,我不得不说,我的首选是支持上标数字作为直接方法调用,而不是变量名称。例如2²= 2 ** 2 = 4,等等。)

0
roberto

该代码仅用于您的个人项目吗?如果是这样,发疯,随便使用。

该代码供其他人使用吗?即和某种开源应用程序?如果是这样,您可能只是在问麻烦,因为不同的程序员使用不同的编辑器,并且您不能确定所有编辑器都会正确支持unicode。另外,当源代码文件的类型为d/cat'd时,并非所有命令外壳都可以正确显示它,如果需要在html中显示它,则可能会遇到问题。

0
GrandmasterB