<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="http://cptsalek.twoday.net/rss2html.xsl" type="text/xsl"?>
<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:cc="http://web.resource.org/cc/"
  xmlns="http://purl.org/rss/1.0/"
> 

  <channel rdf:about="http://cptsalek.twoday.net/">
    <title>Captains Log (Heidentum, IT, Mittelalter, Rollenspiel, Gesellschaft, Politik und der alltägliche Wahnsinn: Tagebuch meines Lebens.) : Rubrik:Python</title>
    <link>http://cptsalek.twoday.net/</link>
    <description>Heidentum, IT, Mittelalter, Rollenspiel, Gesellschaft, Politik und der alltägliche Wahnsinn: Tagebuch meines Lebens.</description>
    <dc:publisher>cptsalek</dc:publisher>
    <dc:creator>cptsalek</dc:creator>
    <dc:date>2007-05-26T22:29:01Z</dc:date>
    <dc:language>en</dc:language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <sy:updateBase>2000-01-01T00:00:00Z</sy:updateBase>
    <cc:license rdf:resource="http://creativecommons.org/licenses/by/2.0/de/" />

    <image rdf:resource="http://static.twoday.net/cptsalek/images/icon.jpg" />
    <items>
      <rdf:Seq>
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/2015581/" />
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/2015388/" />
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/2015243/" />
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/2015199/" />
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/2015102/" />
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/1954708/" />
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/1948827/" />
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/1948680/" />
            <rdf:li rdf:resource="http://cptsalek.twoday.net/stories/1944938/" />

      </rdf:Seq>
    </items>
  </channel>

  <image rdf:about="http://static.twoday.net/cptsalek/images/icon.jpg">
    <title>Captains Log</title>
    <url>http://static.twoday.net/cptsalek/images/icon.jpg</url>
    <link>http://cptsalek.twoday.net/</link>
  </image>

  <item rdf:about="http://cptsalek.twoday.net/stories/2015581/">
    <title>Funktionen</title>
    <link>http://cptsalek.twoday.net/stories/2015581/</link>
    <description>Bei den &lt;a href=&quot;http://cptsalek.twoday.net/stories/2015199/&quot;&gt;globalen und lokalen Namespaces&lt;/a&gt; gab es ja schon eine Funktion, hier die Vertiefung dazu:

&lt;pre&gt;&lt;code&gt;
#!/usr/bin/env python

def getkey(prompt=&quot;Yes/no: &quot;,allow=(&apos;y&apos;,&apos;n&apos;)):
    while True:
        query=raw_input(prompt)
        if query in allow:
            return query
        else:
            print &quot;Please answer &quot;,allow,&quot;, only!&quot;

print &quot;This is a test question.&quot;
print getkey()

print &quot;This is an alternative text:&quot;
print getkey(&quot;Please answer Yes or No: &quot;)

print &quot;Use the function above to do something entirely different:&quot;
print getkey(&quot;0-9? &quot;,str(range(10)))
&lt;/code&gt;&lt;/pre&gt;

Das Beispiel zeigt sehr schön, wie Funktionen in Python funktionieren. Es handelt sich um eine einfache Tastaturabfrage-Routine, die die Eingabe überprüft. &lt;br /&gt;
Der Prompt, also das, was zur Aufforderung angezeigt wird, sowie die möglichen Antworten, werden bereits in der Funktionsdefinition angelegt, wobei &lt;span style=&quot;font-family:Courier,Helvetica&gt;prompt&lt;/span&gt; und &lt;span style=&quot;&gt;allow&lt;/span&gt; nur zum Zuge kommen, wenn keine Parameter übergeben werden, wie das beim ersten Aufruf von &lt;span style=&quot;font-family:Courier,Helvetica&gt;getkey()&lt;/span&gt; der Fall ist. Im zweiten Beispiel wird die Eingabeaufforderung für den Benutzer geändert, während dieselbe Funktion im dritten Beispiel dafür verwendet wird, auf eine Zahleneingabe zu warten. Hier kommt wieder die &lt;span style=&quot;&gt;range()&lt;/span&gt;-Anweisung ins Spiel, deren Ausgabe mittels &lt;span style=&quot;font-family:Courier,Helvetica&gt;str()&lt;/span&gt; in einen String umgewandelt wird. 

Die &lt;span style=&quot;&gt;getkey()&lt;/span&gt;-Funktion selbst besteht aus einer &lt;span style=&quot;font-family:Courier,Helvetica&gt;while&lt;/span&gt;-Endlos-Schleife. &lt;span style=&quot;&gt;raw_input()&lt;/span&gt; ist für Tastaturabfragen zuständig, und die &lt;span style=&quot;font-family:Courier,Helvetica&gt;if&lt;/span&gt;-Bedingung zeigt die Eleganz dieser Programmiersprache: Anstatt auf jeden einzelnen möglichen Wert überprüfen zu müssen, wird durch &lt;span style=&quot;&gt;in&lt;/span&gt; lediglich nachgeschaut, ob die Antwort in &lt;span style=&quot;font-family:Courier,Helvetica&gt;allow&lt;/span&gt; enthalten ist, wenn ja, wird die Funktion durch &lt;span style=&quot;&gt;return&lt;/span&gt; verlassen und die Eingabe an die aufrufende Funktion zurück gegeben, wo sie einfach nur ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Mehr dazu gibt es im &lt;a href=&quot;http://docs.python.org/tut/node6.html#SECTION006600000000000000000&quot;&gt;Python Tutorial&lt;/a&gt;</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-16T13:13:00Z</dc:date>
  </item>
  <item rdf:about="http://cptsalek.twoday.net/stories/2015388/">
    <title>range() und for</title>
    <link>http://cptsalek.twoday.net/stories/2015388/</link>
    <description>Die &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;for&lt;/span&gt;-Schleife in Python arbeitet ähnlich wie die in Unix-Shells: Anstelle von einer Startbedingung zu einer Endbedingung hochzuzählen, wobei die Schrittweise festlegbar ist, wie das bei C der Fall ist, geht Pythons &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;for&lt;/span&gt; durch eine Menge von Elementen, wobei es egal ist, von welchem Typ diese Elemente sind:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; for x in (&quot;Douglas Adams&quot;,&quot;Per Anhalter durch die Galaxis&quot;,42):
...    print x
...
Douglas Adams
Per Anhalter durch die Galaxis
42
&lt;/code&gt;&lt;/pre&gt;

Beim Programmieren ist das natürlich angenehm, weil man Tupel und Listen einfach nur angeben muß, um alle darin enthaltenen Elemente verarbeiten zu können. &lt;br /&gt;
&lt;br /&gt;
Möchte man irgendwas hochzählen, braucht man eine Hilfe, und genau dafür ist &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range()&lt;/span&gt; da:

&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; for x in range(10):
...     print x,
...
0 1 2 3 4 5 6 7 8 9
&lt;/code&gt;&lt;/pre&gt;
Es fällt auf, das range bei 0 anfängt zu zählen, aber bei 9 aufhört, statt bis 10. Möchte man eine Ausgabe inklusive der 10, und die 0 möchte man auch nicht sehen, muß man entsprechende Änderungen vornehmen:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; max=10
&gt;&gt;&gt; for x in range(1,max+1):
...     print x,
...
1 2 3 4 5 6 7 8 9 10
&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;max&lt;/span&gt; ist die Obergrenze, bis zu der ich zählen möchte, und da ich diese inklusive haben möchte, inkrementiere ich den Ausdruck von max um 1.&lt;br /&gt;
Der Ausdruck &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range(a,b)&lt;/span&gt; bedeutet, zähle von a nach b, ein &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range(b)&lt;/span&gt; ist also gleichbedeutend mit &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range(0,b)&lt;/span&gt;.&lt;br /&gt;
Es gibt noch eine dritte Möglichkeit, mit &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range()&lt;/span&gt; zu arbeiten:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; for x in range(1,32,2):
...     print x,
...
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31
&lt;/code&gt;&lt;/pre&gt;
Der dritte Wert gibt also die Schrittweite an, mit der hochgezählt werden soll. Übrigens funktioniert nicht die Kombination &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range(Obergrenze,Schrittweite)&lt;/span&gt;, weil Python hier nicht wissen kann, ob nicht &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range(Startwert,Obergrenze)&lt;/span&gt; gemeint ist. Allerdings wird Python hier auch nicht sauer und haut einem Fehlermeldungen um die Ohren, es passiert nur nichts:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; for x in range(32,2):
...     print x,
...
&gt;&gt;&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range()&lt;/span&gt; funktioniert natürlich auch &quot;subtrahierend:&quot;, wobei hier die Schrittweite auf jeden Fall angegeben werden muß, weil Python ansonsten davon ausgeht, dass wir eine Schrittweite von +1 haben wollen. Warum das so ist, werden wir später noch sehen:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; for countdown in range(10,-1):
...     print countdown
...
&gt;&gt;&gt; for countdown in range(10,-1,-1):
...     print countdown,
...
10 9 8 7 6 5 4 3 2 1 0
&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;for&lt;/span&gt; ist bei weitem nicht das einzige Einsatzgebiet für &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range()&lt;/span&gt;, vielmehr können hier auch Listen mit befüllt werden:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; countdown=range(10,-1,-1)
&gt;&gt;&gt; countdown
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
&lt;/code&gt;&lt;/pre&gt;</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-16T12:27:00Z</dc:date>
  </item>
  <item rdf:about="http://cptsalek.twoday.net/stories/2015243/">
    <title>Verarbeitung von Argumenten</title>
    <link>http://cptsalek.twoday.net/stories/2015243/</link>
    <description>Die Übergabe von Argumenten und Parametern in Programmen ist eine nicht unwichtige Angelegenheit. In der Shellprogrammierung liegen die Argumente in $0, $1, $2... $*, die meisten Programmiersprachen bieten ein Array ARGV oder so ähnlich an (Perl, C...).&lt;br /&gt;
Python macht das ähnlich:
&lt;pre&gt;&lt;code&gt;
#!/usr/bin/env python

import sys

print &quot;My Filename: &quot;,sys.argv[0]
print &quot;No. of args: &quot;,len(sys.argv)-1
print &quot;Arguments  : &quot;,sys.argv[1:]

if len(sys.argv)-1 &gt;= 1:
   print &quot;Processing arguments...&quot;
   for x in range(1,len(sys.argv)):
       print &quot;Argument &quot;,x,&quot;: &quot;,sys.argv[x]
else:
   print &quot;Nothing to do.&quot;
&lt;/code&gt;&lt;/pre&gt;

In Python wird das Tupel argv vom Modul sys zur Verfügung gestellt, deshalb sys.argv. Wie unter Unix üblich (sofern man unter Unix programmiert), steht in argv[0] der Filename drin, mit dem das Programm aufgerufen wurde, oder der entsprechende Parameter, wenn man eben kein python-Script vorliegen hatte.&lt;br /&gt;
Die Konstruktion weiter unten gibt einfach nochmal alle Argumente der Reihe nach aus, sofern mehr als ein Argument übergeben wurde.&lt;br /&gt;
Wird das Script aufgerufen, sieht das z.B. so aus:
&lt;pre&gt;&lt;code&gt;
$ ./03_argv.py dies ist einer dieser typischen tests.
My Filename:  ./03_argv.py
No. of args:  6
Arguments  :  [&apos;dies&apos;, &apos;ist&apos;, &apos;einer&apos;, &apos;dieser&apos;, &apos;typischen&apos;, &apos;tests.&apos;]
Processing arguments...
Argument  1 :  dies
Argument  2 :  ist
Argument  3 :  einer
Argument  4 :  dieser
Argument  5 :  typischen
Argument  6 :  tests.
&lt;/code&gt;&lt;/pre&gt;

Hm, &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;if&lt;/span&gt;, &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;range()&lt;/span&gt; und &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;for&lt;/span&gt; folgen im nächsten Beitrag.</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-16T12:18:00Z</dc:date>
  </item>
  <item rdf:about="http://cptsalek.twoday.net/stories/2015199/">
    <title>Lokale und globale Namespaces</title>
    <link>http://cptsalek.twoday.net/stories/2015199/</link>
    <description>&lt;pre&gt;&lt;code&gt;
#!/usr/bin/env python

# Namespaces
# In Funktionen gibt es lokale Namensraeume,
# soll ein Objekt global uebernommen werden, muss dies
# mittels global geschehen.

#  - Objekte aus dem Hauptprogramm bleiben auch in
#    Unterfunktionen lesend global, beim Schreibzugriff
#    werden sie aber lokal, es sei denn, es wird explizit
#    &quot;global &quot; angegeben.
#  - (Streng genommen wird beim Schreibzugriff auf ein
#    Objekt aus dem globalen Namespace ein zweites Objekt
#    mit gleichem Namen im lokalen Namespace erzeugt,
#    welches das Objekt aus dem globalen Namespace
#    ueberdeckt.


def test():
    print &quot;Funktionseinstieg&quot;
    print locals()
    print globals()
    print &quot;Globalisierung...&quot;
    a = &quot;Ciao&quot;
    global b
    b = &quot;Erde&quot;
    c = &quot;Universum&quot;
    print &quot;Gaendert: a=&quot;,a,&quot;, b=&quot;,b,&quot;, c=&quot;,c
    print locals()
    print globals()

print &quot;Programmstart&quot;
print locals()
print globals()

a = &quot;Hallo&quot;
b = &quot;Welt&quot;

print &quot;Variablendefinition&quot;
print &quot;Objekte am Programmanfang: a=&quot;,a,&quot;, b=&quot;,b
print locals()
print globals()
test()
print &quot;Objekte am Programmende  : a=&quot;,a,&quot;, b=&quot;,b
print locals()
print globals()
&lt;/code&gt;&lt;/pre&gt;

