mal grundsaetzlich: python vs. php...etc

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
murphy
User
Beiträge: 60
Registriert: Samstag 30. Oktober 2004, 01:34
Wohnort: Berlin
Kontaktdaten:

Milan hat geschrieben:Es gibt in meinen Augen keinen Unterschied zwischen Methoden, Methodenaufrufen und Attributen.
Ruby hat, wie Smalltalk, keine attribute. instanzvariablen sind nur innerhalb der klasse verfügbar und beginnen mit @. zugriffsmethoden gehen per attr_reader & friends. alles ist ein objekt, objekte haben nach außen nur methoden. vorteil: kapselung; nachteil: ein wenig mehr schreibarbeit
ich verstehe bei deinem code gar nicht, zu was das x jetzt gehört. wann/wie oft wird x 1 zugewiesen? zu wem gehört x?

zu methoden ohne (): wie oft schreibt ihr () ohne inhalt? und wie oft braucht ihr die methoden selbst?
ich finde es gar nicht so schlimm, dass man in Ruby etwas mehr schreiben muss:

Code: Alles auswählen

foo.bar  # methodenaufruf
foo.method(:bar)  # methode
habe das noch nie gebraucht. musste erst in der doku nachschauen.
funktionale elemente (funktionen als parameter übergeben etc.) fallen in Ruby meist gar nicht auf, da vieles über codeblöcke läuft:

Code: Alles auswählen

[1, 2, 3].map { |x| x*x }
for-schleifen, mappings, closures, iteratoren, funktionen höherer ordnung sind in Ruby alle ein und dasselbe (semantisch).
die redundanten klammern sind ganz grundlegend für Rubys syntax-logik. print zB ist ja auch nur eine methode...da hat ja auch Python keine klammern.
Dookie hat geschrieben:Aha, bei den Beispielen die ich zu Ruby fand, waren alle Methoden wie Foo.bar definiert :)
sehr seltsam. falls du mal schöneren code sehen willst, hier die appetithappen, die mich dazu gebracht haben, das buch zu kaufen und Ruby zu lernen:
http://www.approximity.com/rubybuch2/node8.html
So kannst Du z.B. in Python mit

Code: Alles auswählen

if hasattr(foo, "write"):
    ...
testen ob foo eine write-Methode hat oder nicht.
(hasattr? write ist ein attribut?)
in Ruby geht das natürlich auch:

Code: Alles auswählen

if foo.respond_to :write
  ...
und wieder die frage: warum ist hasattr keine methode von foo? das nette foo weiß doch selber am besten, ob es write kann.
lass mich raten: __hasattr__()? ;)
Leonidas hat geschrieben:Man kann in Python inzwischen von jedem Typ erben. Warum fragst du um sinnvolle beispiele, wenn du dir einfach die sinnvollen Mixin Beispiele nehemen kannst?
module einzumischen und von klassen zu erben sind verschiedene dinge.

Code: Alles auswählen

>>>type(true)
<type 'bool'>
>>>type(0)
<type 'int'>
>>>class myint(int):'
geht auch int.methods() oder type(var) == int?

was benutzt man eigentlich in Python statt null oder nil? irgendein "nicht definiert" muss es doch geben...
Gute Frage, warum nicht? Das haben sich auch die Python Entwickler gedacht, deswegen macht len() genau das:

Code: Alles auswählen

>>>len('abc')
3
>>>'abc'.__len__()
3
Du siehst also das len() __len__() aufruft, das kannst du dann auch in deinen Klassen definieren und auch deine Klassen funktionieren dann mit len().
meine frage bleibt: warum kein 'abc'.len()? wieso dieser seltsame umweg über __len__? das erweckt den eindruck, man würde mit einer definition von __len__ geheimnisvolle dinge tun, die Python unglaublicherweise ermöglicht. upper() ist doch auch eine echte methode (weil ja upper('abc') auf __upper__() umgeleitet wird.)
warum nicht auch len? ich will es ja nicht ändern, ich will bloß wissen, warum len() anders sein soll. die erfinder müssen sich doch was dabei gedacht haben.

von del fange ich lieber gar nicht erst an, das ist ja offenbar sogar ein keyword :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

