Niedawno próbowałem zaimplementować algorytm rankingu, AllegSkill, w Pythonie 3.
Oto jak wygląda matematyka:
Oto co napisałem:
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
Właściwie uważałem, że niefortunne jest dla Pythona 3 nieakceptowanie √
lub ²
nazw zmiennych.
>>> √ = lambda x: x**.5
File "<stdin>", line 1
√ = lambda x: x**.5
^
SyntaxError: invalid character in identifier
Czy oszalałem? Czy powinienem skorzystać z wersji tylko ASCII? Dlaczego? Czy nie byłoby trudniej zweryfikować powyższej wersji tylko ASCII pod kątem równoważności z formułami?
Pamiętaj, że rozumiem, że niektóre glify Unicode wyglądają bardzo podobnie do siebie, a niektóre jak ▄ (lub to, że ▗▖) lub ╦ po prostu nie mają sensu w pisanym kodzie. Nie dotyczy to jednak matematyki ani glifów strzałek.
Na żądanie wersja tylko ASCII byłaby czymś w rodzaju:
winner_sigma_new = ( winner_sigma ** 2 *
( 1 -
( winner_sigma ** 2 -
general_uncertainty ** 2
) * Wwin(t,e)
) + dynamics ** 2
)**.5
... na każdym kroku algorytmu.
sqrt = lambda x: x**.5
robi mi funkcję (dokładniej wywoływalnym)sqrt(2) => 1.41421356237
.Odpowiedzi:
Mocno czuję, że po prostu zastąpienie
σ
gos
lubsigma
byłoby głupie, graniczące z martwym mózgiem.Jaki jest potencjalny zysk? Więc, zobaczmy …
Czy poprawia to czytelność? Nie, nie w najmniejszym stopniu. Gdyby tak było, oryginalna formuła niewątpliwie użyłaby także liter łacińskich.
Czy poprawia zapisywalność? Na pierwszy rzut oka tak. Ale z drugiej strony nie. Ponieważ ta formuła nigdy się nie zmieni (cóż, „nigdy”). Zwykle nie będzie potrzeby zmiany kodu ani rozszerzania go za pomocą tych zmiennych. Tak więc zapisywalność - nie tylko raz - nie stanowi problemu.
Osobiście uważam, że języki programowania mają jedną przewagę nad formułami matematycznymi: możesz używać znaczących, ekspresyjnych identyfikatorów. W matematyce zwykle tak się nie dzieje, dlatego sięgamy po zmienne jednoliterowe, od czasu do czasu czyniąc je greckimi.
Ale grecki nie jest problemem. Nieopisowe jednoliterowe identyfikatory to.
Więc albo zachować oryginalny zapis ... Po tym wszystkim, jeśli język programowania nie obsługują Unicode w identyfikatorach, więc nie ma bariery techniczne. Lub użyj znaczących identyfikatorów. Nie zamieniaj greckich glifów na łacińskie. Arabskie lub hindi.
źródło
.properties
pliki Java są łatwe do przeanalizowania. Jeśli naprawdę zdarzyło Ci się pracować z łańcuchem narzędzi, który, wspierany przez.properties
pliki, nie obsługiwał Unicode, całkowicie uzasadnione jest porzucenie tego łańcucha narzędzi (i samodzielne jego zastąpienie, znalezienie alternatywy lub, w najgorszym przypadku, uruchomienie jednego z nich ). Oczywiście nie dotyczy to starszych systemów. Jednak w przypadku starszych systemów nie ma zastosowania żadna uwaga dotycząca najlepszych praktyk.Osobiście nie chciałbym widzieć kodu, w którym muszę wyświetlić mapę znaków, aby wpisać ją ponownie. Mimo że Unicode ściśle pasuje do tego, co jest w algorytmie, to naprawdę szkodzi czytelności i możliwości edycji. Niektórzy redaktorzy mogą nawet nie mieć czcionki obsługującej ten znak.
Co powiesz na alternatywę i po prostu doładuj
//µ = u
i napisz wszystko w ascii?źródło
{
i}
(co się nie udaje w ttys btw) i kompletnie brakuje`
i~
... jak żaden skrypt Bash nie wymagałby ode mnie używania mapy znaków, jeśli nie używałbym niestandardowej mapy klawiszy? :)TeX
irfc1345
.TeX
tak to brzmi; pozwala pisać\sigma
dlaσ
i\to
dla→
.rfc1345
daje kilka kombinacji takich jak&s*
forσ
i&->
for→
. Zasadniczo nie martwię się o przystosowanie programistów używających edytorów mniej zdolnych niż Emacsa.Ten argument zakłada, że nie masz problemu z pisaniem Unicodów ani czytaniem greckich liter
Oto argument: czy chciałbyś pi czy circular_ratio?
W tym przypadku wolałbym pi od circular_ratio, ponieważ dowiedziałem się o pi, odkąd byłem w szkole podstawowej i mogę się spodziewać, że definicja pi jest dobrze zakorzeniona dla wszystkich programistów wartych jego soli. Dlatego nie miałbym nic przeciwko wpisaniu π, aby oznaczać okrągły_ratio.
A co z tym?
lub
Dla mnie obie wersje są równie nieprzejrzyste, tak jak
pi
lubπ
są, z tym wyjątkiem , że nie nauczyłem się tej formuły w szkole podstawowej.winner_sigma
iWwin
nic dla mnie nie znaczy ani dla kogokolwiek, kto czyta kod, a użycie żadnego z nichσw
nie poprawi go.Tak więc, używając opisowych nazw, na przykład
total_score
,winning_ratio
itd zwiększyłoby czytelność znacznie lepsze niż przy użyciu nazwy ASCII jedynie wymawia greckie litery . Problemem nie jest to, że nie mogę odczytać greckich liter, ale nie mogę skojarzyć znaków (greckich lub nie) z „znaczeniem” zmiennej.Na pewno rozumiał problem siebie, gdy powiedział:
You should have seen the paper. It's just eight pages...
. Problem polega na tym, że jeśli nazewnictwo zmiennych opiera się na papierze, który wybiera zwięzłość liter zamiast zwięzłości (bez względu na to, czy są greckie), wówczas ludzie musieliby przeczytać gazetę, aby móc skojarzyć litery z literą "znaczenie"; oznacza to, że stwarzasz sztuczną barierę, aby ludzie mogli zrozumieć Twój kod, a to zawsze jest złe.Nawet jeśli mieszkasz w ASCII tylko świata, zarówno
a * b / 2
ialpha * beta / 2
są równie nieprzejrzysta renderingheight * base / 2
, formuła obszar trójkąta. Nieczytelność użycia zmiennych jednowymiarowych rośnie wykładniczo wraz ze wzrostem złożoności formuły, a formuła AllegSkill z pewnością nie jest formułą trywialną.Zmienna z pojedynczymi literami jest akceptowana tylko jako prosty licznik pętli, bez względu na to, czy są one greckimi pojedynczymi literami, czy pojedynczymi literami ascii, nie obchodzi mnie to; żadne inne zmienne nie powinny składać się wyłącznie z jednej litery. Nie dbam o to, czy używasz greckich liter do swoich imion, ale kiedy ich używasz, upewnij się, że mogę skojarzyć te imiona z „znaczeniem” bez konieczności czytania dowolnego artykułu w innym miejscu.
Będąc w szkole podstawowej, zdecydowanie nie miałbym nic przeciwko widzeniu wyrażeń matematycznych wykorzystujących symbole takie jak: +, -, ×, ÷, dla podstawowej arytmetyki, a √ () byłaby funkcją pierwiastka kwadratowego. Po ukończeniu szkoły podstawowej nie miałbym nic przeciwko dodaniu nowych błyszczących symboli: ∫ do integracji. Zwróć uwagę na trend, to są wszyscy operatorzy. Operatory są znacznie częściej używane niż nazwy zmiennych, ale rzadziej są ponownie wykorzystywane do zupełnie innych znaczeń (w przypadku, gdy matematycy ponownie używają operatorów, nowe znaczenie często ma pewne podstawowe właściwości starego znaczenia; nie jest tak w przypadku przy ponownym użyciu nazw zmiennych).
Podsumowując, nie, nie jest źle używać znaków Unicode w nazwach zmiennych; jednak zawsze źle jest używać nazw liter o pojedynczych literach w nazwach zmiennych, a możliwość używania nazw w Unicode nie jest licencją na używanie nazw liter o zmiennej nazwie.
źródło
error_on_measured_skill_with_99th_percent_confidence
zamiast nichsigma
.// σw = skill level measurement error
Itp.Czy rozumiesz kod? Czy wszyscy inni, którzy muszą to przeczytać? Jeśli tak, nie ma problemu.
Osobiście chętnie zobaczę tył kodu źródłowego zawierającego tylko ASCII.
źródło
Tak, oszalałeś. Osobiście odniósłbym się do komentarza do numeru papieru i formuły i zapisałbym wszystko prosto w ASCII. Wówczas każdy zainteresowany byłby w stanie skorelować kod i formułę.
źródło
Powiedziałbym, że używanie nazw zmiennych Unicode to zły pomysł z dwóch powodów:
To PITA do pisania.
Często wyglądają prawie tak samo jak litery angielskie. Z tego samego powodu nienawidzę patrzeć na greckie litery w notacji matematycznej. Spróbuj powiedzieć rho oprócz p. To nie jest łatwe.
źródło
W tym jednym przypadku, złożona formuła matematyczna, powiedziałbym, że idź.
Mogę powiedzieć, że przez 20 lat nigdy nie musiałem kodować czegoś tak złożonego, a greckie litery trzymają to blisko pierwotnej matematyki. Jeśli nie możesz tego zrozumieć, nie powinieneś go utrzymywać.
Mówiąc, że jeśli kiedykolwiek musiał utrzymać ľ i Ď w torfowiska standardowy kod, który mi pozostawił, ja będzie dowiedzieć się, gdzie mieszkasz ...
źródło
Jak duże jest dla ciebie ryzyko? Czy zysk przewyższa ryzyko?
źródło
W niedalekiej przyszłości wszyscy będziemy używać edytorów tekstu / IDE / przeglądarek internetowych, które ułatwiają pisanie tekstu edycji, w tym klasycznych greckich znaków itp. (A może wszyscy nauczymy się używać tego „ukrytego” „funkcjonalność narzędzi, z których obecnie korzystamy ...)
Ale dopóki tak się nie stanie, wielu programistów nie jest w stanie obsłużyć znaków innych niż ASCII w kodzie źródłowym programu, dlatego jest to zły pomysł, jeśli piszesz aplikacje, które mogą wymagać konserwacji przez kogoś innego.
(Nawiasem mówiąc, powód, dla którego możesz mieć znaki greckie, ale nie znaki pierwiastka kwadratowego w identyfikatorach Pythona, jest prosty. Znaki greckie są klasyfikowane jako litery Unicode, ale znak pierwiastka kwadratowego nie jest literą; patrz http://www.python.org / dev / peps / pep-3131 / )
źródło
\mu
że piszesz i wpisujeµ
.Nie powiedziałeś, jakiego języka / kompilatora używasz, ale zwykle reguła dla nazw zmiennych jest taka, że muszą zaczynać się od znaku alfabetu lub znaku podkreślenia i zawierać tylko znaki alfanumeryczne i znaki podkreślenia. Unikod √ nie byłby uważany za alfanumeryczny, ponieważ jest to symbol matematyczny zamiast litery. Jednak σ może być (ponieważ jest to alfabet grecki), a á prawdopodobnie będzie uważane za alfanumeryczne.
źródło
Zadałem to samo pytanie na StackOverflow
Zdecydowanie uważam, że warto stosować Unicode w ciężkich problemach matematycznych, ponieważ umożliwia bezpośrednie odczytanie formuły, co jest niemożliwe w przypadku zwykłego ASCII.
Wyobraź sobie sesję debugowania: oczywiście zawsze możesz ręcznie napisać formułę, którą kod ma obliczyć, aby sprawdzić, czy jest poprawna. Ale w dziewięćdziesięciu procentach czasu nie będziesz się tym przejmować, a błąd może pozostać ukryty przez długi, długi czas. I nikt nigdy nie chce spojrzeć na tę zawiłą, 7-liniową, prostą formułę ASCII. Oczywiście użycie Unicode nie jest tak dobre, jak formuła renderowana przez tex, ale jest o wiele lepsze.
Alternatywa polegająca na stosowaniu długich nazw opisowych nie jest wykonalna, ponieważ w matematyce, jeśli identyfikator nie jest krótki, formuła będzie wyglądać jeszcze bardziej skomplikowana (jak myślisz, dlaczego ludzie około XVIII wieku zaczęli zamieniać „plus” na „+” i „minus” przez „-”?).
Osobiście użyłbym także niektórych indeksów dolnych i górnych (po prostu kopiuję i wklejam je z tej strony ). Na przykład: (miał dozwolone python √ jako identyfikator)
Gdzie użyłem indeksu górnego, ponieważ nie ma odpowiednika indeksu dolnego w Unicode. (Niestety zestaw znaków w indeksie Unicode jest bardzo ograniczony. Mam nadzieję, że pewnego dnia indeksowanie w Unicode będzie traktowane jako znaki diakrytyczne, tj. Kombinacja jednego znaku dla indeksu dolnego i drugiego znaku dla subskrybowanej litery)
I ostatnia rzecz, myślę, że ta rozmowa na temat używania znaków spoza ASCII jest przede wszystkim stronnicza, ponieważ wielu programistów nigdy nie zajmuje się „notacjami matematycznymi intensywnie wykorzystującymi formuły”. Uważają więc, że to pytanie nie jest tak ważne, ponieważ nigdy nie doświadczyli znacznej części kodu, która wymagałaby użycia identyfikatorów innych niż ASCII. Jeśli jesteś jednym z nich (a ja byłem do niedawna), zastanów się nad tym: załóżmy, że litera „a” nie jest częścią ASCII. Wtedy będziesz miał całkiem niezły pomysł na problem z brakiem greckich liter, indeksów dolnych i górnych podczas obliczania nietrywialnych formuł matematycznych.
źródło
Czy ten kod jest tylko dla twojego osobistego projektu? Jeśli tak, zwariuj i użyj, co chcesz.
Czy ten kod jest przeznaczony dla innych? tj. i jakaś aplikacja typu open source? Jeśli tak, prawdopodobnie pytasz o kłopoty, ponieważ różni programiści używają różnych edytorów i nie możesz być pewien, że wszystkie edytory będą poprawnie obsługiwały Unicode. Ponadto nie wszystkie powłoki poleceń wyświetlają go poprawnie, gdy plik kodu źródłowego jest typu / cat'd, i możesz napotkać problemy, jeśli chcesz go wyświetlić w formacie HTML.
źródło
osobiście jestem zmotywowany do rozważenia języków programowania jako narzędzia dla matematyków w tym kontekście, ponieważ w rzeczywistości nie używam matematyki, która wygląda tak w moim życiu. : D I jasne, dlaczego nie użyć ɛ, σ lub cokolwiek innego - w tym kontekście jest to właściwie bardziej czytelne.
(Chociaż, muszę powiedzieć, wolę wspierać numery w indeksie górnym jako bezpośrednie wywołania metod, a nie nazwy zmiennych. Np. 2² = 2 ** 2 = 4 itd.)
źródło
Co jest, do cholery
σ
, co jestW
, co jestε
,c
a coγ
?Nazwij swoje zmienne w sposób, który wyjaśnia ich cel.
Osobiście pobiłbym każdego, kto zostawiłby wersję Unicode lub ASCII, abym mógł to utrzymać, chociaż wersja ASCII jest lepsza.
Czym jest zło jest wywołanie zmienne
σ
lubs
lubsigma
lubvalue
lubvar1
, ponieważ nie przekazuje żadnych informacji.Zakładając, że piszesz swój kod po angielsku (jak uważam, że powinieneś, skądkolwiek jesteś), ASCII powinno wystarczyć do nadania zmiennym znaczących nazw, więc nie ma potrzeby używania Unicode.
źródło
rank_error_with_99_pct_confidence
jest na to trochę za długie i właściwie nie ułatwiłoby zrozumienia formuł. AllegSkill / TrueSkill nazywają te sigma, więc uważam, że całkowicie akceptowalne jest dla mnie zachowanie nazwy specyficznej dla domeny.rank_error
i umieścić dodatkowe szczegóły na temat 99-procentowego zaufania do dokumentacji / komentarza.W przypadku nazw zmiennych o znanym pochodzeniu matematycznym jest to absolutnie dopuszczalne - nawet preferowane. Ale jeśli kiedykolwiek spodziewasz się rozpowszechniać kod, powinieneś umieścić te wartości w module, klasie itp., Aby automatyczne uzupełnianie IDE mogło obsługiwać „wpisywanie” dziwnych znaków.
Używanie √ lub ² w identyfikatorze - nie tyle.
źródło