Archiv der Kategorie: Allgemein

Python3 — Index und Splices

Was ich jetzt zei­ge, funk­tio­niert übri­gens neben in Lis­ten auch in Tupel und Strings. Die Spli­ces sind einer der Grün­de was mich zum Python Fan gemacht hat.

Es gibt die Mög­lich­keit über den Index auf ent­spre­chen­de Ele­men­te in den Objek­ten zuzu­grei­fen:

Gezählt wird hier­bei von 0, womit 1 das zwei­te Ele­ment wäre usw.

Teilbereiche

Es ist als nächs­tes auch mög­lich einen kom­plet­ten Teil­be­reich abzu­grei­fen.  variable[von:bis]. von beginnt wie­der bei 0, bis aber bei 1:

Soll es kom­plett vom Anfang oder bis zum Ende gehen, kann man die Zahl ein­fach aus­las­sen:

Oder man kann auch von der ande­ren Rich­tung zäh­len, dazu ein­fach Nega­ti­ve Gren­zen ange­ben:

Steps

Und zum Fina­le kann man auch noch den Step ange­ben.  Das ist der drit­te Para­me­ter:

 

Der Schnellkurs

Bei Fra­gen hin­ter­las­se mir  ein­fach ein Kom­me­tar.

Python3 — Tupel

Das The­me heu­te wird ganz ein­fach. Das Tupel.

War­um, seht hier mal selbst:

Bis auf das append gleich wie die Lis­te, das habt ihr sicher schon erkannt. Und der Unter­schied zur Lis­te ist nun, das ein Tup­le nicht mehr änder­bar ist. Bedeu­tet es kann effi­zi­en­ter im Spei­cher ange­legt wer­den, da man nicht damit rech­nen muss es zu ändern. Wer jetzt meint, ein tup­le doch irgend­wie geän­dert zu haben, muss mit id() nur mal sei­ne id ver­glei­che und bekommt zu sehen das ein neu­es Objekt ange­legt wur­de:

Und dann noch eine Beson­der­heit. Ein Tup­le kann ich auch ohne Klam­mer schrei­ben. Schaut euch mal fol­gen­des an, was so (bis auf klam­mern weg­las­sen) auch mit Lis­ten funk­tio­niert:

Ein klei­ner vor­griff, auf die­se Wei­se kann man in Python Funk­tio­nen auch meh­re­re wer­te zurück geben: return a, b, c bzw. return (a,b,c). Hier emp­feh­le ich die Schreib­wei­se ohne klam­mern. Ansons­ten pas­siert es schnell, das man return für eine Funk­ti­on hält.

Fra­gen dazu?

 

 

Python3 — Listen

Lis­ten sind ein teil von dem, was Python zu so einer tol­len Pro­gram­mier­spra­che machen. Eigent­lich sind sie nichts ande­res als eine Samm­lung belie­bi­ger Wer­te. Das belie­big macht sie hier­bei so beson­ders. Nütz­lich ist das in vie­len Fäl­len.  Als ein­fa­ches Bei­spiel das lesen einer Datei. Hier kann es sich anbie­ten, aus jeder Zei­le eine Lis­te zu machen (Tren­ner ein Leer­zei­chen) und die­se wie­der in eine Lis­te zu hän­gen. So kann man Bequem auf jede Zei­le und dort auf jedes Wort zugrei­fen. Das zei­ge ich aber gleich, erst ein­mal ein paar ein­fa­che Funk­tio­nen und die sogen­an­ten Spli­ces:

Die hier gezeig­ten List Spli­ces sind in vie­len Situa­tio­nen hilf­reich. Z.b. in der Schlei­fe:

Zu beach­ten ist hier der Index. Der Beginnt mit 0 für das ers­te Ele­ment. Wenn ich jedoch einen Bereich fest­le­ge wie z.B. meine_liste[3:6] ist 6 auch das sechs­te Ele­ment, aber 3 das vier­te.

