Python-Spickzettel für PHP-Entwickler

Gute Links und Tutorials könnt ihr hier posten.
marcel.normann
User
Beiträge: 5
Registriert: Montag 10. April 2006, 17:29
Wohnort: Kirchen (Sieg)
Kontaktdaten:

Python-Spickzettel für PHP-Entwickler

Beitragvon marcel.normann » Montag 10. April 2006, 17:31

Hallo!

Ich habe ein kleines Spickzettel-PDF erstellt, in dem die meiner
Meinung nach wichtigsten Unterschiede, Fallstricke und Standardfunktionen dokumentiert sind. Ich selbst habe während meiner Einstiegsphase in Python immer wieder nach diesen Schnipseln gesucht, möge es zukünftigen Einsteigern eine kleine Hilfe sein:

http://www.experimentierkasten.de/python_php.pdf (~120 KB)

Ich bitte um Korrekturen und Erweiterungsvorschläge. Was für meinen
Geschmack jetzt schon fehlt, ist die Anlage assoziativer Arrays. Insgesamt soll das Dokument nicht grösser als eine Doppelseite Din-A4 werden, aber bis jetzt ist mit einer Seite noch genug Platz für Ergänzungen.

Danke und Gruß,
Marcel
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Montag 10. April 2006, 18:48

Ich finde das cool.
Ich habe keine ahnung wie "pythonic" es ist, aber mir gefällt die Zuweisung von Werten in ein Tupple ohne die Klammern nicht.

Bei den Rechenproblemen halte ich es auch für stilvoller die Null aus zu schreiben: 7.0/4.0


OT:
wäre lustig sowas auch für Python - Ruby bzw Python - Perl zu haben.

Edit:
Wie unhöflich von mir - herzlich willkommen im Forum!
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Beitragvon Python 47 » Montag 10. April 2006, 18:52

Auch von mir erstmal ein Herzliches Willkommen!

Mr_Snede hat geschrieben:OT:
wäre lustig sowas auch für Python - Ruby bzw Python - Perl zu haben.


Ich fände sowas für Pythn-C/C++ sehr gut!
mfg

Thomas :-)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Python-Spickzettel für PHP-Entwickler

Beitragvon gerold » Montag 10. April 2006, 19:49

marcel.normann hat geschrieben:Ich bitte um Korrekturen und Erweiterungsvorschläge.

Hi Marcel!

Nette Seite, aber die Wahrheitswerte würde ich anders beschreiben:

Falsch:
0; False; ""; []; (); {}

Richtig:
Alles was nicht *Falsch* ist:
-3; 1; 2; 3; True; "asdf"; [0]; (0); {0: 0}

mfg
Gerold
:-)

Edit: Sorry, hatte einen Beistrich zu viel.
Zuletzt geändert von gerold am Montag 10. April 2006, 22:03, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
marcel.normann
User
Beiträge: 5
Registriert: Montag 10. April 2006, 17:29
Wohnort: Kirchen (Sieg)
Kontaktdaten:

Beitragvon marcel.normann » Montag 10. April 2006, 20:54

Danke erst mal an alle für die Willkommensgrüsse.

Mr_Snede hat geschrieben:...aber mir gefällt die Zuweisung von Werten in ein Tupple ohne die Klammern nicht.


Mir gefällt die Version mit Klammern nicht, weil hier dieses seltsame Komma am Ende auftaucht. PHP-Umsteiger kennen den Unterschied zwischen Tupel/Liste ja garnicht, deshalb fand ich es sinnvoll, die gängigen Methoden aufzuschreiben.

Mr_Snede hat geschrieben:Bei den Rechenproblemen halte ich es auch für stilvoller die Null aus zu schreiben: 7.0/4.0


Ich werde es als zusätzliche Schreibweise aufnehmen.

gerold hat geschrieben:Falsch:
0; False; ""; []; (,); {}

Richtig:
Alles was nicht *Falsch* ist:
-3; 1; 2; 3; True; "asdf"; [0]; (0); {0: 0}


Sicher?

>>> False == 0
False
>>> True == ""
False

Oder habe ich jetzt was falsch verstanden?

