Wörterbuch nach Listenelementen ordnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Aries hat geschrieben:- p ist nicht mit parrots verwechselbar
"parrot" ist doch leicht von "parrots" unterscheidbar. Das Wort ist so kurz, da fällt das s am Ende sofort auf. Dafür kann man "p" aber leicht mit "point", "position", "pretzel", oder "passenger" verwechseln.
Aries hat geschrieben:- p ist kurz
"p" hat dafür einfach überhaupt keine Aussagekraft. Die Einzigen Ausnahmen sind i, j und k für ganze Zahlen, falls diese als Indizes verwendet werden.
Aries hat geschrieben:- p ist als Objekt einer Iteration überall auch in einer langen Schleife sofort zu erkennen, sofern im Code in allen analogen Fällen ebenfalls einstellige Namen für so etwas verwendet werden.
"parrot" ist auch überall sofort zu erkennen und liefert sogar noch zusätzliche Information. Wenn du so lange Schleifen hast, dass du den Überblick verlierst, dann solltest du deinen Code besser aufteilen.
Aries hat geschrieben:Ein Problem ist sonst auch dass sich Einzahl und Mehrzahl nicht immer und manchmal nur durch Umlaute voneinander unterscheiden, sofern man nicht für alles englische Bezeichnungen verwenden will (und selbst da gibt es auch Fälle wie "woman", "women").
Komisch, das Problem hatte ich noch nie. Vielleicht solltest du erstmal etwas mehr Code schreiben, bevor du über mögliche Fehlerquellen redest.
Das Leben ist wie ein Tennisball.
BlackJack

@Aries: `p` ist zu kurz weil man wieder an dem Namen nicht erkennen kann was er bedeutet. Spätestens wenn man dann Namen hätte die ausgeschrieben beide mit dem gleichen Buchstaben anfangen wird es verwirrend. So kurze Namen verwende ich nur in anonymen Funktionen, „list comprehensions”, und Generatorausdrücken, weil sie dort auch wirklich auf einen sehr kleinen Bereich beschränkt sind. Ausnahme: die üblichen numerischen Laufvariablen `i`, `j`, und `k`, und manchmal noch `x`, `y`, und `z` für Koordinaten. Ansonsten immer ein Name den man *Lesen* kann, also einen mit Bedeutung, der möglichst klar sagt was der Wert bedeutet. Die Verwechslungsgefahr bei `parrot` und `parrots` besteht nicht wirklich. Wer das durcheinander bringt, der wird erst recht einbuchstabige Namen durcheinander bringen. Vor allem *liest* sich doch ``for parrot in parrots:`` *natürlich*. Das ist näher an Prosa dran als ``for p in parrots:``.

Wenn es keine fachlichen Anforderungen gibt, die dagegen sprechen, verwende ich übrigens auch englische Namen. Die Schlüsselwörter der Sprache sind in Englisch, die Namen der eingebauten Funktionen und die in der Standardbibliothek sind Englisch, und die Namen in jeder verbreiteten, und in den allermeisten nicht so verbreiteten Modulen und Paketen sind Englisch. Andere Sprachen wirken da komisch und hemmen IMHO den Lesefluss.
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