Details dazu habe ich noch mal hier zusam­men­ge­fasst.

Beispiel mit Datei

Und nun das ver­spro­che­ne Bei­spiel, von der Datei zur Lis­te. Datei ope­ra­tio­nen sind in Python ziem­lich unspek­ta­ku­lär. Die ers­te Zei­le liest näm­lich schon die gan­ze Datei in die Lis­te. Genau­er gesagt das read­lines().  Die Lis­ten Ein­trä­ge reprä­sen­tie­ren nun die ein­zell­nen Zei­len als lan­ger String. Split kann die­se am Leer­zei­chen auf­tren­nen, und gibt das erneut als Lis­te zurück. Split akzep­tiert übri­gens als Para­me­ter auch jedes ande­re Zei­chen.

Ab jetzt der weg zur Lis­te in der Lis­te. Wie erwähnt besteht die Lis­te aus belie­bi­gen Inhal­ten. Das kön­nen also, Strings und Inte­ger, aber genau­so wei­te­re Lis­ten, Dic­tiona­rys oder Funk­tio­nen sein.

Ein kür­ze­rer Weg wäre die List Com­pre­hen­si­on. Die­se fasst unsern Con­tai­ner und die Schlei­fe direkt zusam­men.

Weitere Listenfunktionen

Gibt es einen Wert in der Lis­te (sie­he auch den Abschnitt Per­for­mance)

Wert an eine Lis­te anhän­gen:

Aber Ach­tung:

Bug? Nein Fea­ture. Lis­ten kön­nen ziem­lich groß wer­den. Es wäre oft nicht effi­zi­ent die­se ein­mal kom­plett im Spei­cher zu kopie­ren, obwohl man eigent­lich viel­leicht nur den Namen ändern will. Was also hier gera­de pas­siert ist,  ist das wir mit liste2 eine wei­te­re Varia­ble auf die ers­te Lis­te zei­gen las­sen. Braucht man eine eigen­stän­di­ge Lis­te, muss man expli­zit kopie­ren:

Zum die­sem The­ma (Mutal­be und Imu­ta­ble Typen), schrei­be ich jedoch noch einen kom­plett eige­nen Bei­trag.

Fazit

Dies hier ist nur ein ganz klei­ner Ein­stieg in Lis­ten. Man kann mit ihnen noch so eini­ges mehr machen. Dazu schaut kurz mal in der Python Doc vor­bei. Aus mei­ner Erfah­rung sind sie sehr prak­tisch und lösen vie­le Auf­ga­ben.

Der Schnellkurs

Bei Fra­gen hin­ter­las­se mir  ein­fach ein Kom­me­tar.

Python3 — Strings und Zahlen

Hier nun der Teil zu Strings und Inte­ger in mei­ner Python3 Schnell­ein­stiegs Serie.

Strings

Wie in andern Spra­chen auch, ist ein String eine Zei­chen­fol­ge. In Python hat die­se eine belie­bi­ge Län­ge und ist auch Binär sicher (Unter­stützt somit 0-Bytes).

Ob Strings in ein­fa­chen oder dop­pel­ten Anfüh­rungs­zei­chen geschrie­ben wer­den, macht kei­nen Unter­schied. Ledig­lich muss man in einem String der in Dop­pel­ten Anfüh­rungs­zei­chen steht, das ein­fa­che Anfüh­rungs­zei­chen nicht Escapen und umge­kehrt.

Gene­rell kann man sich bei Python übri­gens das Escapen in RegEx Aus­drü­cken spa­ren, wenn man den String ent­spre­chend kenn­zeich­net:

Eine wei­te­re Beson­der­heit sind auch mehr­zei­li­ge Strings. Die­se wer­den mit 3 Anfüh­rungs­zei­chen ein- und aus gelei­tet. Ein­fach oder dop­pelt macht auch hier kei­nen Unter­schied.

String Funktionen

Hier noch ein paar nütz­li­che Funk­tio­nen mit Strings

Zahlen

