Warum gehts in Python 2.7, aber nicht in v3.1?

Hallo liebe Phytonisten!

Ich bin blutiger Programmier-Anfänger und habe das folgende Progrämmchen geschrieben. Es soll in einer Wortliste ein bestimmtes Zeichen suchen, und mir dieses Zeichen und die nächsten 1-2 Zeichen ausspucken - ob 1 oder 2 hängt davon ab, was dieses zweite Zeichen ist.

Das Programm läuft unter Python2.7. Ich möchte aber 3.1 verwenden, wegen der einfacheren Unicode-Unterstützung. Warum funktionierts in 2.7, aber nicht in 3.1?

Mein Programm:

try:
 fhand = open('/home/\*\*\*/testdict-r3env')
 writeto = open('/home/\*\*\*/test-r3env.out', 'w') 
except:
 print('could not open file')
 (exit)

for line in fhand:
 pos = 0
 length = len(line)
 while pos 
~~~~~~~~
Eine Wortliste könnte so aussehen:


    
    kof:3rE
    päx
    ropot:3
    f3t:ruKE




Und folgenden Output würde ich mir erwarten:


    
    3r
    
    3
    3t:




Egal was in der Wortliste drinsteht, die äußere if-Schleife wird nie durchgeführt (und entsprechend auch die innere nicht, klar.)

Würd mich sehr freuen, wenn jemand meinen Knoten im Hirn lösen könnte!
Herzlichen Dank schon im Voraus!
vulpeca

Hi,

du vergleichst bei der if Abfrage mit ‚is‘. Das bedeutet, du vergleichst, ob die Objekte identisch sind.
Probier doch bitte mit ‚if letter == ‚3‘:‘ zu vergleichen.

Gruß Andreas

Andreas, Du bist mein Held!

Ja, so funktionierts.
Was ich noch nicht verstehe ist, was der Unterschied zwischen == und is ist. Aber das führt jetzt zu weit. Gleiches bei der inneren if-Schleife - mit == funktionierts, mit is nicht.

Tausend Dank!
vulpeca

Hi,

ganz einfach: ‚is‘ vergleicht, ob zwei Objekte IDENTISCH sind, d.h. ob es sich um das selbe Objekt handelt.
‚==‘ vergleicht ob z.B. 3 = 3 ist.

Gruß Andreas

Hi!

also wenn x is x, dann ist es dasselbe x, aber wenn x == x, dann ist es „nur“ das gleiche x. Richtig?
Danke nochmals!
v.

Lies mal hier nach:
http://de.wikibooks.org/wiki/Python-3-Programmierung…

Danke, jetzt ist es mir klar!

v.

Hi vulpeca,

sorry, habe gerade erst Deine Anfrage gelesen und muss gleich zur Arbeit. Mit Python 3.x kenne ich mich nicht wiklich aus, das versuche ich so gut wie möglich zu vermeiden. Heute Abend kann ich es mir aber mal ansehen.

Ich sehe, dass Du mit den Vorzügen von Python noch nicht ganz so sehr vertraut bist, denn einige Dinge würde man nicht so machen, wie in C. :wink:

Erstmal zu Deiner Frage: in Python verwendet man ‚is‘ nur, um zu prüfen, ob zwei Objekte wirklich identisch sind. Bei Deiner Prüfung:

if letter is ‚3‘:

prüfst Du, ob das extrahierte Stringobjekt und des explizit definierte Stringobjekt wirklich dieSELBEN sind. Soweit ich weiß kann Python einmal definierte Stringobjekte wieder verwenden, muss es aber nicht. Worauf Du Dich nur verlassen kannst, ist, dass die beiden den gleichen WERT haben:

if letter == ‚3‘:

Evtl. kann es da noch zu Probleme mit Unicode kommen, aber das können wir besprechen, wenn es soweit ist. :smile:

Ich persönlich hasse es, wenn ich um Hilfe bei der Lösung eines Problems in einem bestimmten Codestück frage, und dann Antworten kommen wie „warum machst Du es denn so, so geht es doch viel einfacher“. Da ich Dir aber schon geantwortet habe, möchte ich Dir ein paar hoffentlich hilfreiche Kommentare nicht vorenthalten. :smile:

(noch ungetestet!)
Für jede Zeile:

pos = line.find(letter) ## sucht das erste Vorkommen
while pos \> -1: ## -1 == nichts gefunden
 env = line[pos:stuck\_out\_tongue:os+2] ## speichert die ersten beiden
 try:
 ## wenn das zweite Zeichen Doppelpunkt, hinzufuegen
 if line[pos+2] == ":":
 env += ":"

 ## faengt IndexError bei zu kurzem String ab
 except IndexError:
 pass

 writeto.write(env+"\n")
 pos = line.find(letter, pos+1) ## sucht nächstes Vorkommen

Versuch es mal, wenn es nicht an dem ‚is‘ lag schau ich es mir nochmal genauer an.

Viel Erfolg,
Sky

Hi vulpeca,

ups, da war ja jemand schon viel schneller. Habe den Thread gar nicht gesehen, sondern nur auf Deine Anfrage geantwortet. In dem Fall ist ja alles klar. :smile:

VG,
Sky

Hi Sky,

vielen Dank für Deine Antwort!
ja, an dem ‚is‘ lags.