BlackJack hat geschrieben:Vor allem *liest* sich doch ``for parrot in parrots:`` *natürlich*. Das ist näher an Prosa dran als ``for p in parrots:``.
"Für jeden Papagei in der Menge der Papageien" ist eine seltsame Aussage. Man würde einfach sagen: "Für jeden Papagei". Wenn man es aber in die Form "Für jeden _ in der Menge der Papageien" bringen muss, dann wäre "Für jedes Element in der Menge der Papageien" am natürlichsten.
BlackJack hat geschrieben:Wenn es keine fachlichen Anforderungen gibt, die dagegen sprechen, verwende ich übrigens auch englische Namen. Die Schlüsselwörter der Sprache sind in Englisch, die Namen der eingebauten Funktionen und die in der Standardbibliothek sind Englisch, und die Namen in jeder verbreiteten, und in den allermeisten nicht so verbreiteten Modulen und Paketen sind Englisch. Andere Sprachen wirken da komisch und hemmen IMHO den Lesefluss.
Deutsche Namen kennzeichnen sehr gut, was von einem selbst stammt, im Gegensatz zu dem, was von Python vorgegeben ist.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Aries hat geschrieben:"Für jeden Papagei in der Menge der Papageien" ist eine seltsame Aussage.
Du hast keine mathematische Ausbildung, richtig?
Aries hat geschrieben:Man würde einfach sagen: "Für jeden Papagei".
Für jeden Papagei aus was? Aus der Menge der Papageien? Aus der Menge der Vögel? Aus der Menge aller Tiere?
Aries hat geschrieben:Wenn man es aber in die Form "Für jeden _ in der Menge der Papageien" bringen muss, dann wäre "Für jedes Element in der Menge der Papageien" am natürlichsten.
Und das unterscheidet sich jetzt wo zu "Für jeden Papagei in der Menge der Papageien"? Letzteres beschreibt zusätzlich um was für ein Element es sich handelt und gibt zusäthliche Information. "Element" ist wieder eine unnütze Generalisierung. Es ist doch ganz klar, dass in "parrots" Papageien drin stecken und keine Kühe. Und das wird sich auch niemals ändern.
Aries hat geschrieben:Deutsche Namen kennzeichnen sehr gut, was von einem selbst stammt, im Gegensatz zu dem, was von Python vorgegeben ist.
Seltsamerweise haben Englischsprachige damit gar keine Probleme. Liegt vielleicht einfach daran, dass man es modullokal so oder so auf den ersten Blick erkennt und außerhalb des Moduls qualifizierte Bezeichner verwendet. Das gilt allerdings für alle verwendeten Module, ein Unterschied zwischen verwendeten und eigenen Modulen muss man so oder so nicht treffen. Es interessiert doch gar nicht woher der Code genau kommt. Ganz spannend wird es natürlich dann, wenn Fremdmodule auch in einer anderen Sprache geschrieben wären. Ich möchte jetzt nicht extra Chinesisch oder Bulgarisch lernen, nur um ein Modul verwenden zu können. Die Verwirrung ist natürlich perfekt, wenn ein Fremdmodul auch Deutsch verwendet, dann bricht die ganze gute Taktik zusammen. Aber ganz offensichtlich hast du noch nie an einem Projekt gearbeitet.
Das Leben ist wie ein Tennisball.
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

EyDu hat geschrieben:
Aries hat geschrieben:"Für jeden Papagei in der Menge der Papageien" ist eine seltsame Aussage.
Du hast keine mathematische Ausbildung, richtig?
Nein. Aber jeder Papagei gehört zur Menge der Papageien. Der Satz bedeutet ungefähr soviel, wie "für jeden Papagei, der ein Papagei ist."
EyDu hat geschrieben:
Aries hat geschrieben:Man würde einfach sagen: "Für jeden Papagei".
Für jeden Papagei aus was? Aus der Menge der Papageien? Aus der Menge der Vögel? Aus der Menge aller Tiere?
Für jeden Papagei aus allem/Für alles, was ein Papagei ist.

Eure Benennungen würde eher in eine for-Schleife der Form "for parrots (as parrot):" passen, die so funktionieren könnte:

Code: Alles auswählen

>>> parrots = ["Papagei Nr. 1", "Papagei Nr. 2"]
>>> for parrots:
    print it
Papagei Nr. 1
Papagei Nr. 2
>>> for parrots as parrot:
    print parrot
Papagei Nr. 1
Papagei Nr. 2
EyDu hat geschrieben:
Aries hat geschrieben:Wenn man es aber in die Form "Für jeden _ in der Menge der Papageien" bringen muss, dann wäre "Für jedes Element in der Menge der Papageien" am natürlichsten.
Und das unterscheidet sich jetzt wo zu "Für jeden Papagei in der Menge der Papageien"?
Das unterscheidet sich durch das Fehlen der Tautologie.

Ich will mich jetzt aber garnicht festlegen, wie ich es machen werde. Vielleicht stelle ich ja fest, dass euer System besser ist.
EyDu hat geschrieben:
Aries hat geschrieben:Deutsche Namen kennzeichnen sehr gut, was von einem selbst stammt, im Gegensatz zu dem, was von Python vorgegeben ist.
Seltsamerweise haben Englischsprachige damit gar keine Probleme.
Na das ist doch schön für sie.
EyDu hat geschrieben:ganz offensichtlich hast du noch nie an einem Projekt gearbeitet.
Ich habe bislang immer alleine programmiert.
BlackJack

@Aries: „Für jeden Papagei” ist keine brauchbare Aussage in einem Programm. Denn für wirklich jedes Objekt was ein Papagei ist will man mit 99,99999% Wahrscheinlichkeit gar keine Schleifen schreiben, sondern nur für diejenigen, die man in einem *bestimmten* Containerobjekt oder Iterator vorliegen hat, und *den* muss man dann auch explizit benennen. Die Menge der Papageien in ``for parrot in parrots:`` sind ja mitnichten *alle* Papageien die es auf der Welt gibt, sondern nur die, die man auch in diesen Container mit dem Namen `parrots` gesteckt hat.

Das ``for … as …:`` Konstrukt ist unverständlicher als ``for … in …:``. Letzteres ist nahe an der natürlichen Sprache, und noch näher an der mathematischen Beschreibung von Algorithmen. Und damit seit Jahrzehnten in der oder ähnlicher Form in Pseudo-Code und konkreten Programmiersprachen zu finden. Es macht wenig Sinn da jetzt etwas neues zu erfinden was erst einmal niemand versteht.