In python wird zwi­schen Ganz­zah­len (Int) und Fliess­kom­ma­zah­len (Float) unter­schie­den:

Wie im Bei­spiel zu sehen, wan­delt Python3 beim Divi­die­ren von Inte­ger auto­ma­tisch nach Float um. Das war in Python2 noch nicht so.

Mehr muss im Rah­men eines Schnell­ein­stie­ges gar nicht gesagt wer­den.  Es ste­hen ansons­ten alle Ver­gleichs­ope­ra­to­ren von hier zur Ver­fü­gung.

Konvertieren

Zwi­schen allen drei Typen (str, float, int) kann übri­gens auch ein­fach kon­ver­tiert wer­den.

Der Schnellkurs

Bei Fra­gen hin­ter­las­se mir  ein­fach ein Kom­me­tar.

Python3 — Bedingungen

Bei den Bedin­gun­gen if, elif oder while, prü­fen wir eigent­lich nur ob ein Wert oder eine Bedinung True oder Fal­se ist.

Als Ver­gleichs­ope­ra­tio­nen ste­hen zu Ver­fü­gung:

Ver­gli­chen wer­den, kann so eini­ges. Das Ergeb­nis ist immer ein Bool­scher Wert, True oder Fal­se. Ver­gli­chen wer­den kön­nen Strings, genau­so wie Inte­ger oder Float Wer­te. Auch direkt das Ergeb­nis von Funk­tio­nen, hier ein Bei­spiel:

Als Ope­ra­to­ren ste­hen and, or und not zur ver­fü­gung:

Die Beding­te Code Aus­füh­rung klappt nun mit dem bekann­ten if, else und elif. Wich­tig hier die Syn­tax von Python, Es wird ein Block durch den Dop­pel­punkt gestar­tet, der solan­ge besteht wie ein­ge­rückt wird:

Sim­pel oder?

Der Schnellkurs

Bei Fra­gen hin­ter­las­se mir  ein­fach ein Kom­me­tar.

Python3 — Variablen

Variablen

Varia­blen­na­men in Python sind erst­mal Case Sen­si­tiv. Ansons­ten sind fol­gen­de Zei­chen erlaubt:

  • A bis Z und a bis z
  • 0–9 (nur nicht an ers­ter Stel­le)
  • _ (under­so­c­re)
  • uni­code zei­chen, was aber nicht rat­sam ist.

Ein Dol­lar Zei­chen am Anfang wird nicht benö­tigt. Spart auf Dau­er auch wie­der eini­ges an getipp­ten Zei­chen.

Und dann gibt es einen gro­ßen Unter­schied zu spra­chen wie Java oder C. In die­sen wer­de näm­lich Varia­blen typi­siert. Das ist in Python jedoch nicht der Fall. Eine Varia­ble in Python hat kei­nen Typ. Wohl aber das Objekt, auf wel­che die Varia­ble ver­weist.

Somit funk­tio­niert das fol­gen­de pro­blem­los:

Sprich eben noch auf ein int Objekt ver­wie­sen, kann die varia­ble im nächs­ten Moment auf einen String zei­gen. Varia­blen kön­nen auf alles ver­wei­sen, auch auf Funk­tio­nen. Dazu spä­ter mehr.

Es bleibt noch zu mer­ken das eine Varia­ble erst zur Lauf­zeit ent­steht und zwar zum Zeit­punkt der ers­ten Zuwei­sung.

Gültigkeit

Bei der Gül­tig­keit einer Varia­ble gibt es einen etwas eigen­wil­li­gen Ansatz. Der ist aber auch der Tat­sa­che geschul­det böse Glo­ba­len Varia­blen zu ver­mei­den. Für die Bei­spie­le ein Hin­ter­grund: def lei­tet eine Funk­ti­on ein. Dann fan­gen wir an:

Dies funk­tio­niert, da  s nicht inner­halb der Funk­ti­on lokal defi­niert ist. Es wird (lesend) auf die glo­ba­le Varia­ble s zuge­grif­fen.