Das Script verwendet das erste Mal eine selbstgeschriebene Funktion, die durch &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;def&lt;/span&gt; angelegt wird. Ihr Name ist &lt;i&gt;test&lt;/i&gt;, und die leere Klammer bedeutet, dass sie erstmal keine Variablen oder Variablenwerte aus den aufrufenden Funktionen übernimmt.&lt;br /&gt;
Interessant sind die Befehle &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;locals()&lt;/span&gt; und &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;globals()&lt;/span&gt;, die jeweils den Inhalt des lokalen und globalen Namespace ausgeben, wobei natürlich festzustellen ist, dass es einen globalen Namespace nur innerhalb von Funktionen geben kann, weil das Hauptprogramm nur über einen Namensraum verfügt.&lt;br /&gt;
&lt;br /&gt;
Führt man das Programm aus, gibt es folgendes aus:&lt;br /&gt;
&lt;span style=&quot;font-family:Courier,helvetica;font-size=&quot;&gt;&lt;br /&gt;
Programmstart&lt;br /&gt;
{&apos;__builtins__&apos;: , &apos;__name__&apos;: &apos;__main__&apos;, &apos;__file__&apos;: &apos;./02_namespaces.py&apos;, &apos;test&apos;: , &apos;__doc__&apos;: None}&lt;br /&gt;
{&apos;__builtins__&apos;: , &apos;__name__&apos;: &apos;__main__&apos;, &apos;__file__&apos;: &apos;./02_namespaces.py&apos;, &apos;test&apos;: , &apos;__doc__&apos;: None}&lt;br /&gt;
Variablendefinition&lt;br /&gt;
Objekte am Programmanfang: a= Hallo , b= Welt&lt;br /&gt;
{&apos;a&apos;: &apos;Hallo&apos;, &apos;b&apos;: &apos;Welt&apos;, &apos;__builtins__&apos;: , &apos;__file__&apos;: &apos;./02_namespaces.py&apos;, &apos;test&apos;: , &apos;__name__&apos;: &apos;__main__&apos;, &apos;__doc__&apos;: None}&lt;br /&gt;
{&apos;a&apos;: &apos;Hallo&apos;, &apos;b&apos;: &apos;Welt&apos;, &apos;__builtins__&apos;: , &apos;__file__&apos;: &apos;./02_namespaces.py&apos;, &apos;test&apos;: , &apos;__name__&apos;: &apos;__main__&apos;, &apos;__doc__&apos;: None}&lt;br /&gt;
Funktionseinstieg&lt;br /&gt;
{}&lt;br /&gt;
{&apos;a&apos;: &apos;Hallo&apos;, &apos;b&apos;: &apos;Welt&apos;, &apos;__builtins__&apos;: , &apos;__file__&apos;: &apos;./02_namespaces.py&apos;, &apos;test&apos;: , &apos;__name__&apos;: &apos;__main__&apos;, &apos;__doc__&apos;: None}&lt;br /&gt;
Globalisierung...&lt;br /&gt;
Gaendert: a= Ciao , b= Erde , c= Universum&lt;br /&gt;
{&apos;a&apos;: &apos;Ciao&apos;, &apos;c&apos;: &apos;Universum&apos;}&lt;br /&gt;
{&apos;a&apos;: &apos;Hallo&apos;, &apos;b&apos;: &apos;Erde&apos;, &apos;__builtins__&apos;: , &apos;__file__&apos;: &apos;./02_namespaces.py&apos;, &apos;test&apos;: , &apos;__name__&apos;: &apos;__main__&apos;, &apos;__doc__&apos;: None}&lt;br /&gt;
Objekte am Programmende  : a= Hallo , b= Erde&lt;br /&gt;
{&apos;a&apos;: &apos;Hallo&apos;, &apos;b&apos;: &apos;Erde&apos;, &apos;__builtins__&apos;: , &apos;__file__&apos;: &apos;./02_namespaces.py&apos;, &apos;test&apos;: , &apos;__name__&apos;: &apos;__main__&apos;, &apos;__doc__&apos;: None}&lt;br /&gt;
{&apos;a&apos;: &apos;Hallo&apos;, &apos;b&apos;: &apos;Erde&apos;, &apos;__builtins__&apos;: , &apos;__file__&apos;: &apos;./02_namespaces.py&apos;, &apos;test&apos;: , &apos;__name__&apos;: &apos;__main__&apos;, &apos;__doc__&apos;: None}&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Die ersten beiden Zeilen zeigen, wie der Namespace aussieht, wenn noch nicht viel passiert ist: Es gibt ein paar eingebaute Module, das File, das das Programm enthält, heißt 02_namespace.py, und es gibt eine definierte Funktion test.&lt;br /&gt;
Interessant wird es das erste Mal nach der Deklaration der Variablen a und b, die nun in den globalen Namespace einfliessen (der an der Stelle wiederrum identisch ist mit dem lokalen).&lt;br /&gt;
Richtig spannend wird es dann nach dem Funktionsaufruf: Hier ist der lokale Namespace plötzlich leer, wie die der erste Satz geschweifter Klammern anzeigt, währen der globale sich nicht verändert hat.&lt;br /&gt;
Dann geschieht zweierlei: Durch die Anweisung &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;global b&lt;/span&gt; wird die Variable b von der Funktion test() aus beschreibbar, außerdem wird die Variable a neu deklariert, und c kommt hinzu.&lt;br /&gt;
Nach der &lt;i&gt;Globalisierung&lt;/i&gt; sieht der lokale Namespace schon anders aus, er enthält a und c, aber immer noch nicht b. Dafür ist im globalen Namespace ersichtlich, dass die Änderung b=&apos;Erde&apos; ihre Wirkung nicht verfehlt hat. Wenn sich die Funktion beendet, ist b immer noch &apos;Erde&apos;, aber nicht &apos;Welt&apos;, wie es noch am Anfang der Fall war.&lt;br /&gt;
Das c als neue Variable im lokalen Namespace ist, ist nicht verwunderlich, man sieht aber auch sehr schön, dass die lokale Variable a, deren Wert nun &apos;Ciao&apos; ist, das global deklarierte a überlagert. In der Funktion test hat man nun keinen Zugriff mehr auf die globale Variable a.</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-16T12:01:00Z</dc:date>
  </item>
  <item rdf:about="http://cptsalek.twoday.net/stories/2015102/">
    <title>Variablen: Boolean und None</title>
    <link>http://cptsalek.twoday.net/stories/2015102/</link>
    <description>Python kennt wie viele andere Programmiersprachen auch, Variablen vom Typ Boolean, die die Werte True oder False annehmen können. Dabei ist das noch nicht mal unbedingt nötig, weil in Python jede Variable als Boolean gewertet werden kann: Variablen mit nicht definiert sind, oder den Wert 0 haben, sind False, während alle anderen True sind, wie das folgende Beispiel zeigt:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; x = 20
