以下の2つのオプションから、イテラブルを実行するための魅力的なもの(可読性の高いコード、より多くのpythonic、効率性など)と将来のロジックを追加したい場合1からすべての戻り値)?リターンジェネレータVS繰り返し実行中なしなし
オプションの1つはジェネレータを返し、もう1つは次のアイテムを返し、すべての繰り返しを実行するとNone
を返します。
好ましい方法はありますか?はいの場合、なぜですか?他にはない方法がいくつかあります。
class Option1():
def __init__(self):
self.current = 0
def get_next_batch(self, my_list):
if self.current == len(my_list):
self.current = 0
return None
self.current += 1
return [my_list[self.current-1]]
class Option2():
def __init__(self):
self.current = 0
def get_next_batch(self, my_list):
while self.current < len(my_list):
yield [my_list[self.current]]
self.current += 1
self.current = 0
raise StopIteration()
使用法:どちらの場合も
o1 = Option1()
o2 = Option2()
arr = [1,2,3,4,5]
a = o1.get_next_batch(arr)
while a is not None:
print a
a = o1.get_next_batch(arr)
for item in o2.get_next_batch(arr):
print item
出力:あなたはほぼ確実秒で行きたい
[1]
[2]
[3]
[4]
[5]
発電機に関するご意見ありがとうございます。ロジックが複雑なときは、異なるサイズのリストを生成するので、私は現在が必要です。いくつかのロジックが 'Option1'を使って実装され、' Option2'は使われないシナリオがありますか?たとえば、次回の商品返品は、すでに返品された商品やそのようなものに依存しますか? – Farseer
いいえ、どちらもまったく同じことを達成できます。概念的には、ジェネレータを使ってイテレータをモデル化する方が簡単です(私の意見では)。 – Dunes
forループでOption1を動作させる方法を少し追加しました。 – Dunes