Hier erfolgt aus Aus­ga­be:

Die Varia­ble s in der Funk­ti­on f bleibt nun eine loka­le Varia­ble inner­halb der Funk­ti­on und hat wie jede ande­re in Funk­tio­nen defi­nier­ten Varia­blen kei­nen Ein­fluss außer­halb der Funk­ti­on.

Der mix geht jetzt natür­lich nicht:

Die­ses Cha­os ergibt zu recht ein: Unbound­Lo­cal­Error: local varia­ble ‘s’ refe­ren­ced befo­re assign­ment

Das Cha­os könn­te man nun mit dem glo­bal Schlüs­sel­wort gül­tig machen. Aber soll­te man das wirk­lich mal brau­chen läuft mit dem Code sowie­so irgend etwas falsch.

Der Schnellkurs

Bei Fra­gen hin­ter­las­se mir  ein­fach ein Kom­me­tar.

Python3 — Hallo Welt, Syntax und der Interaktive Modus

Hallo Welt

Hal­lo Welt ist in Python schnell geschafft. Vor­aus­ge­setzt ihr habt Python3 erfolg­reich instal­liert (wobei es fast auf jedem aktu­el­len *NIX von allei­ne mit­kommt), braucht ihr nur eine Datei die auf .py endet.

Bei­spiel: hallo_welt.py

