Seite 1 von 1
Ich bekomm eine forwhile Schleife nicht gebändigt. Hilfe
Verfasst: Freitag 12. Dezember 2008, 12:41
von Thuught
Hallo Python Comm,
Könnte ihr mir eine kleine Hilfestellung gehen, warum mein Code
nicht funktioniert? Er sollte mir eigtl eine Liste aus Teillisten produzieren.
Stattdessen sind die alle leer.
Code: Alles auswählen
z=[1,2]
b=[]
def test(x):
q=len(x)
for p in range(q):
test=True
b.append(x)
x.append("+1")
while (dLauf<2 and test) or (dLauf==2 and len(x)!=0):
test=False
b.append(x)
del x[0]
if len(x)==0: break
>>> for dLauf in range(3):
... test(z)
>>> b
[[], [], [], [], [], [], [], [], [], [], [], []]
edit: ums mal auf den Punkt zu bringen:
macht ähnliche Dinge
Verfasst: Freitag 12. Dezember 2008, 12:51
von Zap
Aua, also der Code tut an vielen Ecken weh.
1. Man kann ohne range() über die Elemente einer Liste iterieren. Somit braucht man in der Regel nicht die Länge der Liste ermitteln.
2. Du hantierst wild mit den Variablen und ihren eigentlichen Namensbereichen.
dLauf wird ausserhalb von test() definiert und innerhalb verwendet. Das geht mal garnicht!

Genau so der Zugriff auf b.
Vielleicht zeigst du mal was dein Ergebnis sein sollte. Ich werde aus dem Snippet absolut nicht schlau was da sinnvolles bei rauskommen müßte.
Verfasst: Freitag 12. Dezember 2008, 13:07
von Thuught
Ich hatte eigtl nicht vor, mein richtige Funktion zu zeigen, weil das bei euch bestimmt Augenkrebs verursacht. Aber du hast es ja gewünscht
Code: Alles auswählen
def crawl(query):
q=len(query)
for p in range(q):
test=True
while (dLauf<2 and test) or (dLauf==2 and len(query)!=2):
foundlinks=aref.findall(urllib2.urlopen(query[0].adr).read())
query[0].verlinkt=map(makelink,foundlinks)
while (query[0].verlinkt).count(None)!=0:
(query[0].verlinkt).remove(None)
for i in query[0].verlinkt:
query.append(i)
(link.allinst).append(i)
del query[0]
test=False
if len(query)==0: break
es geht um einen Webcrawler, der in der queryliste alle Links einträgt, die er gefunden hat- aber solang dLauf, also die Tiefe noch nicht erreicht ist
immer die Funde des vorherigen durchlaufs abarbeit und erst am Ende die Liste leert.
makelink macht kurz gesagt ne linkinstanz aus nem link.
link.verlinkt ist ne Liste auf Linkinstanzen die die entsprechende Instanz
verlinkt. link.allinst ist ne Klassenvariabel, damit ich später auf die instanzen zugreifen kann
Mein Problem ist, dass query[0].verlinkt immer leer ist, genauso wie die Liste b oben
Verfasst: Freitag 12. Dezember 2008, 13:11
von DeJe
Du packst immer nur die Referenz von x in b. Und x ist nun mal am Ende leer.
versuche mal b.append(x[:]).

Verfasst: Freitag 12. Dezember 2008, 13:12
von BlackJack
@Thuught: Ausserdem braucht man sich den Quelltext gar nicht näher anschauen, denn das ist sicherlich nicht der, um den es geht. Das was da steht ist überhaupt nicht lauffähig, weil es eine Mischung aus Quelltext in einem Modul und interaktivem Interpreter ist. Das gibt, bevor es läuft, schon einen `SyntaxError`.
Ansonsten möchte ich mich Zap anschliessen. Werte betreten Funktionen als Argumente und verlassen sie als Rückgabewerte. Aus einer Funktion heraus irgendwelche Objekte auf Modulebene zu verändern ist Murks.
Leer sind die Listen wahrscheinlich deshalb, weil Du immer wieder `x` hinzufügst, aber aus `x` auch alle Elemente löschst.
Code: Alles auswählen
In [243]: x = [1, 2, 3]
In [244]: b = list()
In [245]: b.append(x)
In [246]: b.append(x)
In [247]: b
Out[247]: [[1, 2, 3], [1, 2, 3]]
In [248]: del x[0]
In [249]: b
Out[249]: [[2, 3], [2, 3]]
In [250]: b[0] is x
Out[250]: True
Edit: Nachdem ich jetzt die echte Funktion gesehen habe: Schmeiss das bitte alles weg und schreibe es ordentlich und sauber neu. Da steigt doch kein Mensch durch, globale Variablen sind schlecht, und ich glaube auch nicht, das *der* Code jemals das tut was Du im Text beschreibst.
Verfasst: Freitag 12. Dezember 2008, 16:24
von jonas
Hi,
ich will dich nicht ärgern oder ähnliches

aber hast du dir das Tutorial mal angesehen(
http://python.net/~gherman/publications ... nline/tut/) ?
Zu deinem ersten Code ist mir nur aufgefallen:
solange du `test()` nicht auch b übgergibst wird das nix. Also
da müsste schon mindestens noch sowas sein wie:
Code: Alles auswählen
def test(x, liste):
## tu was...
liste.append(irgendwas)
## tu noch mehr...
MfG Jonas

Verfasst: Freitag 12. Dezember 2008, 17:18
von DasIch
@jonas Du hast da nicht wirklich gerade ein 9! Jahre altes Tutorial verlinkt?
Verfasst: Freitag 12. Dezember 2008, 17:59
von numerix
DasIch hat geschrieben:@jonas Du hast da nicht wirklich gerade ein 9! Jahre altes Tutorial verlinkt?
> 9 1/2 !
Aber soweit ich sehe, ist das die letzte deutsche Übersetzung des offiziellen Tutorials (würde mich freuen, wenn ich Unrecht hätte ...).
Wobei man mal wieder sehen kann, wie wichtig es ist, Englisch zu lernen, wenn man es beim Programmieren zu was bringen will ...

Verfasst: Freitag 12. Dezember 2008, 19:27
von Leonidas
Naja, es gibt schon auch aktuellere deutsche Tutorials. (Aber englischlernen rentiert sich sowieso)
Verfasst: Freitag 12. Dezember 2008, 20:13
von numerix
Leonidas hat geschrieben:Naja, es gibt schon auch aktuellere deutsche Tutorials.
Jo, stimmt. Zumindest als PDF gibt es eine deutsche Übersetzung des Originals, die nur gut 7 1/2 Jahre alt ist (zu Python 2.1):
http://starship.python.net/crew/gherman ... -de-21.pdf
Verfasst: Freitag 12. Dezember 2008, 20:44
von jonas
Hi

,
Trotz des Alters stehen da wichtige Anfangssachen drin.
MfG Jonas
Verfasst: Freitag 12. Dezember 2008, 21:02
von DasIch
jonas hat geschrieben:Trotz des Alters stehen da wichtige Anfangssachen drin.
Nur kann ein Anfänger diese nicht vom Rest trennen.