Edit: Ich sehe in dem (unvollständigen) Satz „Für jeden Papagei in der Menge der Papageien…” übrigens nirgends eine Tautologie‽
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

BlackJack hat geschrieben:@Aries: „Für jeden Papagei” ist keine brauchbare Aussage in einem Programm. Denn für wirklich jedes Objekt was ein Papagei ist will man mit 99,99999% Wahrscheinlichkeit gar keine Schleifen schreiben, sondern nur für diejenigen, die man in einem *bestimmten* Containerobjekt oder Iterator vorliegen hat, und *den* muss man dann auch explizit benennen.
In "Für jeden Papagei" ist meines Erachtens der Container mit "Papagei" benannt.
BlackJack hat geschrieben:Die Menge der Papageien in ``for parrot in parrots:`` sind ja mitnichten *alle* Papageien die es auf der Welt gibt, sondern nur die, die man auch in diesen Container mit dem Namen `parrots` gesteckt hat.
Das ist doch selbstverständlich.
BlackJack hat geschrieben:Das ``for … as …:`` Konstrukt ist unverständlicher als ``for … in …:``. Letzteres ist nahe an der natürlichen Sprache
"Berechne für die Zahlen 1 bis 10 die Potenz" ist eine ganz natürliche Aussage.
"Tue für die Zahlen 1 bis 10, nachfolgend jeweils als Zahl bezeichnet, folgendes: Berechne die Potenz der Zahl" ebenfalls.

In der Sprache ist es für den für-Ausdruck an sich nicht notwendig, zu sagen, wie die Objekte nachfolgend benannt werden. Wenn man aber angibt, als was die Objekte nachfolgend benannt werden, kommt man um das Wort "als" schwer drum rum.

Beim x in "for x in y:" wird nichts geprüft. Beim x geht es nur darum, wie nachfolgend die einzelnen y-Elemente angesprochen werden. "Für jeden Papagei in der Menge der Papageien" bedeutet, dass hier zweimal geprüft wird, ob es sich um einen Papagei handelt. Es bedeutet etwas anderes! Vor das x gehört einfach kein "für". Vor das x gehört ein "als" und vor das y gehört das "für".
BlackJack hat geschrieben:Edit: Ich sehe in dem (unvollständigen) Satz „Für jeden Papagei in der Menge der Papageien…” übrigens nirgends eine Tautologie‽
Was sich in der Menge der Papageien befindet, ist automatisch ein Papagei. Das muss nicht nochmal extra erwähnt/geprüft werden. Extra erwähnt werden muss nur, als was sie einzeln nachfolgend bezeichnet werden.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Aries: Du kannst da noch stundenlang darüber schwadronieren, wenn's dir Spaß macht. Fakt ist aber, dass `for papagei in papageien:` allgemein üblich ist und meiner Meinung nach auch bedeutend verständlicher für den Leser ist (auch wenn du das anscheinend anders siehst). Es steht dir frei, dich nicht an die üblichen Konventionen zu halten und Container-Elemente grundsätzlich nur "Objekt" zu nennen und in der Schleife dann `objekt.gibLaut()`, `objekt.schalteEin()`, `objekt.zeichne()` und dergleichen zu schreiben. Vielleicht kommst du ja irgendwann doch zu der Erkenntnis, dass dies eine wenig praktikable Herangehensweise im Programmier-Alltag ist...
BlackJack

@Aries: Sorry, aber Deine Aussagen machen weniger und weniger Sinn und widersprechen sich immer mehr. Wie kann denn der Container bei „Für jeden Papagei” *auch* „Papagei” heissen? Und plötzlich ist es selbstverständlich das nur die Papageien aus der konkreten Menge nach dem ``in`` gemeint ist, wo Du kurz davor noch behauptet hast es wäre „jeder Papagei der ein Papagei ist”, was ja mehr sein können als in der angegebenen Menge gespeichert sind.

Bei der natürlichen Sprache kommst Du mit Deinen Argumenten von der falschen Seite. Es ist egal was man in natürlicher Sprache noch alles sagen kann, der Punkt ist, dass ``for … in …:`` recht nah an einer natürlichsprachlichen, und übrigens englischen, Beschreibung dran ist. Zudem an der Beschreibung die in der Mathematik üblich ist. Näher als ``for … as …:``, was zudem eine total irreführende Aussage ist, denn das ``for`` bezieht sich da auf den Container und das ``as`` kann man leicht als Umbenennung des Containers fehlinterpretieren. Insbesondere da ``as`` für genau so etwas schon in zwei anderen Kontexten in Python verwendet wird. Das macht als Satz überhaupt keinen Sinn.