Wie aus ande­ren Script­spra­chen bekannt, wird in der ers­ten Zei­le nach der She­bang (#!) der Pfad zum Inter­pre­ter ange­ge­ben. Um z.B. in Vir­tu­el­len Umge­bun­gen fle­xi­ble zu blei­ben, geben wir hier nicht den direk­ten Pfad aus, son­dern bezie­hen ihn immer aus unse­rem Envi­ron­ment.

Die Datei muss jetzt nur noch aus­führ­bar gemacht wer­den, und kann dann aus­ge­führt wer­den:

Syntax

Hier unter­schei­det sich nun Python von den ver­brei­te­ten C Ähn­li­chen Pro­gram­mier­spra­chen. Das mag am Anfang nun etwas gewöh­nungs­be­dürf­tig sein, aber man lernt es wirk­lich lie­ben.

Blö­cke wer­den in Python nicht mit geschweif­ten Klam­mern gebil­det, son­dern durch einen Dop­pel­punkt gestar­tet. Alles was zu dem Block gehört, bleibt jetzt min­des­tens 2, opti­mal und ver­brei­tet 4 stel­len ein­ge­rückt. Hier sei noch gesagt, stellt euren Edi­tor so ein das er aus Tabs ent­spre­chend Leer­zei­chen macht. Sonst kann es mal zum Cha­os kom­men wenn ihr mit meh­ren Leu­ten zusam­men­ar­bei­tet.

Bei­spiel:

Zeilenenden

Zei­len­en­de müs­sen im Gegen­satz zu vie­len ande­ren Spra­chen nicht gekenn­zeich­net wer­den. Eine Zei­le ist zu ende, wenn sie zu ende ist. Aus­nah­me, das Zei­len­en­de ist auf­ge­ho­ben. Eine ziem­lich genia­le Sache, spart man sich doch das Tip­pen unzäh­li­ger Zei­chen.

Ent­wer­tet wird das Zei­len­en­de ent­we­der von Hand, mit einem \, oder ist es auto­ma­tisch wenn eine Klam­mer ( { [ nicht geschlos­sen ist.  Auch gibt es in Python eine bestimm­te Sor­te Strings, die Mehr­zei­lig sein kann. Ein­fach ent­we­der 3x ” oder 3x ‘.

In Python gibt es übri­gens kei­nen Unter­schied zwi­schen Strings in ein­fa­chen oder dop­pel­ten Anfüh­rungs­zei­chen. Ledig­lich muss ich die ein­fa­chen inner­halb dop­pel­ter nicht escapen und umge­kehrt.

Dann zum Bei­spiel

Kommentare

Was Kom­men­ta­re angeht ist Python auch sehr ein­fach. Ein­fach das Hash Zei­chen. Jeweils von # wird bis zum Zei­len­en­de kom­men­tiert.

Mehr­zei­lig geht auch mit einer Art Trick. Die­ser wird auch benutzt um Metho­den und Funk­tio­nen zu Doku­men­tie­ren. Und zwar mit einem Mehr­zei­li­gen String (““”)

Interaktiver Modus

Ein nütz­li­ches Fea­ture in Python ist der Inter­ak­ti­ve Modus. Er ist prak­tisch um schnell mal was aus­zu­pro­bie­ren. Print braucht man nicht, alles wird direkt aus­ge­ge­ben. Gestar­tet wird er durch die Ein­ga­be python3, been­det mit Strg + D

Der Schnellkurs

Das war auch schon der ers­te Ein­stieg. Bei Fra­gen hin­ter­las­se mir  ein­fach ein Kom­me­tar.

Schnelleinstieg in Python3

Bei Python han­delt es sich um eine ver­brei­te­te Pro­gram­mier­spra­che, die nicht nur ein­fach, son­dern auch schnell und mäch­tig ist. Sie wur­de 1990 von Gui­do van Ros­sum ver­öf­fent­licht. Inzwi­schen gibt es bereits meh­re­re Jah­re die Ver­si­on 3 von Python, die jedoch nicht kom­pa­ti­bel zum Vor­gän­ger ist. In der Ver­si­on 3 wur­de so man­che unschön­heit der Ver­si­on 2 besei­tigt. Vor eini­gen Jah­ren hat sich die Fra­ge 2 oder 3 noch gestellt, heu­te jedoch fängt man nur noch mit 3 an.

Für jeden, der bereits (etwas) Pro­gram­mier­erfah­rung hat, habe ich hier einen Schnell­ein­stieg zusam­men­ge­stellt, wel­cher die wich­tigs­ten Grund­la­gen ein­fach zu ver­mit­teln ver­sucht.

Und wer dann Tie­fer ein­stei­gen will, der fin­det z.B. die­sem Buch alle Details.

Themen

Python Flask: Mutable Objekte in der Session

(Alle Bei­spie­le nur exem­pla­risch)
In Flask steht eine sehr prak­ti­sche Ses­si­on funk­ti­on zur Ver­fü­gung:

Aber das Pro­blem:

Auf der drit­ten Sei­te wird man nun mer­ken das der Wert inhalt3 feh­len wird.
Das ist kein Bug, son­dern hier fehlt ein session.modified = True

Dies ist bei jedem muta­blen Typ not­wen­dig, um Flask über die ände­rung zu infor­mie­ren.
Sie­he dazu auch: Flask Doku­men­ta­ti­on

Ubuntu, Windows und Strg Tasten Tauschen

Da ich inzwi­schen mit Mac und Linux Sys­te­men im Wech­sel arbei­te,
möch­te ich natür­lich ein mög­lichst glei­ches ver­hal­ten von allen Sys­te­men.

Unter Ubun­tu mit dem Awe­so­me Desk­top mana­ger, reicht es für mich die lin­ke Win­dows mit der lin­ken Strg Tas­te zu tau­schen. Das schafft Xmod­map.

Unter ~/.Xmodmap benö­ti­ge ich die fol­gen­den Ein­trä­ge:

Hier geht man davon aus, das Key­code 37 die Tas­te Strg, und Key­code 133 die Win­dows Tas­te ist. Klar­heit schaft hier das tool xev, das sich mit apt-get install xev instal­lie­ren lässt.

Wer übri­gens auch die Caps Lock Tas­te mal sinn­voll nut­zen mag,
geht so:

Hier wur­de ihr (code 66) die Funk­ti­on der Win­dows Tas­te zuge­wie­sen. Macht die Tas­ten­kom­bi­na­tio­nen in Awe­so­me ein­fa­cher :)