murphy hat geschrieben:zu methoden ohne (): wie oft schreibt ihr () ohne inhalt? und wie oft braucht ihr die methoden selbst?
Oft, weniger oft. Aber du willst einmal OO so pur wie möglich und dann ist dir () egal.
murphy hat geschrieben:module einzumischen und von klassen zu erben sind verschiedene dinge.
Ich sag ja das ich Mixins nicht verstehe ;)
murphy hat geschrieben:geht auch int.methods() oder type(var) == int?
Ja, seit Python 2.3 schon, vorher musste man halt type(0) oder type(int()) machen.
murphy hat geschrieben:was benutzt man eigentlich in Python statt null oder nil? irgendein "nicht definiert" muss es doch geben...
Gibt es auch: None. Das wird inzwischen langsam zur einzigen Konstante von Python, denn beim Zuweisen von Werten an None gibt es SyntaxWarnings, die später sicher zu Errors werden.
murphy hat geschrieben:meine frage bleibt: warum kein 'abc'.len()? wieso dieser seltsame umweg über __len__? das erweckt den eindruck, man würde mit einer definition von __len__ geheimnisvolle dinge tun, die Python unglaublicherweise ermöglicht. upper() ist doch auch eine echte methode (weil ja upper('abc') auf __upper__() umgeleitet wird.)
warum nicht auch len? ich will es ja nicht ändern, ich will bloß wissen, warum len() anders sein soll. die erfinder müssen sich doch was dabei gedacht haben.
Hmm, ich nehme halt einfach das ist auch für irgendeinen internen Spass gedacht, da Python wirklich mit den __ Funktionen unglaubliche Dinge macht. Ich nahme mal an das irgendeine von diesen unglaublichen __ Funktionen auf __len__ zurückgreift, aber keine auf upper zugreift.
murphy hat geschrieben:von del fange ich lieber gar nicht erst an, das ist ja offenbar sogar ein keyword :D
Ja, kannst es aber auch als Funktion verwenden. Genauso wie print ein Keyword zu sein scheint. In meiner irb kann ich ja auch print 'abc' aufrufen, ohne probleme. Und in ipython kann ich sogar len als Keyword verwenden ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Nö, ein __hasattr__ gibts nicht, wie und wo Attribute gesucht und gefunden werden hängt ab ob es sich um newstyle- oder oldstyle-Klassen handelt. Bei oldstyle stehen alle Attribute in __dict__. Bei newstyle stehen die Namen von Attributen in __slots__, die Methoden sind extra definiert und dann gibts noch Properties, damit lassen sich Pseudoattribute definieren die z.B. Zur Laufzeit berechnet werden, oder auch readonly-Attribute lassen sich mit Properties verwirklichen.
Daß len eine Funktion ist, hat bei Python historische gründe, in den ersten Pythonversionen war eben noch nicht alles Objektorientiert. len() gibt ja nicht nur die Länge von Strings sondern auch von Listen, Tuples, Dictionaries und sogar von xrange-Objekten zurück. Es gibt ja auch noch (aus historischen Gründen) das modul strings, das aber praktisch kaum noch gebraucht wird.

Ausser None gibts auch noch die Konstanten True und False, die auch die einzigen Instanzen von bool sind.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

murphy hat geschrieben:
Milan hat geschrieben:Es gibt in meinen Augen keinen Unterschied zwischen Methoden, Methodenaufrufen und Attributen.
Ruby hat, wie Smalltalk, keine attribute. instanzvariablen sind nur innerhalb der klasse verfügbar und beginnen mit @. zugriffsmethoden gehen per attr_reader & friends. alles ist ein objekt, objekte haben nach außen nur methoden. vorteil: kapselung; nachteil: ein wenig mehr schreibarbeit
ich verstehe bei deinem code gar nicht, zu was das x jetzt gehört. wann/wie oft wird x 1 zugewiesen? zu wem gehört x?
Naja, x ist nun hier ein Klassenattribut, also eine Attribut, auf das alle Instanzen denselben Zugriff haben und Identität vorherrscht (zumindest bei Newstyle Klassen). Ist bei Konstanten sinnvoll, bei mutable Objects ist es sinnvoller bei der Initialisierung ein self.x= ... zu schreiben.
zu methoden ohne (): wie oft schreibt ihr () ohne inhalt? und wie oft braucht ihr die methoden selbst?
ich finde es gar nicht so schlimm, dass man in Ruby etwas mehr schreiben muss:

Code: Alles auswählen

foo.bar  # methodenaufruf
foo.method(:bar)  # methode
habe das noch nie gebraucht. musste erst in der doku nachschauen.
Methoden selbst brauche ich nicht oft, aber Funktionen. Das fällt dir wahrscheinlich in ruby nicht so auf, da alles mehr auf OO hinausläuft. Außerdem ist es für mich persöhnlich lesbarer, wenn man Klammern schreibt, vor allem wenn die Funktionen/Methoden optionale Argumente oder Keywords haben. In Ruby kann man doch aber wenigstens trotzdem Klammern setzen, oder?
print zB ist ja auch nur eine methode...da hat ja auch Python keine klammern.
Das ist ein Spezialfall, ich sehe es mehr als statement (print ! :wink:), deswegen. Du kannst auch sys.stdout.write(...) schreiben, wenn du das lieber magst :lol: .

Code: Alles auswählen

>>>type(true)
<type 'bool'>
>>>type(0)
<type 'int'>
>>>class myint(int):'
geht auch int.methods() oder type(var) == int?
Was leistet int.methods? Wenn du eine Übersicht über alle Attribute haben willst rufst du dir(obj) und wenn du wissen willst obs Methoden sind rufst du callable(obj). Das hat hier wieder den Sinn, dass man auch Methoden als Attribute ansehen kann und grundsetzlich wieder als Argumente verwenden kann. Und ja, type(0)== int oder type(0) is int geht.
was benutzt man eigentlich in Python statt null oder nil? irgendein "nicht definiert" muss es doch geben...
Nimm stattdessen None.
Gute Frage, warum nicht? Das haben sich auch die Python Entwickler gedacht, deswegen macht len() genau das:

Code: Alles auswählen

>>>len('abc')
3
>>>'abc'.__len__()
3
Du siehst also das len() __len__() aufruft, das kannst du dann auch in deinen Klassen definieren und auch deine Klassen funktionieren dann mit len().
meine frage bleibt: warum kein 'abc'.len()? wieso dieser seltsame umweg über __len__? das erweckt den eindruck, man würde mit einer definition von __len__ geheimnisvolle dinge tun, die Python unglaublicherweise ermöglicht.
Naja, Objekte die eine Länge haben waren früher halt nur einige Builtin Typen. Wie das nun gekommen ist weiß ich nicht, aber vom Effekt her ist es mir egal wie ich es rufe. Es geht halt und da lege ich nicht direkt Wert darauf. Wer möchte kann ja wieder self.len=self.__len__ definieren :wink: :lol: . Nein, kleiner Spaß... Das ist in meinen Augen im Zusammenhang zur restlichen Philosophie zu sehen, wo alle Operatoren und Funktionen auf diese Weise in eigenen Klassen implementiert werden, dann machts schon wieder Sinn.
von del fange ich lieber gar nicht erst an, das ist ja offenbar sogar ein keyword :D
Richtig. Da macht es aber wirklich Sinn, denn del hat mehr als eine Bedeutung. Du kannst damit sowohl Referenzen auf Variablen vernichten als auch einzelne Elemente in Listen oder Dictionarys löschen.