Wo bei dem Satz „Für jeden Papagei in der Menge der Papageien” zweimal etwas geprüft wird sehe ich nicht. Ich sehe das genau gar keine Prüfung. Genau so wenig wie in ``for parrot in parrots:`` was die Umsetzung dieses Satzes in Code darstellt. Natürlichsprachlich wäre das in Englisch „For each parrot in parrots do <something>”. Und da ist das „for” ganz sicher an der richtigen Stelle. Und genau das ist mit dieser Art die Schleife zu schreiben gemeint. In Pseudo-Code und in diversen Programmiersprachen seit nunmehr mehreren Jahrzehnten.

Du kannst natürlich gerne argumentieren das alle anderen ausser Dir das falsch sehen, worauf sich das ``for`` beziehen sollte.

Die Frage nach der Tautologie hast Du nicht wirklich beantwortet, denn in dem Satz steckt weder eine Prüfung noch eine unnötige Erwähnung, sondern genau das was Deiner Meinung nach fehlt: Eine Bezeichnung für den einzelnen Papagei: „Papagei”.
Benutzeravatar
kbr
User
Beiträge: 1507
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Aries: Du steckst in einem ungeeigneten Denkschema fest. Eine Programmiersprache ist keine natürliche Sprache. Sie ist eine exakte Sprache. Sie *muss* es sein. Je näher eine Programmiersprache an der natürlichen Sprache liegt, ohne dabei an Exaktheit zu verlieren, desto besser.

Zu dem Beispiel 'for x in y' versus 'als x für y': ersteres ist deshalb korrekt, da es ganz konkret aussagt: aus der Menge y wird jedes Element, das im weiteren als x bezeichnet wird, sukzessive entnommen und verwendet.

Dies liegt nun schon sehr nahe an der natürlichen Sprache und bleibt im Sinne einer exakten Beschreibung richtig.

'for parrot in parrots' enthält daher keine Tautologie, sondern sagt ganz klar: aus einer Menge von Papageien wird sukzessiv jeder Papagei, im weiteren als Papagei bezeichnet, entnommen und verwendet. Das ist exakt, ohne Mehrdeutigkeiten und gut verständlich. Was variabel bleibt, ist die Menge der Papageien.

Annahmen, wie 'das ist selbstverständlich' führen in der Programmierung (und darüber hinaus in allen Naturwissenschaften) früher oder später zu Mehrdeutigkeiten und damit zu Missverständnissen und Fehlern.
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Aries: Hältst du sowas hier wirklich für nützlich?

Code: Alles auswählen

for ding1 in houses:
    for ding2 in dogs:
        for ding3 in parrots:
            for ding4 in forks:
                for ding5 in spoons:
                    for ding6 in knives:
                        for ding7 in cars:
                            for ding8 in lamps:
                                for ding9 in stools:
                                    for ding10 in tvs:
                                        for ding11 in kitchen_sinks:
                                            for ding12 in pillows:
                                                ...
Von mir aus kannst du auch statt <ding> <object> einsetzen, oder einbuchstabige Kürzel oder männliche deutsche Vornamen verwenden, oder was auch immer. Das wesentliche ist, dass man den Namen weiter unten verwenden möchte und dazu wäre es hilfreich, zu wissen, was er repräsentiert. Ein p kann alles mögliche sein (parrot, pillow, ...), ein parrot hoffentlich nur ein Parrot.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Aries:

Noch was zur Historie: In den imperativen Sprachen gab es schon immer for-Schleifen. Die Idee basiert auf Gottlob FregesKomprehensionsschema. Frege war einer der zwei Erfinder der modernen Logik. Der andere war Charles Sanders Peirce. Eine Menge ist vollständig definiert, wenn ich ihre Elemente angeben kann. Zwei Mengen, die genau dieselben Elemente beinhalten, sind dieselbe Menge. Man nennt das das Extensionalitätsprinzip. Man schreibt dann zB. so etwas wie {x | f(x) == 0}, das wäre dann die Menge aller x für die f(x) gleich 0 ist. Man kann das auch erweitern: {x*2+3 | f(x) == 0} ist die Menge aller x*2+3 für die f(x) gleich 0 ist. Das wurde in der Funktionalen Programmierung auf Listen übertragen: [x*2+3 | f(x) == 0]. Phil "Lambdaman" Wadler hat dafür die Bezeichnung Listenkomprehension eingeführt. Man findet sie in Haskell und in Python. Die for-Schleife, auch wenn sie historisch viel früher da war, kann man als Erweiterung davon absehen, die es ermöglicht, nicht nur Ausdrücke (Expressions) auszuwerten, sondern auch Befehle (Statements) auszuführen:

Code: Alles auswählen

for x in range(10):
    print x * 2 + 3
Und nochwas zur Pragmatik der Benennungen: Ziel sollte es IMO sein, einen übersichtlichen, lesbaren Code zu erzeugen, nicht an jeder Mikrostelle für ultimative logische Konsistenz zu sorgen. Nicht nur wäre letzteres Zeitverschwendung, sondern widerspräche auch auch dem Geist und der Praxis der Logik. Diese ist zuerst einmal ein System, um nützliche formale Beschreibungen für tatsächliche Sachverhalte zu erzeugen und aus diesen, mittels syntaktischer Umformungen, Ableitungen (AKA: Beweise) durchzuführen. Für die Gültigkeit einer Ableitung ist die Benennung unerheblich. Eine gute Benennung hilft einem aber dabei, den Beweis einfacher/schneller verstehen zu können. Genauso ist es beim Programmieren (wg. der Curry-Howard-Korrespondenz? ;-). Beweise und Programme funktionieren wg. ihrer Semantik, also dem, was Compiler oder Interpreter verstehen, aber nicht wg. der Benennungen. Letztere sind wichtig für diejenigen, die mit dem Source Code arbeiten, und zwar für den Leser noch mehr, als den Scheiber, da Programme öfter gelesen, als geschrieben werden. Die Maxime sollte also sein, es dem Leser möglichst einfach zu machen. Und da wie gesagt die Benennungen unerheblich sind für die Semantik eines Programms, sollte man sich auch nicht damit aufhalten, vermeintlich logische Ungenauigkeiten in den Benennungen zu eliminieren, da diese eben mir der Logik gar nichts zu tun haben, sondern nur mit der Lesbarkeit.

Dein Denken scheint mir hier ein bischen verquer. Du stellst Prinzipien auf, nach denen du Sachen benennst, oder überhaupt programmierst, die du zwar begründest, aber die Begründungen setzt du absolut, ohne sie weiter zu hinterfragen. Mich erinnert das an die Anekdote von Wittgenstein, der seine Studenten in Cambridge einmal fragte, warum man denn sage, die Sonne gehe auf bzw. unter, obwohl wir doch wissen, dass sich die Erde um sie Sonne dreht, und nicht umgekehrt. Jemand antwortete darauf: Naja, es sieht halt so aus. Worauf Wittgenstein erwiderte: Wie sähe es aus, wenn es anders wäre? Also, mit meinen Worten: Wie müsste es aussehen, damit es so aussähe, als drehte sich die Erde um die Sonne? Tip: genauso. Der Unterschied liegt also nicht im Aussehen, sondern in der eingenommenen Perspektive, und genauso ist es auch beim Programmieren: wenn meine Perspektive die Mikro-Perspektive ist, dass jedes Mikro-Element (zB. Namen) mit allem anderen logisch konsistent zu sein hat (obwohl es, wie gesehen, mit Logik gar nichts zu tun hat), dann bin ich blind für andere Perspektiven und Begründungen. Mir hat es jedenfalls geholfen, mich beim Programmieren stets zu fragen: Wie wär's, wenn's anders wär? Oder, wie Alan Kay es ausdrückt: A change in perspective is worth 80 IQ points.
In specifications, Murphy's Law supersedes Ohm's.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Aries hat geschrieben:"Berechne für die Zahlen 1 bis 10 die Potenz" ist eine ganz natürliche Aussage.
"Tue für die Zahlen 1 bis 10, nachfolgend jeweils als Zahl bezeichnet, folgendes: Berechne die Potenz der Zahl" ebenfalls.

In der Sprache ist es für den für-Ausdruck an sich nicht notwendig, zu sagen, wie die Objekte nachfolgend benannt werden.
Fällt dir der Unterschied zwischen deinem ersten Satz und deinem zweiten nicht auf? Der erste beschreibt WAS gemacht werden soll, der zweite beschreibt WIE dies geschieht. Und am Ende muss alles auf auf die letze Variante hinuntergebrochen werden, sonst ist es nicht ausführbar.

Bei der ersten Aussage implizierst du zum Beispiel bereits, dass du die Zahlen von 1 bis 10 kennst, dass du weißt wie du an diese heran kommst (auf unterster ebene im Speicher) und wie du sie quadrierst (was du wahrscheinlich mit deiner ungenauen Aussage "Potenz der Zahl" beschreiben willst).
Das Leben ist wie ein Tennisball.
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

@snafu, pillmuncher
snafu hat geschrieben:Es steht dir frei, dich nicht an die üblichen Konventionen zu halten und Container-Elemente grundsätzlich nur "Objekt" zu nennen und in der Schleife dann `objekt.gibLaut()`, `objekt.schalteEin()`, `objekt.zeichne()` und dergleichen zu schreiben.
Da es in Python keinen with-Ausdruck wie in Pascal gibt, neige ich zur Variante einfach nur den Anfangsbuchstaben zu verwenden.