Mal gucken wie ich das mit dem Platz mache. Für eine Doppelseite habe ich viel zu wenig, für eine einzelne Seite etwas zuviel. Die assoziativen Arrays sollen aber auf jeden Fall noch mit rein. Vielleicht nehme ich beim PHP-Code die if-Klammern raus, was ich eigentlich sehr hässlich finde.

Mal eine Frage nebenbei: Gibt es eigentlich in Pyhton Ternär-Operatoren, also sowas wie:

echo ('a' == 'a' ? 'a' : 'b');

?

Gruß, Marcel
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Montag 10. April 2006, 21:03

Oder habe ich jetzt was falsch verstanden?


Ja.

Python vergleicht bei einem Vergleich nicht den Wahrheitswert des Objekts, sondern die Objekte selbst. Das Objekt False ist sicherlich nicht gleich dem Objekt leere Zeichenkette (besser gesagt, es hat sicherlich nicht den gleichen Wert, der Vergleich ob es das selbe Objekt ist wird mittels is gemacht).

Beide sind aber, als Wahrheitswert ausgewertet, falsch.

Was Du aber machen kannst um rauszufinden was für einen Wahrheitswert ein Objekt hat:

Code: Alles auswählen

print bool(False)
print bool("")
print bool([])
...


oder aber:

Code: Alles auswählen

if "":
    print "True"
else:
    print "False"


Ersetze im letzten Beispiel "" durch ein Objekt Deiner Wahl das Du testen willst.

Zum ternären Operator: Ja und nein.

Einen ternären Operator per se gibt es nicht, es gibt aber eine ganze Menge Möglichkeiten (also Idiome) etwas derartiges zu schreiben. Zum Beispiel:

Code: Alles auswählen

x = 1
print x and "wahr" or "falsch"
print ["falsch","wahr"][bool(x)]
print {False:"falsch",True:"wahr"}[bool(x)]
print [lambda:"falsch",lambda:"wahr"][bool(x)]()


Wobei nur der erste und letzte Short-Circuting sind, und der erste _nur_ funktioniert wenn der Wahrheitswert von "wahr" selbst wahr ist, sprich folgendes geht nicht (beziehungsweise liefert nicht das gewünschte Ergebnis):

Code: Alles auswählen

x = 1
print x and 0 or 1


liefert immer 1, weil das "wahr"-Objekt in diesem Beispiel selbst falsch ist, also x and 0 niemals wahr werden kann.
--- Heiko.
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Montag 10. April 2006, 21:10

marcel.normann hat geschrieben:Sicher?

>>> False == 0
False
>>> True == ""
False

Oder habe ich jetzt was falsch verstanden?


Bis ptyhon2.3 gabs gar kein True/False. Da wurde einfach ein objekt auf länge > 0, obj.__nonzero__() == 1 ausgewertet.

Mal eine Frage nebenbei: Gibt es eigentlich in Pyhton Ternär-Operatoren, also sowas wie:

echo ('a' == 'a' ? 'a' : 'b');

ja und nein.

In python2.5 gibts welche (ich glaub schon implementiert), aber es gibt folgende "Lösung":

Code: Alles auswählen

>>> True and "TRUE" or "FALSE"
'TRUE'
>>> False and "TRUE" or "FALSE"
'FALSE'

Solange der wert nach "and" nicht false ist, funktioniert es wie gewünscht.
TUFKAB – the user formerly known as blackbird
marcel.normann
User
Beiträge: 5
Registriert: Montag 10. April 2006, 17:29
Wohnort: Kirchen (Sieg)
Kontaktdaten:

Beitragvon marcel.normann » Montag 10. April 2006, 21:32

modelnine hat geschrieben:Python vergleicht bei einem Vergleich nicht den Wahrheitswert des Objekts, sondern die Objekte selbst. Das Objekt False ist sicherlich nicht gleich dem Objekt leere Zeichenkette (besser gesagt, es hat sicherlich nicht den gleichen Wert, der Vergleich ob es das selbe Objekt ist wird mittels is gemacht).


Man lernt nie aus. Danke für den Tipp. PHP castet bei solchen Vergleichen ziemlich freizügig - was ich in der Regel kofortabel finde, jedoch auch zu unerwünschten Ergebnissen führen kann.