Ich bin gerade dabei die Diskussion im Rubyforum zu lesen. Hochinteressant, muss ich sagen. OO mäßig ist Ruby Python wohl an Eleganz etwas voraus, aber allein deswegen würde ich nicht unbedingt umsteigen. Dafür brauchts bei mir doch noch ein wenig mehr, denn ich programmiere eher funktional, modular und lege Wert auf Iteratoren wo ich kann. Wie sieht es damit in Ruby aus? Gibt es auch sowas wie yield? Sowas wie Generator Expressions?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!
Milan hat geschrieben: Gibt es auch sowas wie yield? Sowas wie Generator Expressions?
Hihi! Klar gibt's bei Ruby yield. Das hat Python ja von Ruby geklaut :D Naja, jedenfalls war's bei Ruby schon vor Python da. List Comprehension und Generator Expression (gibt's doch erst in 2.4, oder?) sind Dinge die ich in Ruby schmerzlich vermisse.

Gruß, mawe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

List Comprehensions sind schon länger drin, Generators sein 2.2 per future und in 2.3 per default. Generator Expressions sind ab 2.4 dabei, aber was sind sie denn? Viele Leute haben schon erzählt wie toll sie sind,aber ich weis nichtmal was sie sind. Genausowenig sehe ich was an den Python 2.3 sets so toll ist, das ist halt eine Art List mit add() und remove() wo es keine doppelten Werte gibt, oder?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi Leonidas!

Das gibt's doch erst in 2.4 hat sich nur auf Generator Expressions bezogen. Aber danke für die Nachhilfe in Python-Historie :D

Gruß, mawe
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Leonidas hat geschrieben:List Comprehensions sind schon länger drin, Generators sein 2.2 per future und in 2.3 per default. Generator Expressions sind ab 2.4 dabei, aber was sind sie denn? Viele Leute haben schon erzählt wie toll sie sind,aber ich weis nichtmal was sie sind.
Hi. Im Prinzip sind sie List comprehensions, aber jedes Element wird halt erst erzeugt, wenn es gebraucht wird. Schau dir mal den Code hier an:

Code: Alles auswählen

a=lambda num=10:[x**2 for x in xrange(num) if x%2]
#ist dasselbe wie:
def a(num=10):
    erg=[]
    for i in xrange(num):
        if i%2:
            erg.append(i**2)
    return erg

#kann man auch als generator schreiben:
def b(num=10):
    for i in xrange(num):
        if i%2:
            yield i**2
#oder noch besser als
b=lambda num=10: (x**2 for x in xrange(num) if x%2)
a liefert eine Liste, b ein Generator, also ist b speicherfreundlicher und trotzdem genauso kompakt. Man kann aber sagen a(x)==list(b(x)) .
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mawe hat geschrieben:Das gibt's doch erst in 2.4 hat sich nur auf Generator Expressions bezogen. Aber danke für die Nachhilfe in Python-Historie :D
Hups, sorry, das kommt davon wenn man nicht schaut wer was geschrieben hat.

@Milan: also ist bei den Generator Expressions in Lambdaform nur der Unterschied das es runde statt eckigen Klammern gibt und es dadurch von einer List Comprehension zu einer Generator Expression wird?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

noch was zu Generatorexpressions.
Generatorexpressions kannst Du überall verwenden, wo du sonst erst eine Liste erzeugen würdest.

Code: Alles auswählen

a = [x*x for x in xrange(1,101)]
print a # gibt eine Liste aus mit den Quadraten der Zahlen 1 bis 100
a = (x*x for x in xrange(1,101))
print a # <generator object at 0x...>[/b]
a = dict(enumerate(x*x for x in xrange(1,101)))
print a
Das ganze bringt einen neuen Schub in die funktionale Programmierung in Python.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hups, jetzt wolle ich das mit Python 2.3 testen, oh wunder geht nicht.
Gibt es nicht irgendwo eine from __future__ import Funktion zum Nutzen von Generator Expressions in Python 2.3?
Wofür gibt es eigentlich die __future__ imports? Das Zeug dort ist doch sowieso wieder im nächsten größeren Release per default drin.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
murphy
User
Beiträge: 60
Registriert: Samstag 30. Oktober 2004, 01:34
Wohnort: Berlin
Kontaktdaten:

@leonidas:
print ist in Ruby eine methode, ohne dass man es merkt. dazu muss man allerdings das mit dem toplevel-objekt verstehen, das kann ich jetzt nicht noch ausführen (ist ja auch kein Ruby-forum ;))

also __len__ mag ich nach wie vor nicht, auch mit historischen gründen :) lassen wir das.

@Dookie: newsytle und oldstyle-klassen, die ich unterschiedlich benutzen muss? urks...klingt kompliziert ;)
readonly-attribute und virtuelle methoden gehen in Ruby auch, mit attr_reader und method_missing.

@milan: ja du darfst klammern benutzen, musst du ja manchmal. seit Haskell benutze ich sie eigentlich nie, solange es sich vermeiden lässt.
Das ist ein Spezialfall
schade. spezialfall bedeutet für mich, dass ich ihn speziell behandeln muss, das schränkt meine freiheit ein und steigert den lern- und schreibaufwand.
aber ohne spezialfälle kommt wohl keine sprache aus.
in Ruby gibt methods einfach ein array mit methodennamen zurück.
Da macht es aber wirklich Sinn, denn del hat mehr als eine Bedeutung. Du kannst damit sowohl Referenzen auf Variablen vernichten als auch einzelne Elemente in Listen oder Dictionarys löschen.
del hat verschiedene bedeutungen, und deshalb ist es keine methode? :kopfkratz: naja, da kommen wir wohl nicht weiter.

@mawe: list comprehensions in Ruby? die antwort sind codeblöcke:

Code: Alles auswählen

p (1..16).select { |x| x % 2 == 0 }  #-> [2, 4, 6, 8, 10, 12, 14, 16]
p ('A'..'E').map { |x| x * 3 }  #-> ["AAA", "BBB", "CCC", "DDD", "EEE"]
beim zweiten hab ich die Python-entsprechung noch gar nicht gefunden...

---