"for h in hauser" statt "for ding1 in houses:" bzw. "for house in houses"

Code: Alles auswählen

for h in hauser:
    h.gibLaut()
    h.schalteEin()
    h.zeichne()
Das kommt aufgrund der Kürze Pascal noch am nächsten:

Code: Alles auswählen

for Hausnummer:=1 to Hauseranzahl do with Haus[Hausnummer] do begin
    gibLaut;
    schalteEin;
    zeichne; end;
pillmuncher hat geschrieben:Ein p kann alles mögliche sein (parrot, pillow, ...), ein parrot hoffentlich nur ein Parrot.
Wahrscheinlich ist es in komplizierten Fällen besser, es auszuschreiben. Nur das rechtfertigt nicht, den Programmcode in den überwiegenden einfachen Fällen unnötig zu verlängern, mal abgesehen von der sonstigen Kritik.
BlackJack hat geschrieben:Wie kann denn der Container bei „Für jeden Papagei” *auch* „Papagei” heissen?
In "Für jeden x" ist x die Kontainerangabe.
BlackJack hat geschrieben:Und plötzlich ist es selbstverständlich das nur die Papageien aus der konkreten Menge nach dem ``in`` gemeint ist, wo Du kurz davor noch behauptet hast es wäre „jeder Papagei der ein Papagei ist”, was ja mehr sein können als in der angegebenen Menge gespeichert sind.
Wenn es mehr sind als in der Menge gespeichert, ist die Menge falsch benannt. Und für das Programm existieren natürlich nur die Papageien, die man reingeschrieben hat. In der Logik des Programms beinhaltet der Kontainer "Papageien" alle existenten Papageien.
BlackJack hat geschrieben: Bei der natürlichen Sprache kommst Du mit Deinen Argumenten von der falschen Seite. Es ist egal was man in natürlicher Sprache noch alles sagen kann, der Punkt ist, dass ``for … in …:`` recht nah an einer natürlichsprachlichen, und übrigens englischen, Beschreibung dran ist. Zudem an der Beschreibung die in der Mathematik üblich ist. Näher als ``for … as …:``, was zudem eine total irreführende Aussage ist, denn das ``for`` bezieht sich da auf den Container und das ``as`` kann man leicht als Umbenennung des Containers fehlinterpretieren. Insbesondere da ``as`` für genau so etwas schon in zwei anderen Kontexten in Python verwendet wird. Das macht als Satz überhaupt keinen Sinn.
Wie wäre es denn mit "for each in parrots as parrot:"?
BlackJack hat geschrieben:Wo bei dem Satz „Für jeden Papagei in der Menge der Papageien” zweimal etwas geprüft wird sehe ich nicht.
Das bedeutet, dass es ein Papagei sein muss (erste Prüfung) und außerdem sich in er Menge der Papageien befinden muss (zweite Prüfung), was aber nach der ersten Prüfung sowieso der Fall sein muss (Tautologie).
BlackJack hat geschrieben:Natürlichsprachlich wäre das in Englisch „For each parrot in parrots do <something>”.
Ich würde mich schon sehr täuschen, wenn für diesen englischen Satz nicht das gleiche gelten würde. Dermaßen anders ist die englische Logik nicht.
BlackJack hat geschrieben:Du kannst natürlich gerne argumentieren das alle anderen ausser Dir das falsch sehen, worauf sich das ``for`` beziehen sollte.
Frag mal einen Sprachwissenschaftler.
kbr hat geschrieben:'for parrot in parrots' enthält daher keine Tautologie, sondern sagt ganz klar: aus einer Menge von Papageien wird sukzessiv jeder Papagei, im weiteren als Papagei bezeichnet, entnommen und verwendet. Das ist exakt, ohne Mehrdeutigkeiten und gut verständlich.
Es mag exakt sein, aber wenn man es direkt in die menschliche Sprache übersetzt ist anders zu verstehen.

Ich finde das unschön und bedenklich. Als einziger Grund für eine abweichende Bennenungmaxime ist das allerdings zugegebenermaßen möglicherweise ungenügend.
BlackJack

@Aries: Du versuchst also Pascal in Python-Syntax zu schreiben. Warum verwendest Du dann nicht gleich Pascal? Wenn Du Dich nicht auf eine andere Programmiersprache einlassen willst, dann lass es doch einfach sein.

Durch das ausschreiben von Namen wird Quelltext nicht *unnötig* verlängert. Das dient dem leichteren Verständnis des Lesers, damit der nicht erst schauen muss was die Abkürzung eigentlich bedeutet. Denn oft steht hinter dem ``in`` in der Schleife auch nicht nur ein Name sondern ein Ausdruck. Dann muss man als Leser raten wofür der einzelne Buchstabe wohl stehen mag, wo der Autor es so einfach hätte einen vernünftigen und aussagekräftigen Namen zu wählen.

Bei „Für jeden Papagei” steht „Papagei” für eine *Menge* von Papagei*en*? OMG. Du bist echt witzig. m)

Der Container „Papageien” enthält also alle existenten Papageien. Aus Sicht des Programms. Alles klar. Man kann also nicht 10 `Parrot`-Exemplare im Programm erstellen, davon aber nur eine Teilmenge in eine Liste stecken. Es müssen immer alle in einer Liste stehen. Ich kann das. Ist jetzt mein Rechner irgendwie kaputt? Und ich denke auch nicht das eine Liste die Papageien enthält, aber nicht *alle*, falsch benannt ist. Denn sie enthält ja das was draufsteht: Papageien.

``For each in parrots as parrot:`` ist immer noch weiter weg von Englisch als ``for each parrot in parrots:``, ich würde sogar sagen es ist falsch. Mach da doch mal einen korrekten Satz draus. Und es ist weiter weg von Pseudocode und allen möglichen Programmiersprachen die bereits so ein Schleifenkonstrukt besitzen. Warum willst Du da jetzt mit aller Gewalt irgendeine Alternative herbeidiskutieren. Die zudem holpriger/falsch klingt? Selbst im ziemlich weit verbreiteten Pascal-Dialekt Delphi gibt es die ``for … in … do``-Schleife. (Verbreitet was Pascal angeht, heutzutage weniger was Programmiersprachen an sich angeht.)

Du zitierst ein wenig selektiv. Ich sehe in dem Satz „Für jeden Papagei in der Menge der Papageien” keine einzige Prüfung. Das ändert sich auch nicht wenn Du wiederholt einfach behauptest da wären zwei. Also Du kannst Dir das sparen das einfach nochmal zu behaupten ohne es irgendwie zu belegen, dann muss ich mich nicht noch mal wiederholen das ich keine sehe. :-) (Das ändert sich natürlich auch nicht in Englisch.)

``for parrots as parrot`` ist Unsinn. Da muss ich keinen Sprachwissenschaftler fragen. Wenn das normales gültiges Englisch ist, mit der von Dir angenommenen Bedeutung, dann sollte es Dir ja leicht fallen Beispiele zu finden auf die Du verweisen kannst.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Der Thread ist ja echt witzig :mrgreen:
Aries hat geschrieben:
BlackJack hat geschrieben:Wo bei dem Satz „Für jeden Papagei in der Menge der Papageien” zweimal etwas geprüft wird sehe ich nicht.
Das bedeutet, dass es ein Papagei sein muss (erste Prüfung) und außerdem sich in er Menge der Papageien befinden muss (zweite Prüfung), was aber nach der ersten Prüfung sowieso der Fall sein muss (Tautologie).
Hu? Wer oder was prüft denn da? Ich sehe da nur eine *Benennung*...

In der Mathematik schreibt man doch auch: "∀x ∈ y" (Lies: "Für alle x Element y") Da wird doch nichts geprüft, sondern nur gesagt, dass jedes Element aus y für x eingesetzt werden kann, damit man nur für jeweils ein Element der Menge etwas beschreiben kann. Das ist doch keine Prüfung!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