Ich lasse die Liste aber wahrscheinlich trotzdem in der jetzigen Form, da es mir vor allem um die korrekte Groß-/Kleinschreibung der beiden Werte geht.

Gruß, Marcel
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Montag 10. April 2006, 21:34

PHP castet bei solchen Vergleichen ziemlich freizügig - was ich in der Regel kofortabel finde, jedoch auch zu unerwünschten Ergebnissen führen kann.


Jupp. Man sagt deswegen auch dass Python stark und dynamisch typisiert ist, während PHP (und auch Perl) schwach und dynamisch typisiert sind.

Im Endeffekt kannst Du bei Python davon ausgehen dass eine Typkonversion (außer bei Zahlen) niemals ohne Dein direktes Eingreifen stattfinden wird.
--- Heiko.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Montag 10. April 2006, 21:44

marcel.normann hat geschrieben:
Mr_Snede hat geschrieben:...aber mir gefällt die Zuweisung von Werten in ein Tupple ohne die Klammern nicht.


Mir gefällt die Version mit Klammern nicht, weil hier dieses seltsame Komma am Ende auftaucht.

Habe selber nie ein Komma am Ende benutzt:

Code: Alles auswählen

>>> mytuple = ('a','b','c')
>>> mytuple
('a', 'b', 'c')


Edit:
Im Python Tutorial werden Tuples ohne Komma am Ende verwendet:
http://docs.python.org/tut/node7.html#S ... 0000000000
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Montag 10. April 2006, 21:50

Der einzige Ort wo man mit einer Klammer abschließen muß ist wenn man ein Tupel der Länge eins haben will:

Code: Alles auswählen

print repr(("hello"))
print repr(("hello",))


Die Klammern haben in Python nämlich einmal die Bedeutung eine Berechnung zu gruppieren (also Präzedenz zu verteilen), und zum anderen die Bedeutung dass ein Tupel daraus gemacht wird. Sonst, wenn man ein Tupel erstellen will, ist es gute Praktik immer Klammern zu verwenden. Ohne Klammern macht man eigentlich nur wenn man direkt Tupel-Unpacking verwenden will, wie zum Beispiel in:

Code: Alles auswählen

x, y = y, x


um zwei Variablen zu vertauschen.

Ein (halbwegs abschreckendes) Beispiel für Tupel-Entpacken:

http://www.python-forum.de/post-34778.html#34778
--- Heiko.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Beitragvon Python 47 » Montag 10. April 2006, 21:53

Das Komma taucht nur auf, wenn das Tupel nur ein Wert besitzt, weil es sonst ein String wäre:

Code: Alles auswählen

a=('a',)
b=('b')
type(a)
(type 'tupel')
type(b)
(type 'str')


/edit: Oh ich sehe gerade Modelnine war etwas schneller! :)
mfg



Thomas :-)
marcel.normann
User
Beiträge: 5
Registriert: Montag 10. April 2006, 17:29
Wohnort: Kirchen (Sieg)
Kontaktdaten:

Beitragvon marcel.normann » Montag 10. April 2006, 22:27

Dafür liebe ich Python: Jeden Tag entdeckt man etwas, womit man seinen Code noch pythonischer machen kann :D

Das letzte Komma beim Tuple nehme ich dann raus, ansonsten lasse ich beide Schreibweisen drin. Vielleicht nehme ich sogar nochg ein Tuple mit einem Element hinzu.

Das PDF hat natürlich keinerlei Anspruch in irgendeiner Weise komplett zu sein. Es soll nur PHP-Entwicklern eine erste Hilfe an die Hand geben, um erste kleine Codebröckchen zu schreiben. Die dargestellten Lösungen sollten einerseits PHP-nah sein, aber gleichzeitg auch auf Pyhton-Leckerlies hinweisen.

Gruß, Marcel


Edit: Die neue Version ist unter gleicher URL online
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Dienstag 11. April 2006, 21:37

So, ein paar kleine Korrekturen/Ergänzungen noch:

1)

print "abcd".replace("a","b") ---> # bbcd

2)