ich will hier niemanden zu Ruby konvertieren oder Python schlecht machen. mir persönlich kommen nur viele dinge seltsam vor, und ich finde Ruby's antworten auf viele fragen einfach besser und logischer.
beide sprachen sind einerseits viel weiter entwickelt als diese öden mainstreamsprachen, andererseits auch weit davon entfernt, perfekt zu sein. beide haben voneinander gelernt, und diskussionen über die unterschiede führen hoffentlich zu noch besseren sprachen.
schade nur, dass sich einige konzepte so radikal auschließen: whitespace-anarchie vs. indent-pflicht, implizite methoden vs. explizites self, optionale vs. leere klammern...
Ruby mit Python zu mischen scheint mir unmöglich.

wer noch ein paar MB frei hat, sollte sich Ruby trotzdem installieren, und wenn man es nur für einzeiler einsetzt (statt Perl ;))
Python wird jedenfalls auf meinem system bleiben, leider weiß ich im moment nicht, was ich drin programmieren sollte...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

murphy hat geschrieben:

Code: Alles auswählen

p (1..16).select { |x| x % 2 == 0 }  #-> [2, 4, 6, 8, 10, 12, 14, 16]
p ('A'..'E').map { |x| x * 3 }  #-> ["AAA", "BBB", "CCC", "DDD", "EEE"]
beim zweiten hab ich die Python-entsprechung noch gar nicht gefunden...
Kein Problem da helfe ich dir aus, List Comprehensions verstehe sogar ich:

Code: Alles auswählen

[i * 3 for i in ('A', 'B', 'C', 'D', 'E')]
['AAA', 'BBB', 'CCC', 'DDD', 'EEE']
Edit: mir ist grad aufgefallen das das auch einfacher geht:

Code: Alles auswählen

[i * 3 for i in 'ABCDE']
['AAA', 'BBB', 'CCC', 'DDD', 'EEE']
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Tja, das mit den Newstyle Klassen ist noch serh neu in Python und muss sich erst noch vollständig etablieren. Solange gibt es eine Übergangsphase mit beiden Varianten. Newstyle mäßig kann Python dann aber doch schon einges mehr an OOP. Das ist mir jetzt aber zu viel zu schreiben, das überlass ich unserem Dookie :D .
murphy hat geschrieben:
Das ist ein Spezialfall
schade. spezialfall bedeutet für mich, dass ich ihn speziell behandeln muss, das schränkt meine freiheit ein und steigert den lern- und schreibaufwand.
aber ohne spezialfälle kommt wohl keine sprache aus.
in Ruby gibt methods einfach ein array mit methodennamen zurück.
Solange es nur der Spezialfall zur ausgabe ist :wink: ...
Da macht es aber wirklich Sinn, denn del hat mehr als eine Bedeutung. Du kannst damit sowohl Referenzen auf Variablen vernichten als auch einzelne Elemente in Listen oder Dictionarys löschen.
del hat verschiedene bedeutungen, und deshalb ist es keine methode? :kopfkratz: naja, da kommen wir wohl nicht weiter.

Code: Alles auswählen

a=[1,2,3,4,5]
print a
del a[1] #lösche die 2
print a
del a[1:3] #lösche die 3 und 4
print a
del a
print a #NameError
Ließe sich bestimmt auch als Methode machen, aber warum? del geht ja nicht nur für Objekte, die Container sind.
@mawe: list comprehensions in Ruby? die antwort sind codeblöcke:

Code: Alles auswählen

p (1..16).select { |x| x % 2 == 0 }  #-> [2, 4, 6, 8, 10, 12, 14, 16]
p ('A'..'E').map { |x| x * 3 }  #-> ["AAA", "BBB", "CCC", "DDD", "EEE"]
beim zweiten hab ich die Python-entsprechung noch gar nicht gefunden...
Naja, das geht dann auch mit List Comprehensions... früher mit map, aber das ist dadurch überfallig geworden.

Code: Alles auswählen