BlackJack hat geschrieben:@Aries: Du versuchst also Pascal in Python-Syntax zu schreiben. Warum verwendest Du dann nicht gleich Pascal? Wenn Du Dich nicht auf eine andere Programmiersprache einlassen willst, dann lass es doch einfach sein.
Weil es in Python ausreichend ist, Blöcke durch Einrücken zu kennzeichnen, weil in Python keine Semikolons nötig sind, weil man in Python nichts deklarieren muss, weil Python in weiteren Punkten einfacher ist und weil Python eine höhere Programmiersprache ist.
BlackJack hat geschrieben: Bei „Für jeden Papagei” steht „Papagei” für eine *Menge* von Papagei*en*?
"Papagei" gibt hier eine Klasse an.
BlackJack hat geschrieben: Der Container „Papageien” enthält also alle existenten Papageien. Aus Sicht des Programms. Alles klar. Man kann also nicht 10 `Parrot`-Exemplare im Programm erstellen, davon aber nur eine Teilmenge in eine Liste stecken. Es müssen immer alle in einer Liste stehen. Ich kann das. Ist jetzt mein Rechner irgendwie kaputt? Und ich denke auch nicht das eine Liste die Papageien enthält, aber nicht *alle*, falsch benannt ist. Denn sie enthält ja das was draufsteht: Papageien.
Sie enthält nur bestimmte Papageien. Dafür kann man einen passenden Namen finden. Z. B. neugeborene_Papageien, gesprachige_Papageien, grosse_Papageien, ausgewahlte_Papageien
BlackJack hat geschrieben: ``For each in parrots as parrot:`` ist immer noch weiter weg von Englisch als ``for each parrot in parrots:``, ich würde sogar sagen es ist falsch. Mach da doch mal einen korrekten Satz draus.
Do for each parrot hereinafter referred to as parrot something.
oder
Do for everything in the class "parrots" hereinafter referred to as parrot something.
BlackJack hat geschrieben:Du zitierst ein wenig selektiv. Ich sehe in dem Satz „Für jeden Papagei in der Menge der Papageien” keine einzige Prüfung.
Wenn sich aus welchen Gründen auch immer ein Hund in der "Menge der Papageien" befinden würde, dann würdest Du diesen also ungeprüft durchgehen lassen, obwohl da ausdrücklich steht "für jeden Papagei in der 'Menge der Papageien'"?
BlackJack hat geschrieben: ``for parrots as parrot`` ist Unsinn. Da muss ich keinen Sprachwissenschaftler fragen. Wenn das normales gültiges Englisch ist, mit der von Dir angenommenen Bedeutung, dann sollte es Dir ja leicht fallen Beispiele zu finden auf die Du verweisen kannst.
"for each >>Klasse<<" und für "hereinafter referred to as >>nachfolgende Bezeichnung<<" gibt es zig Beispiele. Die Kombination ist freilich selten. Dagegen wird man "for each >>nachfolgende Bezeichnung<< in >>Klasse<<" grundsätzlich nicht finden.
BlackJack

@Aries: Hast gewonnen. Ich geb auf. Das macht keinen Spass Deinem Unsinn hinterherzujagen. Du hast Recht. In allem. :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Aries hat geschrieben: Wenn sich aus welchen Gründen auch immer ein Hund in der "Menge der Papageien" befinden würde, dann würdest Du diesen also ungeprüft durchgehen lassen, obwohl da ausdrücklich steht "für jeden Papagei in der 'Menge der Papageien'"?
Das könnte sogar sein - Ducktyping "verbietet" das ja nicht; aber auch in anderen Sprachen, die Polymorphismus zulassen, könnte ein spezielleres Objekt in der Menge zu finden sein. Sofern die Beziehung "Ein Hund ist ein Papagei" / "Ein Hund verhält sich wie ein Papagei" in einer Domäne logisch sinnvoll ist, kann es tatsächlich sein, dass Du auf einmal ein Hund-Objekt im Schleifenrumpf hast. Aber das nur mal am Rande...

Jetzt kommst Du auf einmal noch mit dem Begriff "Klasse" - wieso sind denn Objekte in einer Liste unbedingt einer Klasse zugehörig? Du vermischst hier alle möglichen Ebenen - mal argumentierst Du auf Python-Ebene, dann auf natürlich sprachlicher Logik, dann aus Pascal-Sicht, ... das führt zu nichts.

BlackJack hat schon recht; Dir ist diesbezüglich nicht zu helfen. Mehr als Dir aufzeigen, *wieso* Dinge in Python und allgemein der Programmierung so sind, wie sie sind, kann man nicht. Die Einsicht muss von innen erfolgen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Aries hat geschrieben:
BlackJack hat geschrieben:Bei „Für jeden Papagei” steht „Papagei” für eine *Menge* von Papagei*en*?
"Papagei" gibt hier eine Klasse an.
Und woher kommen die? Schwirren die einfach so in Python rum? Du musst doch irgendeinen Bezug haben. Dieser Bezug ist der Container namens `parrots`. Im Grunde sagt man: "Für jedes Element aus `parrots`, welches nachfolgend als `parrot` bezeichnet wird, tue folgendes".
Aries hat geschrieben:Wenn sich aus welchen Gründen auch immer ein Hund in der "Menge der Papageien" befinden würde, dann würdest Du diesen also ungeprüft durchgehen lassen, obwohl da ausdrücklich steht "für jeden Papagei in der 'Menge der Papageien'"?
Ja, ist wirklich so. Man würde in Python einfach annehmen, dass jedes Element des Papageien-Containers auch tatsächlich ein Papagei ist. Das hat BlackJack hier irgendwo im Thread auch bereits erwähnt. Zudem wurde auch bereits angesprochen, dass die Bezeichnung als etwas bestimmtes lediglich eine Art Vermutung darstellt. Theoretisch können einem irgendwelche Nicht-Papageien untergejubelt werden, die sich evtl wie normale Papageien verhalten, d.h. entsprechende Funktionalität implementiert haben. Wenn man statische Typisierung gewohnt ist, wo einem weitreichendere Garantien zum tatsächlichen Typen gegeben werden (auch wenn man diese prinzipiell auch austricksen kann), dann erfordert das natürlich ein gewisses Umdenken.
Antworten