PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python for Schleife mit return Anweisung?!?



rthill
15-11-2006, 16:44
Hi,
wer kann mir helfen mein Problem zu lösen? Eine for Schleife soll mehrere return Anweisungen haben.
Beispiel:


import feedparser
from HTMLParser import HTMLParser
import formatter, htmllib
################################################## ############################
class feedReader(object):
'''Class: feedReader'''
################################################## ############################
def list(self, rssFeed):
'''List all messages (Title and Content)'''
dumbWriter = formatter.DumbWriter()
format = formatter.AbstractFormatter(dumbWriter)
htmlparser = htmllib.HTMLParser(format)
feed = feedparser.parse("%s" % (rssFeed))
for i in xrange(len(feed['entries'])):
title = feed.entries[i].title
data = feed.entries[i].description
content = htmlparser.feed(data)
htmlparser.close()
author = feed.entries[i].author
return (title, content, author)
################################################## ############################
print feedReader().list("http://somewhere.on.the.net/blog/rss20.xml")

Bei Ausführung kriege ich immer nur den ersten Eintrag zurück.

Bei dem Code geht es darum pro Feed-Eintrag eine Konvertierung von HTML zu Plain Text zu machen und diese Anschliessend in eine DB zu füllen (dieser Code Teil besteht noch nicht).

Danke im Voraus für eure Hilfe,
tinti

foobarflu
15-11-2006, 18:57
Häng in der Schleife an eine Liste an und gib nach der Schleife die Liste zurück.


def list(self, rssFeed):
crap = []
...
for ...:
...
crap.append((title, content, author))
return crap

rthill
16-11-2006, 08:28
Super so funktioniert das einwandfrei :) , Vielen Dank.

tinti

Joghurt
18-11-2006, 10:23
Eine andere Möglichkeit wäre übrigens ein Generator: statt "return" verwendest du "yield". Beim Aufruf der "Funktion" bekommst du dann ein Generatorobjekt zurück, wo du mittels .next() das nächste Element bekommst. Alternativ kannst du auch einfach drüber iterieren. Einfaches Beispiel:

def simple():
# Absichtlich hier keine For-Schleife...
x = 0
while x < 100:
yield x
x += 1

#Möglichkeit 1 (nicht so gut)
a = simple()
print a.next() # 0
print a.next() #1
# etc. Es wird eine StopIteration-Exception geworfen, wenn du am Ende bist.

# Möglichkeit 2
for x in simple():
print x


Übrigens solltest du eines deiner C-like-Kontrukte ändern: statt

for i in xrange(len(feed['entries'])):
title = feed.entries[i].title
data = feed.entries[i].description
content = htmlparser.feed(data)
htmlparser.close()
author = feed.entries[i].author
return (title, content, author)schreibst du besser

for entry in feed['entries']:
title = entry.title
data = entry.description
content = htmlparser.feed(data)
htmlparser.close()
author = entry.author
return (title, content, author)

rthill
18-11-2006, 11:16
@Joghurt, wird die Schleife schneller durch das C-like Konstrukt oder ist dies nur der Schöhnheit wegen?

Joghurt
18-11-2006, 14:22
Wahrscheinlich wird sie auch schneller, wenn auch nur unmerklich.

Ist einfach "unpythonic" und umständlich, das so wie du zu machen.