&gt;&gt;&gt; while x:
...     print x,
...     x=x-1
...
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
&lt;/code&gt;&lt;/pre&gt;

Die &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;while&lt;/span&gt;-Schleife arbeitet also auf Basis von Boolean und läuft solange, wie die Bedingung wahr ist.&lt;br /&gt;
&lt;br /&gt;
Daneben gibt es noch den Variablentyp &lt;b&gt;None&lt;/b&gt;, den ich vorher noch nicht kannte. Damit können Variablen defklariert werden, ohne jedoch Werte zuzuweisen. Sinn macht das z.B. in Situationen, wo man im Programm eine Variable benötigt, jedoch jeder zugewiesene Wert nur stören würde.</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-16T11:52:00Z</dc:date>
  </item>
  <item rdf:about="http://cptsalek.twoday.net/stories/1954708/">
    <title>Listen</title>
    <link>http://cptsalek.twoday.net/stories/1954708/</link>
    <description>Tupel sind zur Programmierung also schonmal nicht schlecht, zumindest solange es sich um statische Daten handelt. In der Praxis will man aber komplexe Daten verarbeiten, worunter neben Ergänzungen und Löschungen auch die Veränderung einzelner Datenteile gehört, wie z.B. bei einer Kundenverwaltung die Möglichkeit, bei einem Umzug lediglich die Adresse des Kundens zu ändern, anstatt den Kunden neu anlegen zu müssen.&lt;br /&gt;
Dazu bietet Python Listen an, die ähnlich wie Tupel funktionieren, jedoch auch wilde Veränderungen erlauben:

&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; begruessungen=[&quot;Guten Morgen&quot;,&apos;Moin&apos;,&quot;Hello&quot;,&quot;Guten Abend&quot;]
&gt;&gt;&gt; print begruessungen
[&apos;Guten Morgen&apos;, &apos;Moin&apos;, &apos;Hello&apos;, &apos;Guten Abend&apos;]
&gt;&gt;&gt; print begruessungen[1]
Moin
&gt;&gt;&gt; len(begruessungen)
4
&gt;&gt;&gt; len(begruessungen[0])
12
&gt;&gt;&gt; begruessungen[0:2]
[&apos;Guten Morgen&apos;, &apos;Moin&apos;]
&gt;&gt;&gt; begruessungen[3]
&apos;Guten Abend&apos;
&gt;&gt;&gt; begruessungen[2]
&apos;Hello&apos;
&gt;&gt;&gt; begruessungen[2]=&quot;Hallo&quot;
&gt;&gt;&gt; begruessungen
[&apos;Guten Morgen&apos;, &apos;Moin&apos;, &apos;Hallo&apos;, &apos;Guten Abend&apos;]
&lt;/code&gt;&lt;/pre&gt;

Listen werden also über eckige Klammern erzeugt, wobei der Inhalt, genauso wie bei Tupeln, unterschiedliche Typen umfassen darf. Mittels &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;len()&lt;/span&gt; läßt sich die Anzahl Elemente der gesamten Liste, oder einzelner Listenelemente, ausgeben. Genau wie bei Tupeln kann man auf einzelne Elemente, oder auf eine Reihe von Elemente via [x:y] zugreifen.&lt;br /&gt;
Mehrdimensionale Listen sind ebenfalls möglich, wobei auch hier dasselbe gilt wie bei Tupeln.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Aliasing&lt;/b&gt;&lt;br /&gt;
Einen Unterschied gibt es, der als &lt;i&gt;Aliasing&lt;/i&gt; bezeichnet wird: Was bei Strings und gewöhnlichen Variablen zu einer Kopie des Wertes (Objektes) führt, führt bei Listen lediglich zu einer weiteren Namenszuweisung:

&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; a=1
&gt;&gt;&gt; b=a
&gt;&gt;&gt; print a,b
1 1
&gt;&gt;&gt; b=2
&gt;&gt;&gt; print a,b
1 2
&gt;&gt;&gt; voelker=[&apos;Vulkanier&apos;,&apos;Klingonen&apos;,&apos;Bajoraner&apos;,&apos;Borg&apos;]
&gt;&gt;&gt; anderesicht=voelker
&gt;&gt;&gt; anderesicht[3]
&apos;Borg&apos;
&gt;&gt;&gt; anderesicht[3]=&apos;Spezies123&apos;
&gt;&gt;&gt; voelker
[&apos;Vulkanier&apos;, &apos;Klingonen&apos;, &apos;Bajoraner&apos;, &apos;Spezies123&apos;]
&lt;/code&gt;&lt;/pre&gt;
Bei a und b, zwei normalen Variablen sieht man, dass zuerst b den Wert von a zugewiesen bekommt, der dann aber verändert wird, ohne das dies zu einer Veränderung von a führt.&lt;br /&gt;
Listen verfügen aber über eine sogenannte Identität, die bei einer Zuweisung übergeben wird. Dadurch greift man über zwei verschiedene Namen auf dieselben Objekte zu, wie das Beispiel weiter unten zeigt: Borg wird gegen Spezies123 ersetzt, und zwar in der Liste anderesicht. Dies ändert aber auch voelker.</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-12T11:01:00Z</dc:date>
  </item>
  <item rdf:about="http://cptsalek.twoday.net/stories/1948827/">
    <title>Variablen II: Mehrdimensionalität</title>
    <link>http://cptsalek.twoday.net/stories/1948827/</link>
    <description>Es kommt häufiger vor, dass man nicht einfache Datenreihen speichern will, sondern komplexe, zusammenhängende Datensätze. In diesem Fall ist man mit mehrdimensionalen Feldern ganz gut bedient:

&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; aufzaehlung=((3.491,&quot;Pi&quot;),(42,&quot;Anhalter&quot;))
&gt;&gt;&gt; aufzaehlung
((3.4910000000000001, &apos;Pi&apos;), (42, &apos;Anhalter&apos;))
&gt;&gt;&gt; aufzaehlung[0]
(3.4910000000000001, &apos;Pi&apos;)
&gt;&gt;&gt; aufzaehlung[0][1]
&apos;Pi&apos;
&lt;/code&gt;&lt;/pre&gt;
Verwendet man in einem mehrdimensionalen Tupel also lediglich eine &quot;Koordinate&quot;, wird der gesamte darin enthaltene Tupel ausgegeben, die zweite Koordinate bestimmt das auszugebende Objekt innerhalb des Tupels.&lt;br /&gt;
Im Gegensatz zu einigen anderen Sprachen kann die Anzahl der Dimensionen in einem Tupel variieren, was auf der einen Seite positiv für den Speicherverbrauch ist, andererseits aber natürlich bedeutet, dass man selbst dafür Sorge tragen muß, nur auf gültige Daten zuzugreifen. Beispiel:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; netzdaten=((&quot;cptsalek&quot;,&quot;http://cptsalek.twoday.net&quot;,&quot;cptsalekweb.de&quot;),
...            (&quot;cptcalhoun&quot;,&quot;http://cptcalhoun.twoday.net&quot;))
&lt;/code&gt;&lt;/pre&gt;
Hier haben wir einen Tupel namens &quot;netzdaten&quot;, der zwei Datensätze enthält, wobei der erste drei Strings umfaßt, der zweite jedoch nur zwei. Es wäre also schön eine Möglichkeit zu haben, sich das im Programm auch ausgeben zu lassen. Gibt es auch:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; len(netzdaten)
2
&gt;&gt;&gt; len(netzdaten[0])
3
&gt;&gt;&gt; len(netzdaten[1])
2
&gt;&gt;&gt; len(netzdaten[1][0])
10
&lt;/code&gt;&lt;/pre&gt;
Der Befehl &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;len()&lt;/span&gt; gibt die Länge eines Objektes zurück. Wird nur &quot;netzdaten&quot; angegeben, umfaßt das Objekt in der Tat zwei Tupel. Der erste Datensatz, bezeichnet durch netzdaten[0], seinem Index, enthält die besagten drei Strings. Der &lt;span style=&quot;font-family:Courier,Helvetica&quot;&gt;len()&lt;/span&gt;-Befehl funktioniert auch bei reinen Strings, wie das letzte Beispiel zeigt, das die Länge des Namens &quot;cptcalhoun&quot; zurückliefert.</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-11T10:43:00Z</dc:date>
  </item>
  <item rdf:about="http://cptsalek.twoday.net/stories/1948680/">
    <title>Variablen</title>
    <link>http://cptsalek.twoday.net/stories/1948680/</link>
    <description>Python benötigt keine Variablendeklaration am Anfang einer Funktion, wie das z.B. bei C der Fall ist. Typenänderungen werden entweder automatisch vorgenommen, oder müssen vom Programmierer per Funktion vorgenommen werden, z.B. wenn eine Zahl an einen String angehängt werden sollen.&lt;br /&gt;
Neben Variablen mit unterschiedlichen Wertebereichen, gemäß den Definitionen für Integer, Long Integer und einigen anderen mehr, kennt Python auch &quot;Sequenzen&quot;, wozu Strings, Tupel und Listen gehören. &lt;br /&gt;
&lt;b&gt;Strings&lt;/b&gt; sind einfache Zeichenketten wie z.B. 
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; begruessung=&quot;Hallo Welt&quot;
&lt;/code&gt;&lt;/pre&gt;
Hierauf lassen sich einfache Operationen anwenden:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; begruessung=&quot;Hallo Welt&quot;
&gt;&gt;&gt; satzzeichen=&quot;!&quot;
&gt;&gt;&gt; begruessung=begruessung+satzzeichen
&gt;&gt;&gt; print begruessung
Hallo Welt!
&gt;&gt;&gt; print begruessung[0]
H
&gt;&gt;&gt; print begruessung[0:5]
Hallo
&gt;&gt;&gt; print begruessung[:5]
Hallo
&gt;&gt;&gt; print begruessung[6:]
Welt!
&gt;&gt;&gt; print begruessung[-5:]
Welt!
&gt;&gt;&gt; print begruessung[-5:-1]
Welt
&lt;/code&gt;&lt;/pre&gt;
Die &quot;&gt;&gt;&gt;&quot; stehen für eine interaktive Interpretersession, man kann Python also einfach so aufrufen, und Befehle eingeben. Zum Demonstrieren und Experimentieren reicht das oftmals aus.&lt;br /&gt;
Übrigens kann man den print-Befehl zur Anzeige auch weglassen, wenn man nur einen Variablennamen angibt, unterstellt einem Python, dass man das/die Objekte angezeigt bekommen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tupel&lt;/b&gt; sind Aneinanderreihungen von Werten, wobei diese unterschiedlicher Art sein können. Genau wie bei Strings kann man auch bei Tupeln auf einzelne Elemente zugreifen:
&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; aufzaehlung=(3.491, &quot;Wort&quot;, 42)
&gt;&gt;&gt; aufzaehlung
(3.4910000000000001, &apos;Wort&apos;, 42)
&gt;&gt;&gt; aufzaehlung[0]
3.4910000000000001
&gt;&gt;&gt; aufzaehlung[1]=&quot;Ein Satz.&quot;
Traceback (most recent call last):
  File &quot;&quot;, line 1, in ?
TypeError: object doesn&apos;t support item assignment
&lt;/code&gt;&lt;/pre&gt;
Das Beispiel zeigt etwas, was auch für Strings gilt: Sie lassen sich nicht verändern, sobald man versucht, einzelne Elemente zu ändern, gibt es eine Fehlermeldung. Verändert man augenscheinlich einen ganzen String oder Tupel, z.B. mittels aufzaehlung=, so wird ein neues Objekt angelegt, und das alte der Garbage Collection zugeführt.</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-11T08:28:00Z</dc:date>
  </item>
  <item rdf:about="http://cptsalek.twoday.net/stories/1944938/">
    <title>Schlangefraß</title>
    <link>http://cptsalek.twoday.net/stories/1944938/</link>
    <description>Da ich mich seit einer Weile beruflich mit &lt;a href=&quot;http://www.zope.org&quot;&gt;Zope&lt;/a&gt;, bzw. dem darauf aufsetzendem &lt;a href=&quot;http://www.plone.org&quot;&gt;Plone&lt;/a&gt; auseinander setzen muß, habe ich die Gelegenheit beim Schopfe ergriffen, mich ordentlich in die verwendete Programmiersprache &lt;a href=&quot;http://www.python.org&quot;&gt;Python&lt;/a&gt; einzuarbeiten. &lt;br /&gt;
Meine Erkenntnisse und Notizen werden ich also in Zukunft hier in loser Folge ablegen bzw. präsentieren.&lt;br /&gt;
Als Dokumentation dient mir das &lt;a href=&quot;http://docs.python.org/tut/&quot;&gt;Python Tutorial for Programmers&lt;/a&gt; sowie &quot;Python Gepackt&quot; von Michael Weigend, erschienen im mitp-Verlag, ISBN 3-8266-1512-3.&lt;br /&gt;
Man kann auch genau erkennen, wann ich mich auf welche Dokumentation beziehe, weil ein Teil meiner Experimente auf Englisch gehalten sind, andere auf Deutsch... ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Hier einige Kurzinfos:&lt;/b&gt;&lt;br /&gt;
Python ist eine objektorientierte Skriptsprache, d.h. die in Form von Textdateien gespeicherten Programme werden zur Laufzeit in ein ausführbares Programm übersetzt, ähnlich wie das bei Shell-Skripten, Perl und Java der Fall ist.&lt;br /&gt;
Im Gegensatz zu den meisten anderen Sprachen verwendet Python keine Klammern, um zusammenhängende Befehlsblöcke, wie z.B. in Schleifen, Funktionen und dergleichen, zu kennzeichnen. Außerdem markiert das Zeilenende das Ende einer Anweisung, zusätzliche Zeichen, wie z.B. das oftmals verwendete Semikolon, werden nicht benötigt. Hier mal ein abstraktes Beispiel:

&lt;pre&gt;&lt;code&gt;
# Dieses Beispiel enthaelt keinen ausfuehrbaren Python-Code
# Zeilen die mit einerm # anfangen sind Kommentare
Befehl 1
Ein weiterer Befehl
Hier koennte eine Schleife anfangen
   Alle Befehle, die in der Schleife ausgefuehrt werden sollen,
   muessen einheitlich eingerueckt werden
   Wird z.B. eine Bedingung innerhalb der Schleife eingefuehrt,
      werden die Anweisungen, die zu der Bedingung gehoeren,
      noch weiter eingerueckt
   Diese Zeile wuerde also nicht mehr zur Bedingung gehoeren,
   sondern zur Schleife
Und diese hier auch nicht mehr zur Schleife.
&lt;/code&gt;&lt;/pre&gt;

Auch wenn das hier unverständlich erscheint, es macht Python sowohl übersichtlich wie auch einfach - wer einmal in einem längeren Sourcecode einen Klammerfehler eingebaut hat, und diesen stundenlang gesucht hat, wird wissen, was ich meine.&lt;br /&gt;
Umgekehrt verleiten die unterschiedlichen Einrückungen natürlich zu Fehler ganz eigener Art.&lt;br /&gt;
Übrigens ist die Art der Einrückung - Tabulatoren oder Leerzeichen - frei wählbar, es empfiehlt sich nur nicht, beides zu mischen, weil der Python-Interpreter zur Laufzeit Tabulatoren in Leerzeichen umwandelt. Wer Leerzeichen verwendet darf sich auch pro Einrückung überlegen, wieviele Leerzeichen es sein sollen. Im obigen Beispiel verwende ich drei pro Einrückung, aber auch nur eines oder mehr als drei wären erlaubt.</description>
    <dc:creator>cptsalek</dc:creator>
    <dc:subject>&lt;a href=&quot;http://cptsalek.twoday.net/topics/Python&quot;&gt;Python&lt;/a&gt;</dc:subject>
    <dc:rights>Copyright &#169; 2006 cptsalek</dc:rights>
    <dc:date>2006-05-10T16:23:00Z</dc:date>
  </item>


<textinput rdf:about="http://cptsalek.twoday.net/search">
   <title>find</title>
   <description>Search this site:</description>
   <name>q</name>
   <link>http://cptsalek.twoday.net/search</link>
</textinput>
<cc:License rdf:about="http://creativecommons.org/licenses/by/2.0/de/">
   <permits rdf:resource="http://web.resource.org/cc/Reproduction" />
   <permits rdf:resource="http://web.resource.org/cc/Distribution" />
   <requires rdf:resource="http://web.resource.org/cc/Notice" />
   <requires rdf:resource="http://web.resource.org/cc/Attribution" />
   <permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
</cc:License>

</rdf:RDF>
