Ich habe in der letzten Zeit einen Teil meiner Freizeit damit verbracht, meinen Kopf rund um Haskell und funktionale Programmierung im Allgemeinen zu wickeln. Eines meiner größten Bedenken war (und ist immer noch) das, was ich als Unlesbarkeit von knappen, funktionalen Äußerungen empfinde (sei es in Haskell oder einer anderen Sprache).Funktional vs. Imperativ Stil in Python
Hier ist ein Beispiel. Ich habe gerade die folgende Transformation in einigen Code für die Arbeit:
def scrabble_score(word, scoretable):
score = 0
for letter in word:
if letter in scoretable:
score += scoretable[letter]
return score
zu
def scrabble_score(word, scoretable):
return sum([scoretable.get(x, 0) for x in word])
Letzteres war viel befriedigender (und zu schreiben, wenn man bedenkt, dass ich mich derjenige bin, schrieb es, um auch zu lesen). Es ist kürzer und süßer und deklariert keine lästigen Variablen, die Kopfschmerzen bereiten könnten, wenn ich beim Schreiben des Codes irgendwelche Fehler machen würde. (BTW Ich realisiere, ich hätte die Methode get()
des Dikters in der imperativ-Stil-Funktion verwendet haben, aber ich erkannte es, wie ich diese Transformation durchgeführt habe, so habe ich es so in dem Beispiel.)
Meine Frage ist: trotz all das, ist die letztere Version des Codes wirklich besser lesbar als der ehemalige? Es scheint ein monolithischer Ausdruck zu sein, der im Vergleich zu der früheren Version, in der man die Bedeutung des Blocks aus den kleineren, atomaren Stücken zusammenfassen kann, auf einmal gerupft werden muss. Diese Frage kommt von meiner Frustration mit dem Versuch, angeblich leicht verständliche Haskell-Funktionen zu dekodieren, sowie meiner Beharrlichkeit als TA für Erstsemester-CS-Studenten, dass einer der Hauptgründe, warum wir Code schreiben (der oft übersehen wird) ist kommunizieren Ideen mit anderen Programmierern/Informatikern. Ich bin nervös, dass der Terser-Stil nur nach Schreibcode klingt und daher den Zweck der Kommunikation und des Verständnisses von Code vereitelt.
Nur ein Kommentar über Ihren Code in der zweiten Version: Ich glaube nicht, dass Sie muss eigentlich eine Liste machen. Sie können einfach sagen 'sum (scoretable.get (x, 0) für x in Wort)'. – pandubear
Das Problem mit dieser Art von Vergleichen ist, dass Programmierer unabhängig davon, wie lesbar eine bestimmte Sprache und Stil "objektiv" ist (wie auch immer man es im objektiven Sinn definiert), * sehr gut * darin lesen, welche Sprachen und Stile sie auch wirklich lesen arbeiten mit. Ein ungewohnter Stil * immer * scheint weniger lesbar als das, was Sie gewohnt sind, ungeachtet des Verdienstes. – Ben
Man könnte argumentieren, dass es _pythonic_ wäre, 'sum (score_table [Buchstabe] für Buchstabe in Wort) zu verwenden und' KeyError' zuzulassen, außer es wird erwartet, dass Buchstaben nicht in 'scatterbar' sind. –