我最近尝试在Python 3上实现AllegSkill排名算法。
这是数学的样子:
,不是。
>
这就是我写的内容:
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
Am我疯了吗?我应该求助于仅ASCII版本吗?为什么?请问,上述的纯ASCII版本难于验证与公式的等效性吗?
请记住,我了解一些Unicode字形看起来非常相似,而有些像(或者是▗▖),或者╦只是在书面代码中没有任何意义。但是,对于Maths或箭头字形来说几乎不是这种情况。
每个请求的纯ASCII版本如下:
winner_sigma_new = ( winner_sigma ** 2 *
( 1 -
( winner_sigma ** 2 -
general_uncertainty ** 2
) * Wwin(t,e)
) + dynamics ** 2
)**.5
#1 楼
我强烈感到,仅将σ
替换为s
或sigma
是没有意义的,并且适得其反。潜在的收益是什么?好吧,让我们看看...
它是否提高了可读性?不,一点也不。如果真是如此,那么原始公式无疑也将使用拉丁字母。乍一看,是的。但是第二,没有。因为这个公式永远不会改变(嗯,“永远”)。通常,无需更改代码,也无需使用这些变量进行扩展。因此,可写性-只是一次-并不是问题。
就个人而言,我认为编程语言相对于数学公式具有一个优势:您可以使用有意义的表达性标识符。在数学中,通常情况并非如此,因此我们求助于一个字母的变量,偶尔将其设为希腊文。非描述性的单字母标识符是
。因此,要么保留原始符号…毕竟,如果编程语言确实在标识符中支持Unicode,那么就没有技术上的障碍。或使用有意义的标识符。不要只用拉丁字形代替希腊字形。或阿拉伯文或印地文。
评论
即使编程语言支持使用某些工具,某些工具也无法读取unicode字符。我不会说使用非unicode变量名称是一个明智的决定,而且在您发表文章2.5年后,这仍然成立。
–加里·韦弗(Gary S. Weaver)
13年5月10日在18:47
@Gary:“某些工具无法读取Unicode” –因此,请更换工具,以至于废话。抱歉,这是2013年,我对这种工具的同情为零,甚至没有耐心。过多地使用有缺陷的工具会阻止进度。
–康拉德·鲁道夫(Konrad Rudolph)
13年5月11日14:54
@KonradRudolph我的观点是,某些工具不支持并且出于某种原因不能支持Unicode,因此“更改工具”并不总是正确的答案。我同意Unicode是好的,并且工具应该理解它,但这并不总是一种选择。
–user22815
2014年4月4日在16:11
@John我认为“更改工具”是一个适当的答案。您的示例特别说明了这种情况:Java .properties文件解析起来很简单。如果您确实碰巧使用了一个以.properties文件为后盾,不支持Unicode的工具链,则删除上述工具链是完全合理的(然后自己替换它,找到替代方法,或者在最坏的情况下,佣金一)。当然,这不适用于旧系统。但是对于传统系统,最佳实践的考虑都没有。
–康拉德·鲁道夫(Konrad Rudolph)
2014年3月4日在16:16
您谈到的这些“互换”问题似乎主要是Java和Windows开发人员的问题。十年前,大多数Linux世界都在UTF-8上进行了标准化。这绝对是一个工具链问题。停止使用不良工具。
–丰富的历史
2014年6月15日下午3:30
#2 楼
就个人而言,我不希望看到必须调出字符映射表才能再次键入的代码。即使unicode紧密匹配算法中的内容,也确实损害了可读性和编辑能力。一些编辑器甚至可能没有支持该字符的字体。那又有什么选择呢,只用
//µ = u
并用ascii编写一切? 评论
顺便说一句,不要以为所有键盘都能舒适地暴露标准编码键。我的键盘布局需要三个键来键入{和}(在ttys btw中失败),并且完全缺少`和〜...如果我不使用a字符映射,那么Bash脚本怎么也不需要我使用字符映射表呢?自定义键盘映射? :)
– Badp
2010年11月1日,11:31
我在本机键盘旁边安装了希腊键盘,并且可以通过一次击键在它们之间切换。在谈论IM / email上的数学运算时,这很有用...而且我已经考虑过在python脚本中使用它。
– liori
2010年11月1日,12:20
啊。只是用简单的字母替换希腊字母?毫无收获。使用有意义的变量名称,或坚持使用论文中的名称。没有创造力的理由。
–康拉德·鲁道夫(Konrad Rudolph)
2010年11月1日于16:46
只是不要混淆µ和µ ...
– Endolith
2011年5月26日在21:38
合理的编辑器对于Unicode具有合理的输入法,这使编辑这样的代码变得容易。例如,Emacs支持(其中包括)TeX和rfc1345。 TeX听起来就是这样。它使您可以为σ键入\ sigma,为→键入\ to。 rfc1345提供了一些组合,例如&s *表示σ,&->表示→。根据经验,我不担心使用比Emacs功能差的编辑器来容纳程序员。
– Tikhon Jelvis
2012年12月3日,下午6:33
#3 楼
该参数假定您在键入unicode或阅读希腊字母时都没有问题。在这种情况下,我更喜欢pi而不是circle_ratio,因为自从我上小学以来就已经了解pi了,我可以期望pi的定义对于每个值得他费心的程序员都根深蒂固。因此,我不介意键入π来表示圆弧比。
但是
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
或π
一样,只是我在小学时没有学过这个公式。 因此,请使用描述性名称,例如,
winner_sigma
和Wwin
对我或任何其他阅读代码的人都没有任何意义,而对σw
都不使用就不会使它变得更好。与使用仅发音希腊字母的ASCII名称相比,total_score
,winning_ratio
等将提高可读性。问题不是我看不懂希腊字母,但我不能将字符(无论是否问候)与变量的“含义”相关联。您当然可以自己理解问题当您评论时:
You should have seen the paper. It's just eight pages...
。问题是,如果您将变量命名基于纸张,那么该纸张的命名是出于简洁而不是可读性的考虑而选择单字母名称(无论它们是否是希腊字母),那么人们将不得不阅读纸张才能将字母与字母相关联。 “含义”;这意味着您为人们理解代码提供了人为的障碍,这总是一件坏事。 即使您生活在仅ASCII的世界中,
a * b / 2
和alpha * beta / 2
都是三角形区域公式height * base / 2
的同等不透明渲染。随着公式复杂度的提高,使用单字母变量的不可读性呈指数增长,而AllegSkill公式当然不是一个琐碎的公式。单个字母变量仅作为简单的循环计数器才可接受,无论它们是希腊字母还是ascii单字母,我都不会在意;其他变量不应仅由单个字母组成。我不在乎您是否使用希腊字母作为名称,但是当您使用它们时,请确保我可以将这些名称与“含义”相关联,而无需阅读其他地方的任意论文。 >在读小学时,我绝对不会介意使用诸如+,-,×,÷等符号表示基本算术的数学表达式,而√()将是平方根函数。小学毕业后,我不介意添加一个闪亮的新符号:∫用于整合。注意趋势,这些都是运算符。与变量名相比,运算符的使用率要高得多,但是它们以完全不同的含义被重用的频率较小(在数学家重用运算符的情况下,新含义通常仍具有旧含义的一些基本属性;情况并非如此)当重新使用变量名时)。
总而言之,不,使用Unicode字符作为变量名也不错。但是,使用单字母名称作为变量名称总是很糟糕,并且允许使用Unicode名称不是使用单字母变量名称的许可。
评论
老实说,即使我使用error_on_measured_skill_with_99th_percent_confidence而不是sigma,此处的公式也没有意义。
– Badp
2010年11月1日于15:33
@badp:长名字!=好名字。尽管如此,在某些情况下您还是无法选择一个好名字(例如,当您仅了解公式时,却不完全理解公式的各个部分所做的事情(需要完全不同的理解力)),那么在这种情况下,第二种最佳选择是用一些评论掩盖您的屁股(比将其发送给外部论文更好)。添加一个数据字典来解释变量名指的是什么,例如//σw=技能水平测量误差等
– Lie Ryan
10-11-1在15:40
@badp:说实话,仅凭这些信息,sigma就是某种软糖(可以这么说),相对于sigma而言,它使我对公式有了更好的理解。当公式难以理解时,您不想在其之上添加更多的不透明性。
– Lie Ryan
2010年11月1日于16:36
是。这个。不幸的是,我在写答案时忽略了它。
–康拉德·鲁道夫(Konrad Rudolph)
2010年11月1日于16:54
嗯,从事与统计相关的任何事情的人都知道σ表示“标准偏差”。这是该领域中非常知名的标准符号。
– TRiG
2012年11月21日,0:58
#4 楼
你懂代码吗?还有其他需要阅读的人吗?如果是这样,那就没问题。我个人很高兴看到纯ASCII源代码的背面。
评论
做完了(我想最后一行是您要查看代码的纯ASCII版本吗?)[](http://〜)
– Badp
2010年11月1日,11:24
@badp:不,是我要查看仅ASCII码的死亡。
–user4051
10-11-1在11:43
直到您开始了解在Windows 1252系统上着陆时Unicode源文件发生了什么...
–user1249
2010年11月1日,11:46
@Thorbjørn:如果它们包含BOM,那么希望什么都不会发生。
–user4051
2010年11月1日于14:04
#5 楼
是的,您失去了理智。我会亲自在注释中引用纸张和公式编号,然后将所有内容都以纯ASCII格式编写。这样,任何有兴趣的人都可以将代码和公式关联起来。评论
我很难确保代码和公式首先匹配...
– Badp
2010年11月1日在15:17
@Paul:幸运的是,Unicode已有10多年的历史了,因此可以解决异议。而且尽管不同的UTF之间没有明确的赢家,但这不是问题:不应有一个。区分它们对于软件来说是微不足道的。
–康拉德·鲁道夫(Konrad Rudolph)
2010年11月1日17:00
@Konrad:我的意思是从现在起十年后。相当多的程序仍然不支持Unicode。此外,我不同意您的断言-编写处理所有3个utf的通用反向例程并不容易。必须有一个明确的赢家。支持3种不同的UTF没有任何意义(让我们不要考虑仍然存在的其他代码页)。
– Paul Nathan
2010年11月1日于22:57
@Paul:您需要多久编写一次“通用反向例程”?这三个UTF具有不同的用途,我认为您永远不会实现合并的愿望。
–迪恩·哈丁(Dean Harding)
2010年11月1日于23:23
@Paul:拧紧这些程序。有足够的优秀编辑器知道如何处理Unicode。如果仍然没有其他编辑加入,请选择经济方法。正如Dean所说,UTF有不同的用途。它们存在是一件好事。而且我在您的多个反向例程中看不到重点。您只需要编写一次(现在就忽略规范化形式):对于代码点,而不是单个UTF。
–康拉德·鲁道夫(Konrad Rudolph)
10-11-2在7:43
#6 楼
我会说使用Unicode变量名称是一个坏主意,原因有两个:它们是要键入的PITA。
它们通常看起来几乎与英文字母相同。这就是为什么我讨厌在数学符号中看到希腊字母的原因。尝试将p告诉rho。这不容易。
评论
取决于您用来键入它们的内容。
– Endolith
2011年5月26日在21:42
#7 楼
在这种情况下,我会说一个复杂的数学公式。我可以说,在20年的时间里,我从来不必编写这种复杂的代码,而希腊字母使它与原始数学。如果您听不懂,就不应该维护它。你活着...
#8 楼
Pro:看起来不错
Con:Unicode字符,因此整个含义可能会在工具链(编辑器,代码格式化程序,版本控制,较旧的编译器)中丢失您面临的风险有多大?收益大于风险吗?
评论
工具链?什么工具链?
– Badp
2010年11月1日,11:36
编辑器,代码格式化程序,版本控制,较旧的编译器。每个接触您文件的工具和人员。我对将Unicode文件YMMV弄乱的工具有不好的经验。
– LennyProgrammers
10-11-1在12:04
#9 楼
在不久的将来,我们都会使用文本编辑器/ IDE / Web浏览器,使编写包括古典希腊字符等的编辑文本变得容易。 “我们当前使用的工具中的功能...)但是,在此之前,程序源代码中的非ASCII字符对于许多程序员来说都是很难处理的,因此,如果编写可能需要由他人维护的应用程序。
(顺便说一句,在Python标识符中可以有希腊字符但不能有平方根的原因很简单。希腊字符归为Unicode字母,平方根符号是非字母;请参见http://www.python.org/dev/peps/pep-3131/)
评论
我认为制作一个IME可以为无法直接输入字符的用户翻译字符是一个好主意。
– AndrejaKo
2010年11月1日在15:15
是的,当我们切换到DVORAK时,或多或少。 :(
– Badp
2010年11月1日15:35
@AndrejaKo Linux确实有一个接受LaTeX样式命令的IME-也就是说,您键入\ mu并插入µ。
– Badp
10-11-1在15:36
@badp非常感谢!下次启动时,我会尝试的!
– AndrejaKo
2010年11月1日在15:40
Emacs支持许多不错的输入法,使输入Unicode符号变得容易。 (包括我使用的TeX。)Emacs几乎没有未来性。 (太棒了,当然。)
– Tikhon Jelvis
2012年12月3日,下午6:53
#10 楼
您没有说使用什么语言/编译器,但是通常变量名的规则是它们必须以字母字符或下划线开头,并且仅包含字母数字和下划线。 Unicode√将不被视为字母数字,因为它是一个数学符号而不是字母。但是σ可能是(因为它在希腊字母中)并且á可能被认为是字母数字。#11 楼
就我个人而言,我很乐意在这种情况下将编程语言视为数学家的工具,因为我实际上并不使用生活中看起来像这样的数学。 :D当然,为什么不使用ɛ或σ或任何其他方法-在这种情况下,它实际上更易读。方法调用,而不是变量名。例如2²= 2 ** 2 = 4,等等)#12 楼
我在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标识符的大部分代码。
如果您是其中之一(我直到最近才是),请考虑以下问题:假设字母“ a”不是ASCII的一部分。然后,您将对在计算非平凡的数学公式时不使用希腊字母,下标和上标有一个很好的认识。
#13 楼
该代码仅用于您的个人项目吗?如果是这样,请发疯,随便使用。该代码是否供其他人使用?即和某种开源应用程序?如果是这样,您可能只是在问麻烦,因为不同的程序员使用不同的编辑器,并且您不能确定所有编辑器都会正确支持unicode。另外,当源代码文件的类型为“ d / cat”时,并非所有命令shell都能正确显示它,如果需要在html中显示它,可能会遇到问题。
#14 楼
σ
是什么,W
是什么,ε
是什么,c
是什么,γ
是什么?您要使用变量的名称来解释变量的用途。
我个人非常喜欢任何将Unicode或ASCII版本留给我维护的人,尽管ASCII版本都更好。这不会传达任何信息。
假设您用英语编写代码(我相信无论您来自哪里),ASCII都足以为您的变量赋予有意义的名称,因此实际上并不需要Unicode。
评论
如果他复制/粘贴了论文,然后尽管使用了一个字符变量名,却将其作为注释的一部分作为源代码,该怎么办?
–布赖恩
2010年11月1日13:25
对于熟悉问题域的人来说,许多这些变量名具有很强的含义。对于熟悉域名的人来说,英文名称可能不如sigma或rho那样易读。
–dsimcha
2010年11月1日于13:50
恐怕诸如rank_error_with_99_pct_confidence之类的内容太长了,实际上不会使公式更容易理解。 AllegSkill / TrueSkill称为那些sigma,因此,我相信保留他们拥有的特定于域名的名称对我来说是完全可以接受的。
– Badp
2010年11月1日15:37
@badp:好名字简洁明了;但这并不一定要完全描述。对于您的sigma,使用rank_error并在文档/注释中添加有关99%置信度的额外详细信息非常好。
– Lie Ryan
10-11-1在17:05
@dsimcha:我认为熟悉特定领域的人比从未听说过的人稀有得多。而且我认为,熟悉该域名的人将能够使用简单的英文名称,而如果不熟悉希腊的单字母变量,那么一切不熟悉的人将完全无法理解发生了什么。
–back2dos
2010年11月1日17:35
#15 楼
对于具有众所周知的数学起源的变量名,这是绝对可以接受的,甚至是首选。但是,如果您希望分发代码,则应将这些值放在模块,类等中,以便IDE自动完成功能可以“键入”奇怪的字符。使用√或²在标识符中-没那么多。
评论
那太疯狂了,完全无法阅读,而且说起来很酷。谈论unicode ... codinghorror.com/blog/2008/03/i-entity-unicode.html
我发现Python不接受算术运算作为变量是一件非常好的事情。平方根符号应表示取平方根的运算,并且不能为变量。
@ David,Python中没有这种区别。实际上,sqrt = lambda x:x **。5为我提供了一个函数(更精确地说是可调用的):sqrt(2)=> 1.41421356237。
OutputStream.🚽;