Rechenprobleme ist falsch. Sollte eher sowas wie "Integer-Division" heißen (bei der Python aus historischen Gründen die Typen nicht promoviert ---> float, wenn das Ergebnis nicht in einen Integer passt).

3)

print "Die Zahl ist %s" % (zahl,) hat nichts mit Zeichenverkettung zu tun, sondern bemüht den String-Formatting-Operator von Python (eben das %), der ähnlich wie printf("blah %s, %s",blubb,blubb) in C funktioniert, wobei %s bedeutet dass das Objekt zuerst mittels str(zahl) in einen String gecastet wird bevor es eingefügt wird, es gibt aber zum Beispiel %f um Floats zu formatieren, %i um Integer zu formatieren, etc. Unabhängig davon gibts in Python auch nichts vergleichbares wie "blah $blubb hastenichgesehen" in PHP; das geht eben nur über String-Formatting, womit ich %s in Python am ehesten vergleichen würde.

4)

+= ist im Normalfall ungleich .=, die Äquivalenz gilt nur für Zeichenketten. Denn "$a .= $b;" in PHP für zwei Zahlen liefert eine String-Konkatenation der beiden Zahlen, während in Python einfach die Summe der beiden Zahlen bei "a += b" gebildet wird und an a gebunden ist.

5)

'''
blah
'''

ist kein mehrzeiliger Kommentar, sondern einfach ein mehrzeiliger String. Da Du ihn nichts zuweist fungiert er wie ein Kommentar, es sollte aber irgendwie klarer herauszustellen sein dass ''' ''' identisch ist mit """ """ (so wie " und ' in Python für Strings absolut identisch sind, man benutzt den einen wenn man den anderen schreiben will, sprich es gibt keine Unterschiede beim Escaping zwischen den beiden Arten der String-Schreibweise, dafür gibts Präfixe wie u"" für Unicode-Strings, und r"" für "Rohe-Strings", die sich mehr oder weniger wie Strings ohne Escaping-Regeln verhalten).

6)

for-Schleife: Python besitzt keine Zählschleife, Python besitzt nur so etwas was ich Iterator-Schleife nennen würde (also was über alle Elemente eines gegebenen Objekts iteriert). range(5) -> [0,1,2,3,4] (also die Liste mit den Elementen 0-4), und über diese Liste wird iteriert, ein Element nach dem anderen. Ganz allgemein kann man über viele Dinge iterieren, wie zum Beispiel:

for x in "hello":
print x

Oder auch:

for x in {"blah":"blubb","asta":"lavista","baby":"!"}:
print x

(ausprobieren ;-) !) Diesen massiven Unterschied sollte man sinnigerweise irgendwie darstellen würde ich mal sagen...

7)

Wahrheitswerte vergleicht man in Python nicht. Sondern, man benutzt logische Operatoren. Wenn zum Beispiel gefragt ist dass zwei Objekte wahr sind, dann benutzt man "and", wenn eines der beiden mindestens wahr sein soll "or", oder eben auch not.

8 )

Soweit ich weiß heißt das Ding nicht Trinitäts-Operator, sondern auch auf Deutsch Ternärer Operator, einfach weil er drei Argumente nimmt.

Wenn mir noch was einfällt poste ich es gerne (wenn Du noch was hören magst ;-)), und nimm mir das viele Geschreibsel nicht übel; ich weiß dass es teilweise nicht für so einen Cheatsheet geeignet ist, aber vielleicht lässt sich trotzdem was davon integrieren, eben weil Python in einigen/vielen Dingen eine komplett andere Philosophie als PHP verfolgt, und man sowas durchaus rausstellen sollte aus meiner Sicht.
--- Heiko.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 11. April 2006, 23:02

modelnine hat geschrieben:Unabhängig davon gibts in Python auch nichts vergleichbares wie "blah $blubb hastenichgesehen" in PHP; das geht eben nur über String-Formatting, womit ich %s in Python am ehesten vergleichen würde.

Doch, seit PEP 292 (= Python 2.4) hat Python etwas vergleichbares, die Template-Strings. Verhält sich wie eben ein sehr simples Templating-System. Es ist zwar nicht exakt gleich wie z.B "Der Wert ist #{value}" in Ruby-Strings zum Beispiel, aber vergleichbar.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder