2016-07-10 2 views
3

私はループのために使用することを知っています。戻り値としてNoneを返します。しかし、ここで助けてください。Pythonの方法Pythonの方法引数のセットで関数を呼び出して、何も返さない限りNoneを返します。

- iter(myfunc(), None)myfunc()返信するまでNone

私はこれとは正反対のコードを探しています。 - iter(myfunc(), not None), Call myfunc()それは任意のものを返しますが、事前にNone

おかげ..

+0

'itertoolsからのインポートdropwhile、repeat、starmap; next(dropwhile(lambda x:x isなし、starmap(my_func、repeat(()))) ' – Bakuriu

+0

my_func()は何をしていますか? –

+0

@PadraicCunninghamそれは引数に正規表現を適用し、一致したオブジェクトを返します – AlokThakur

答えて

3

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

まで、そこには準備ができて組み込みはありませんが、ジェネレータ関数を構築するために十分に簡単です:

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

値が得られたものの、それほど興味深いものではない。結局、毎回Noneです。

+0

私はOPがそれを非常に明確にしてくれなかったと思っていますが、彼らはそのNon-None値が何であるか知りたいと思っています。このソリューションはその価値を低下させます。 – kojiro

2

すべての機能を内蔵していません。私の意見では、通常の2つの引数の形式のiterでさえ、よく知られている機能ではないため、大部分の人が読むのが難しくなるため、使用する価値はありません。ちょうどそれを簡単かつ簡単に保つ。余分な1行か2行は傷つかないでしょう。たった3行で

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

この回答は、Pythonのパワーの行使のビットです。私はちょうどiter 2-arityフォームがその2番目のパラメータのための関数をとらないという不満を感じます。

しかし、あなたが十分に狂っている場合は、それがあります。オブジェクトの等価性を次のように再定義することができます。

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 

があります。楽しい。 Pythonは、この方法で平等の定義を覆すことができます。楽しんで城を襲ってください!

+0

あなたは冗談か?娯楽と教育の要因についてこの答えをアップアップしてください。しかし、それを受け入れないでください!それを受け入れることは、スクリプトの児童がそれをコピーしてしまうことを意味し、それはいくつかのプロダクションシステムで終わるでしょう。私はその責任を負いたくありません!代わりにVpfbの答えを受け入れてください! – kojiro

+0

私はこの回答が最も好きなので、私はそれを受け入れた、私はあなたの願いを尊重します – AlokThakur

+1

@ AlokThakur私はそれを感謝しますが、私が書いたコードは正しいよりも教育的です。あなたは本当にVpfbの答えを考慮する必要があります。 – kojiro

関連する問題