Ich habe kürzlich versucht, einen Ranking-Algorithmus, AllegSkill, in Python 3 zu implementieren.
So sieht die Mathematik aus:
Das habe ich dann geschrieben:
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
Ich dachte eigentlich, dass es Python 3 schade ist, keine √
oder nur ²
variable Namen zu akzeptieren .
>>> √ = lambda x: x**.5
File "<stdin>", line 1
√ = lambda x: x**.5
^
SyntaxError: invalid character in identifier
Bin ich verrückt? Hätte ich auf eine reine ASCII-Version zurückgreifen sollen? Warum? Wäre es nicht schwieriger, eine Nur-ASCII-Version der obigen Formeln auf Gleichwertigkeit mit den Formeln zu überprüfen?
Wohlgemerkt, ich verstehe, dass einige Unicode-Glyphen sehr ähnlich aussehen und andere wie like (oder ist das ▗▖) oder ╦ im geschriebenen Code einfach keinen Sinn ergeben. Dies ist jedoch bei Mathematik oder Pfeilsymbolen kaum der Fall.
Auf Anfrage wäre die Nur-ASCII-Version etwas in der Art von:
winner_sigma_new = ( winner_sigma ** 2 *
( 1 -
( winner_sigma ** 2 -
general_uncertainty ** 2
) * Wwin(t,e)
) + dynamics ** 2
)**.5
... für jeden Schritt des Algorithmus.
sqrt = lambda x: x**.5
wird mir eine Funktion (genauer gesagt, eine aufrufbare):sqrt(2) => 1.41421356237
.Antworten:
Ich fühle mich stark , dass nur Ersatz
σ
mits
odersigma
wäre dumm, angrenzend an hirntot.Was ist der potenzielle Gewinn? Okay, lass uns nachsehen …
Verbessert es die Lesbarkeit? Nein, nicht im geringsten. Wäre dies der Fall, hätte die ursprüngliche Formel zweifellos auch lateinische Buchstaben verwendet.
Verbessert es die Beschreibbarkeit? Auf den ersten Blick ja. Aber am zweiten, nein. Weil sich diese Formel niemals ändern wird (naja, niemals). Normalerweise muss der Code weder geändert noch mithilfe dieser Variablen erweitert werden. Beschreibbarkeit ist also - nur dieses eine Mal - kein Problem.
Persönlich denke ich, dass Programmiersprachen einen Vorteil gegenüber mathematischen Formeln haben: Sie können aussagekräftige, aussagekräftige Bezeichner verwenden. In der Mathematik ist dies normalerweise nicht der Fall, daher greifen wir auf Ein-Buchstaben-Variablen zurück und machen sie gelegentlich zu Griechisch.
Aber Griechisch ist nicht das Problem. Die nicht beschreibenden Ein-Buchstaben-Bezeichner sind.
So halten Sie entweder die ursprüngliche Schreibweise ... nach allem, wenn die Programmiersprache funktioniert in Identifikatoren Unicode unterstützt, so gibt es keine technische Barriere. Oder verwenden Sie aussagekräftige Kennungen. Ersetzen Sie griechische Glyphen nicht einfach durch lateinische. Oder arabische oder Hindi.
quelle
.properties
Dateien sind trivial zu analysieren. Wenn Sie wirklich mit einer Toolkette gearbeitet haben, die hinter.properties
Dateien kein Unicode unterstützt, ist es durchaus sinnvoll , diese Toolkette zu löschen (und sie entweder selbst zu ersetzen, eine Alternative zu finden oder im schlimmsten Fall eine in Auftrag zu geben) ). Dies gilt natürlich nicht für Altsysteme. Für ältere Systeme gilt jedoch keine der Überlegungen zu bewährten Methoden.Persönlich würde ich es hassen, Code zu sehen, in dem ich die Zeichentabelle aufrufen muss, um sie erneut einzugeben. Obwohl der Unicode genau mit dem übereinstimmt, was im Algorithmus enthalten ist, beeinträchtigt er die Lesbarkeit und die Editierbarkeit. Einige Editoren haben möglicherweise nicht einmal eine Schriftart, die dieses Zeichen unterstützt.
Was ist mit einer Alternative und einfach oben haben
//µ = u
und alles in ASCII schreiben?quelle
{
und}
(was übrigens bei ttys fehlschlägt) und es fehlt`
und~
... wie würde ein Bash-Skript nicht erfordern, dass ich eine Zeichentabelle verwende, wenn ich keine benutzerdefinierte Tastentabelle verwende? :)TeX
undrfc1345
.TeX
ist genau das, wonach es sich anhört; Sie können damit\sigma
fürσ
und\to
für eingeben→
.rfc1345
gibt Ihnen einige Kombinationen wie&s*
fürσ
und&->
für→
. Als Faustregel sorge ich mich nicht darum, Programmierer unterzubringen, die weniger fähige Editoren als Emacs verwenden.Bei diesem Argument wird davon ausgegangen, dass Sie keine Probleme mit der Eingabe von Unicodes oder dem Lesen von griechischen Buchstaben haben
Hier ist das Argument: Möchten Sie pi oder circular_ratio?
In diesem Fall würde ich pi dem circular_ratio vorziehen, weil ich pi seit meiner Grundschulzeit kennengelernt habe und ich davon ausgehen kann, dass die Definition von pi für jeden Programmierer, der sein Geld wert ist, gut verankert ist. Daher würde es mir nichts ausmachen, π als kreisförmiges Verhältnis zu tippen.
Aber was ist mit
oder
Für mich sind beide Versionen genauso undurchsichtig wie
pi
oderπ
, außer dass ich diese Formel in der Grundschule nicht gelernt habe.winner_sigma
undWwin
bedeutet nichts für mich oder für andere, die den Code lesen und wederσw
verwenden, noch verbessern sie ihn.Also, beschreibende Namen, zB
total_score
,winning_ratio
usw. erhöhen würde Lesbarkeit viel besser als die Verwendung von ASCII - Namen , die nur griechische Buchstaben aussprechen . Das Problem ist nicht, dass ich keine griechischen Buchstaben lesen kann, aber ich kann die Zeichen (griechisch oder nicht) nicht mit einer "Bedeutung" der Variablen verknüpfen.Sie verstehen sicherlich das Problem selbst , wenn Sie kommentiert:
You should have seen the paper. It's just eight pages...
. Das Problem ist, wenn Sie Ihre Variablennamen auf ein Papier stützen, bei dem Namen mit einem Buchstaben aus Gründen der Prägnanz und nicht der Lesbarkeit ausgewählt werden (unabhängig davon, ob sie griechisch sind), müssen die Leute das Papier lesen, um die Buchstaben mit einem assoziieren zu können "Bedeutung"; Das bedeutet, dass Sie eine künstliche Barriere aufbauen, damit die Leute Ihren Code verstehen können, und das ist immer eine schlechte Sache.Auch wenn Sie in einer Nur-ASCII-Welt leben, sind beide
a * b / 2
undalpha * beta / 2
eine gleichermaßen undurchsichtige Darstellungheight * base / 2
der Dreiecksflächenformel. Die Unlesbarkeit der Verwendung von Variablen mit einem Buchstaben nimmt mit zunehmender Komplexität der Formel exponentiell zu, und die AllegSkill-Formel ist sicherlich keine triviale Formel.Die Variable "Einzelbuchstaben" ist nur als einfacher Schleifenzähler zulässig, egal ob es sich um griechische Einzelbuchstaben oder ASCII-Einzelbuchstaben handelt. Keine anderen Variablen sollten nur aus einem einzigen Buchstaben bestehen. Es ist mir egal, ob Sie griechische Buchstaben für Ihre Namen verwenden, aber wenn Sie sie verwenden, stellen Sie sicher, dass ich diese Namen mit einer "Bedeutung" verknüpfen kann, ohne dass Sie irgendwo anders eine beliebige Zeitung lesen müssen.
In der Grundschule würde es mir definitiv nichts ausmachen, mathematische Ausdrücke mit Symbolen wie: +, -, ×, ÷ für Grundrechenarten zu sehen, und √ () wäre eine Quadratwurzelfunktion. Nachdem ich die Grundschule abgeschlossen habe, würde es mir nichts ausmachen, ein glänzendes neues Symbol hinzuzufügen: ∫ für die Integration. Beachten Sie den Trend, das sind alles Operatoren. Operatoren werden viel häufiger als Variablennamen verwendet, aber sie werden seltener für eine völlig andere Bedeutung wiederverwendet (in Fällen, in denen Mathematiker Operatoren wiederverwenden, enthält die neue Bedeutung häufig noch einige grundlegende Eigenschaften der alten Bedeutung; dies ist jedoch nicht der Fall bei der Wiederverwendung von Variablennamen).
Abschließend ist es nicht schlecht, Unicode-Zeichen für Variablennamen zu verwenden. Es ist jedoch immer schlecht, einzelne Buchstaben für Variablennamen zu verwenden, und die Verwendung von Unicode-Namen ist keine Lizenz für die Verwendung einzelner Buchstaben für Variablennamen.
quelle
error_on_measured_skill_with_99th_percent_confidence
anstelle von verwendesigma
.// σw = skill level measurement error
usw.Verstehst du den Code? Müssen alle anderen, die es lesen müssen? Wenn ja, gibt es kein Problem.
Persönlich würde ich mich freuen, wenn ich die Rückseite des Nur-ASCII-Quellcodes sehen könnte.
quelle
Ja, du bist verrückt. Ich würde persönlich auf die Papier- und Formelnummer in einem Kommentar verweisen und alles direkt in ASCII schreiben. Dann könnte jeder Interessierte den Code und die Formel in Beziehung setzen.
quelle
Ich würde sagen, dass die Verwendung von Unicode-Variablennamen aus zwei Gründen eine schlechte Idee ist:
Sie sind eine PITA zum Tippen.
Sie sehen oft fast so aus wie englische Buchstaben. Aus dem gleichen Grund hasse ich es, griechische Buchstaben in mathematischer Notation zu sehen. Versuchen Sie, rho von p zu unterscheiden. Es ist nicht einfach.
quelle
In diesem einen Fall würde ich sagen, dass es sich um eine komplexe mathematische Formel handelt.
Ich kann sagen, dass ich in 20 Jahren noch nie etwas so Komplexes codieren musste, und griechische Buchstaben halten es nahe an der ursprünglichen Mathematik. Wenn Sie es nicht verstehen können, sollten Sie es nicht warten.
Wenn ich sage, dass ich, wenn ich jemals µ und σ in einem Moor-Standardcode pflegen muss, den Sie mir hinterlassen haben, dann werde ich herausfinden, wo Sie leben ...
quelle
Wie groß ist das Risiko für Sie? Überwiegt der Gewinn das Risiko?
quelle
Irgendwann in nicht allzu ferner Zukunft werden wir alle Texteditoren / IDEs / Webbrowser verwenden, die das Schreiben von Bearbeitungstext einschließlich klassischer griechischer Zeichen usw. vereinfachen. (Oder vielleicht haben wir alle gelernt, dieses "versteckte" zu verwenden "Funktionalität in den Tools, die wir derzeit verwenden ...)
Bis dahin sind jedoch Nicht-ASCII-Zeichen im Programmquellcode für viele Programmierer schwierig zu handhaben und daher eine schlechte Idee, wenn Sie Anwendungen schreiben, die möglicherweise von einer anderen Person gewartet werden müssen.
(Im Übrigen ist der Grund, warum Sie in Python-Bezeichnern griechische Zeichen, aber keine Quadratwurzelzeichen verwenden können, einfach. Die griechischen Zeichen werden als Unicode-Buchstaben klassifiziert, aber das Quadratwurzelzeichen ist kein Buchstabe. Siehe http://www.python.org / dev / peps / pep-3131 / )
quelle
\mu
und sie werden installiertµ
.Sie haben nicht angegeben, welche Sprache / welchen Compiler Sie verwenden, aber normalerweise müssen Variablennamen mit einem alphabetischen Zeichen oder Unterstrich beginnen und nur alphanumerische Zeichen und Unterstriche enthalten. Ein Unicode √ würde nicht als alphanumerisch angesehen, da es sich um ein mathematisches Symbol anstelle eines Buchstabens handelt. Jedoch könnte σ sein (da es sich um das griechische Alphabet handelt) und á würde wahrscheinlich als alphanumerisch angesehen.
quelle
Ich habe die gleiche Art von Frage auf StackOverflow gestellt
Ich denke definitiv, dass es sich lohnt, Unicode in schweren mathematischen Problemen zu verwenden, da es möglich ist, die Formel direkt zu lesen, was mit einfachem ASCII unmöglich ist.
Stellen Sie sich eine Debugging-Sitzung vor: Natürlich können Sie die Formel, die der Code berechnen soll, immer von Hand schreiben, um zu prüfen, ob sie korrekt ist. In neunzig Prozent der Fälle werden Sie sich nicht darum kümmern, und der Fehler kann für eine lange, lange Zeit verborgen bleiben. Und niemand ist jemals bereit, sich diese abstruse 7-zeilige, einfache ASCII-Formel anzuschauen. Natürlich ist die Verwendung von Unicode nicht so gut wie eine von Texten gerenderte Formel, aber es ist viel besser.
Die Alternative, lange beschreibende Namen zu verwenden, ist nicht sinnvoll, da in der Mathematik die Formel noch komplizierter aussieht, wenn der Bezeichner nicht kurz ist. und "minus" durch "-"?).
Persönlich würde ich auch einige tiefgestellte und hochgestellte Zeichen verwenden (ich kopiere sie einfach von dieser Seite ). Zum Beispiel: (hatte Python erlaubt √ als Bezeichner)
Wo ich hochgestellte Zeichen verwendet habe, weil es in Unicode kein tiefgestelltes Äquivalent gibt. (Leider ist der Zeichensatz für den Unicode-Index sehr begrenzt. Ich hoffe, dass das Abonnieren von Unicode eines Tages als diakritisch betrachtet wird, dh als Kombination aus einem Zeichen für den Index und einem anderen Zeichen für den abonnierten Buchstaben.)
Eine letzte Sache, ich denke, dieses Gespräch über die Verwendung von Nicht-ASCII-Zeichen ist in erster Linie voreingenommen, weil viele Programmierer sich nie mit "formelintensiven mathematischen Notationen" beschäftigen. Sie sind der Meinung, dass diese Frage nicht so wichtig ist, weil sie nie einen wesentlichen Teil des Codes erlebt haben, für den Nicht-ASCII-Bezeichner erforderlich wären. Wenn Sie einer von ihnen sind (und ich war bis vor kurzem), bedenken Sie Folgendes: Angenommen, der Buchstabe "a" ist nicht Teil von ASCII. Dann haben Sie eine ziemlich gute Vorstellung von dem Problem, dass beim Berechnen nicht-trivialer mathematischer Formeln keine griechischen Buchstaben, Indizes oder hochgestellten Indizes vorkommen.
quelle
Ist dieser Code nur für Ihr persönliches Projekt? Wenn ja, verrückt werden, verwenden Sie, was Sie wollen.
Ist dieser Code für andere bestimmt? dh und Open-Source-App irgendeiner Art? Wenn ja, fragen Sie wahrscheinlich nur nach Problemen, weil verschiedene Programmierer verschiedene Editoren verwenden, und Sie können nicht sicher sein, dass alle Editoren Unicode korrekt unterstützen. Außerdem wird der Code nicht in allen Befehls-Shells korrekt angezeigt, wenn die Quellcodedatei vom Typ / cat'd ist, und es kann zu Problemen kommen, wenn Sie ihn in HTML anzeigen müssen.
quelle
persönlich bin ich motiviert, programmiersprachen in diesem zusammenhang als werkzeug für mathematiker zu betrachten, da ich eigentlich keine mathematik verwende, die in meinem leben so aussieht. : D Und warum nicht ɛ oder σ oder was auch immer - in diesem Zusammenhang ist es tatsächlich besser lesbar.
(Obwohl ich sagen muss, dass ich es vorziehen würde, hochgestellte Zahlen als direkte Methodenaufrufe und nicht als Variablennamen zu unterstützen. ZB 2² = 2 ** 2 = 4 usw.)
quelle
Was zum Teufel ist
σ
, was istW
, was istε
,c
und was istγ
?Sie müssen Ihre Variablen so benennen, dass der Zweck erklärt wird.
Ich persönlich würde jeden verprügeln, der die Unicode- oder ASCII-Version für mich behalten möchte, obwohl die ASCII-Version besser ist.
Was böse ist, ist das Aufrufen von Variablen
σ
oders
odersigma
odervalue
odervar1
, weil dies keine Informationen vermittelt.Angenommen, Sie schreiben Ihren Code in Englisch (ich glaube, Sie sollten es von jedem Ort aus tun), dann sollte ASCII ausreichen, um Ihren Variablen aussagekräftige Namen zu geben, sodass Unicode eigentlich nicht erforderlich ist.
quelle
rank_error_with_99_pct_confidence
ist ein bisschen zu lang und würde die Formeln eigentlich nicht leichter verständlich machen. AllegSkill / TrueSkill nennen diese Sigma, daher halte ich es für absolut akzeptabel, den domänenspezifischen Namen beizubehalten, den sie haben.rank_error
, die zusätzlichen Details, die zu 99 Prozent in der Dokumentation / im Kommentar stecken, zu verwenden und zu vertrauen.Für Variablennamen mit bekannten mathematischen Ursprüngen ist dies absolut akzeptabel - sogar bevorzugt. Wenn Sie jedoch jemals damit rechnen, den Code zu verteilen, sollten Sie diese Werte in ein Modul, eine Klasse usw. einfügen, damit die IDE die seltsamen Zeichen automatisch vervollständigen kann.
Verwenden von √ oder ² in einem Bezeichner - nicht so oft.
quelle