Ich sehe, dass Du mit den Vorzügen von Python noch nicht ganz
so sehr vertraut bist, denn einige Dinge würde man nicht so
machen, wie in C. :wink:

Du hast Recht, ich bin ein absoluter Frischling, was Python betrifft. Allerdings auch was Programmieren an sich betrifft, hab also auch keine Ahnung, wie man etwas in C macht.

Evtl. kann es da noch zu Probleme mit Unicode kommen, aber das
können wir besprechen, wenn es soweit ist.

Ja, bei 2.7 ist es zu Problemen mit Unicode gekommen, dsehalb will ich ja 3.x verwenden. Dort habe ich die nicht :smile:

dann
Antworten kommen wie „warum machst Du es denn so, so geht es
doch viel einfacher“.

Ich bin Dir sehr dankbar dafür - wie soll ich sonst je lernen, was pythonistisch ist? :smile:
Ich werd Deine Version heute Abend oder morgen testen. Noch einmal herzlichen Dank für die ausführliche Antwort!

vulpeca

Hi Sky,
Deine Version funktioniert in der Tat, und ist um Welten einfacher. Ich hab ganz offensichtlich noch viel zu lernen :smile:

lG
vulpeca

Hallo vulpeca,

ich habe gerade gesehen, dass ich noch einen Fehler gemacht habe, den Du aber offensichtlich schon korrigiert hast. Die Variable ‚letter‘ habe ich falsch interpretiert. Ich dachte einen Moment, dass das der String ist, nach dem Du suchst. Aber Du suchtest ja nach der ‚3‘ und letter war der herausgeschnittene Buchstabe.

Du hast Recht, ich bin ein absoluter Frischling, was Python
betrifft. Allerdings auch was Programmieren an sich betrifft,
hab also auch keine Ahnung, wie man etwas in C macht.

Ein bedeutender Unterschied liegt, zumindest visuell, in den Schleifen. In C ist es üblich, einen Index hochzuzählen und in der Schleife dann über den Index ein zugehöriges Element aus einer Liste, Tupel oder sonstigem zu holen. Z.B. 'for (i=1; i eine Liste oder ein Tupel ist, dann wird in jedem Schleifendurchlauf auf das nächste Element gesetzt. Wenn es ein Dictionary ist, wird auf den nächsten Schlüssel gesetzt, und bei einem String werden die einzelnen Character zurückgegeben.
Das sind einfach unterschiedliche Herangehensweisen. Perl Code ist kürzer und vielleicht flexibler, aber bei weitem nicht so gut lesbar. Python setzt vor allem auf gute Lesbarkeit des Codes. Denn sein Grundsatz ist, dass Programmcode wesentlich häufiger gelesen und verstanden, als geschrieben werden muss.

Bevor ich Dich aber mit Dingen zutexte, die Du schon weißt, werde ich mich auf evtl. Fragen beschränken, wenn Du noch welche hast.

Wärmstens ans Herz legen, bei allen Arten von Fragen und Problemen rund um Python, ist www.python-forum.de - die deutschsprachige Python-Hackerecke schlechthin (von allem was ich kenne, muss ich dazu sagen).

Ich gebe zu, dass ich lange nicht mehr da war. Aber meinen Erfahrungen nach hängt da immer jemand rum und Deine Fragen werden in aller Regel binnen Minuten beantwortet. Du solltest nur zwei Dinge beachten: 1. keine Fragen ohne vorherige Recherche in den existierenden Threads und 2. keine Informatik-Hausaufgaben direkt posten, um sie auf die Mitglieder abzuwälzen. Näheres findest Du aber in den ersten Posts unter „Allgemeine Fragen“.

Ja, bei 2.7 ist es zu Problemen mit Unicode gekommen, dsehalb
will ich ja 3.x verwenden. Dort habe ich die nicht :smile:

Soso, Du willst der Unicode-Problematik also einfach ausweichen. Clever, aber unsportlich. :wink:
Die Umkodierung zwischen 7-, 8-, 16- und 32-bit Codecs ist nicht immer ganz unproblematisch, aber man sollte sich damit mal beschäftigt haben. Eigentlich ist es ganz plausibel, wenn man es mal verstanden hat. Falls Du Dich mal damit beschäftigst und Fragen hast, kannst Du Dich gern wieder an mich wenden - oder im Python-Forum nachlesen.

dann
Antworten kommen wie „warum machst Du es denn so, so geht es
doch viel einfacher“.

Ich bin Dir sehr dankbar dafür - wie soll ich sonst je lernen,
was pythonistisch ist? :smile:

Über die Frage, was pythonisch ist, gibt es ganze Abhandlungen und Diskussionen. Die paar Kommentare, die ich dazu abgeben kann, sind wenig geeignet, die Fülle des pythonischen Segens angemessen zu umschreiben. Meine Güte, habe ich das gerade geschrieben? :wink:

Noch einmal herzlichen Dank für die ausführliche Antwort!

Gern doch. Es freut mich, wenn meine Erläuterungen auf Zuspruch treffen und ich mein Wissen mit den pythonischen Brüdern und Schwestern teilen kann. :smile:

… und nein, ich bin nicht betrunken, nur etwas müde. :wink:

VG,
Michael