[x for x in xrange(1,17) if x%2==0]
[x*3 for x in "ABCDE"]
wer noch ein paar MB frei hat, sollte sich Ruby trotzdem installieren, und wenn man es nur für einzeiler einsetzt (statt Perl ;))
Python wird jedenfalls auf meinem system bleiben, leider weiß ich im moment nicht, was ich drin programmieren sollte...
Genauso geht es mir, wenn ich mir ruby installieren wollte. Ich finde einige Konzepte genial, aber der Großteil missfällt mir leider. Ich würde automatisch wieder in mein Pythonstil zurückfallen. Aber über Sprachen zu diskutieren macht mir Spaß, man lernt eine Menge dabei und kann sich Ideen holen. Ich bin sicher, dass beide in Zukunft auch noch viel voneinander lernen werden, aber jede Sprache ihren eigenen Weg geht... so ists ja immer, wenn Sprachen von anderen "abgucken". :wink: :lol: .
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!
murphy hat geschrieben: list comprehensions in Ruby? die antwort sind codeblöcke:
Ich weiß, hast Du mir ja schon im Ruby-Forum gezeigt :D. map gibt's in Python auch. Hab ich anfangs auch verwendet (weil ich's von Perl gewöhnt war). Mittlerweile nehme ich nur noch LC. Findest Du die nicht auch ... wie soll ich sagen ... intuitiver (na gut, das schreibt man sicher anders :D. Ich hoffe Du weißt was ich meine).
murphy hat geschrieben: beim zweiten hab ich die Python-entsprechung noch gar nicht gefunden
Brauchst nicht lange suchen. Die Antwort ist eine ... tadaa! ... List Comprehension :D

Gruß, mawe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dier fand ich ganz nett zum Verstehen von LCs: http://www.secnetix.de/~olli/Python/lis ... sions.hawk
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi

tolle Diskussion (die im Ruby-Forum ist auch nicht schlecht) ;-). Bei meinem ersten Antwortversuch zur eigentlichen Frage ist bei uns leider das Netz zusammengebrochen :? , aber die Diskussion hat sich ja doll entwickelt.

Ich verstehe bloß den Trubel um Pythons spezielle Klassenmethoden (à la __len__ ) nicht: __len__ zu definieren ist doch u. U. semantisch notwendig in einer Klasse. Das dürfte doch allen klar sein (scheint ja auch allen klar zu sein). Wo ist denn das Problem, wenn man zum Aufruf mehrere Optionen hat? Vermisst jemand syntaktische Eindeutigkeit? Warum? Klärt mich doch bitte mal auf.

Im Übrigen habe ich - durch diese Diskussion angeregt - entdeckt, daß auf meiner Obstkiste Ruby schon vorinstalliert war. Kurzes Reinschnuppern war sehr interessant, aber mir geht es wie Dir, murphy, ich bleibe lieber, bei dem was ich kenne und schätze.

Gruß und schönes Wochenende,
Christian
Malte aus dem Ruby-Forum

CM hat geschrieben:__len__ zu definieren ist doch u. U. semantisch notwendig in einer Klasse. Das dürfte doch allen klar sein (scheint ja auch allen klar zu sein). Wo ist denn das Problem, wenn man zum Aufruf mehrere Optionen hat? Vermisst jemand syntaktische Eindeutigkeit?
Da ich Python kaum kenne, kann ich hier natürlich schlecht mitreden, trotzdem versuch ich es mal. Wenn ich in Python programmieren müsste und len(str) statt str.length schreiben müsste, wäre das erste Gegenargument natürlich, dass es nicht so wie in Ruby ist ;-). An zweiter Stelle geht es hier um das "OO-feeling" (gibt es so was?), da der Ruby-Code mir zeigt, das length eine Methode von String ist, während der Python-Code vor mit versteckt, dass __len__ eine Methode von String ist.

Grüße
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Ruby ist ja u.a. mit dem Ziel entwickelt worden, "objektorientierter" zu sein als Python. Das zeigt sich auch in der Syntax. Welche man bevorzugt, ist meiner Meinung nach Geschmackssache. Es würde mich nicht wirklich stören, wenn man in Python auch "hello".length() schreiben könnte, es ärgert mich allerdings auch nicht sonderlich daß man es nicht tut :wink:. (Um ehlich zu sein hab ich mich noch nicht dafür interessiert, wie Python z.B. len intern behandelt).
Es gibt allerdings etwas, das mich bei Python nervt: join :evil:

Code: Alles auswählen

x = "h.e.l.l.o".split(".")   # -> ['h','e','l','l','o']
".".join(x)   # warum nicht x.join(".")
Gibt's da eine Erklärung?

Gruß, mawe
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

HI. Ja mawe, die gibts: ich fänd es nämlich sehr dumm, wenn eine Liste eine Methode beherrschen würde, bei der ein String rauskommt, also eigentlich eine Stringoperation. Da seh ich das schon sinnvoller so zu schreiben: verbinde mit "." die Liste x. Da join eine Methode von str ist, weiß ich auch, dass ein str rauskommt :D .
Antworten