2016-07-10 1 views
3

Ich weiß für for loop zu verwenden und meine Funktion aufrufen, bis ich nicht None als Rückgabewert, aber ich bin auf der Suche nach etwas Python gebaut in dem kann hilfe hier.Pythonic Weg, um eine Funktion mit Satz von Argumenten aufzurufen, bis es irgendeine Sache zurückgibt aber keine

z.B. - iter(myfunc(), None) Es wird myfunc() aufrufen, bis es zurück None

Ich bin auf der Suche genau umgekehrt zu diesem z. - iter(myfunc(), not None), Call myfunc() bis gibt es irgendeine Sache, aber None

Vielen Dank im Voraus ..

+0

'von itertools Import dropwhile, wiederholen, starmap; weiter (dropwhile (lambda x: x ist None, starmap (my_func, wiederhole (())))) – Bakuriu

+0

Was macht my_func()? –

+0

@PadraicCunningham es gelten reguläre Ausdruck für Argument und gibt das übereinstimmende Objekt zurück – AlokThakur

Antwort

3

Mit nur drei Linien:

x = None 
while x is None: 
    x = f() 
1

Es gibt keine fertig eingebaute, aber es ist einfach genug, um eine Generatorfunktion zu bauen:

def iter_while_none(f): 
    while True: 
     value = f() 
     if value is not None: 
      return 
     yield value 

obwohl der Wert ergab Ist das nicht interessant; es ist schließlich None jedes Mal.

+0

Ich denke OP machte es nicht sehr klar, aber sie wollen wissen, was dieser Nicht-None-Wert ist. Diese Lösung löscht diesen Wert. – kojiro

2

Suchen Sie nicht nach einem eingebauten für alles. Meiner Meinung nach ist sogar die übliche Zwei-Argumente-Form von iter nicht wert, verwendet zu werden, weil es kein bekanntes Merkmal ist, und das macht es für die meisten Leute schwerer zu lesen. Behalte es einfach und unkompliziert. Eine oder zwei Extraleitungen werden nicht schaden.

while True: 
    x = myfunc() 
    if x is not None: 
     break 
1

Diese Antwort ist ein wenig Übung in der Macht der Python. Ich bin nur frustriert, dass iter s 2-Arity-Formular keine Funktion für seinen zweiten Parameter übernimmt.

Aber es tut, wenn Sie verrückt genug sind. Sehen Sie, Sie können die Gleichheit für ein Objekt wie folgt neu definieren:

class Something: 
    def __eq__(self, other): 
     self.lastother = other 
     return other is not None 

sentinel = Something() 
myiter = iter(myfunc, sentinel) 
for nope in myiter: 
    pass 
match = sentinel.lastother 

Dort. Genießen. Python ist ziemlich erstaunlich, dass Sie die Definition der Gleichheit auf diese Weise unterlaufen können. Viel Spaß beim stürmen der Burg!

+0

Machst du Witze? Upvote diese Antwort für seine Unterhaltung und pädagogische Faktoren, aber bitte nicht akzeptieren! Akzeptieren bedeutet, dass unbedarfte Script-Kiddies es kopieren und es auf einem Produktionssystem landen wird. Ich will dafür nicht verantwortlich sein! Akzeptiere stattdessen bitte die Antwort von Vpfb! – kojiro

+0

Ich mochte diese Antwort am meisten, so akzeptierte ich es, ich würde Ihren Wunsch respektieren – AlokThakur

+1

@AlokThakur Ich schätze das, aber der Code, den ich schrieb, ist pädagogischer als richtig. Sie sollten wirklich die Antwort von Vpfb in Betracht ziehen. – kojiro

Verwandte Themen