2016-05-17 6 views
4
my_nums =(i*i for i in [1,2,3,4,5]) 
for k in (my_nums): 
    print(k) 
GG = list(my_nums) 

print(GG) 

それは印刷されます。pythonの基本的なレベル発生し、リストの質問

1 
4 
9 
16 
25 
[] 

Process finished with exit code 0 

[]値が空である理由を私は理解できない(それは[1,4,9,16,25]する必要がありますか)?また、for-loopは発電機の値をリストに変換しますか?

答えて

4

には、以下のgenerator comprehensionです:

my_nums =(i*i for i in [1,2,3,4,5]) 

for k in (my_nums): 
    print(k) 

だから、初めてあなたそれをループして値を印刷するには、発電機は、それが生成できるすべての値を出力します。 forループは、my_nums.next()を呼び出し、得られた値をkに代入して出力します。 forループの繰り返しは、StopIteration例外が発生すると停止します。

そして、forループの後にGG = list(my_nums)を使用すると、ジェネレータがすでに使い果たされており、もう何も生成されないため、空のリストを取得します。

あなたはlistに発電機によって得られた値を格納したい場合は、直接、次のようにそれを行うことができますが、

my_nums =(i*i for i in [1,2,3,4,5]) 
GG = list(my_nums) # no for loop for printing it already 

、私はあなたがしなければ、パフォーマンスは賢明なあなたがどんな利点を獲得することを確認していませんそれは上記のとおりです。

+1

お手数ですが、ありがとうございます! –

0

ジェネレータを反復処理するときは、同時に空にします。 for k in (my_nums): print(k)を削除すると、予期した結果が得られます。ここ

同じこと:

my_nums =(i*i for i in [1,2,3,4,5]) 
a = list(my_nums) 
b = list(my_nums) 
print(a) 
// [1,4,9,16,25] 
print(b) 
// [] 
0

あなたは、ストリームからの読み込みと発電機の

for k in (my_nums): # you already made my_nums generate till the end here 
    print(k) 

だと思いをしたときは、すでに生成されたすべての値を使い果たしてしまったためです。あなたはすでにストリームを読み込んでいますので、すでに空きがなくなっている発電機からもっと多くのものを読み込もうとすると空のリストが表示されます

1

初めて発電機を使い終わったばかりなので!

my_nums = (i*i for i in [1,2,3,4,5]) 
for k in my_nums: 
    print(k) 

my_nums = (i*i for i in [1,2,3,4,5]) 
print(list(my_nums)) 
0

このようなジェネレータ式:

my_nums = (item for item in [1, 2, 3, 4, 5, 6, 7]) 

はこのような何かのための構文糖である:

def generator(iterable): 
    for item in iterable: 
     yield item 

my_nums = generator([1, 2, 3, 4, 5, 6, 7]) 

forloop自体がこのようなものに相当します。

while True: 
    try: 
     item = next(my_nums) 
    except StopIteration: 
     break 
    else: 
     print(item) 

01以降問題は、発電機の過剰発現あなたがループ初めて、それが排出されるということです

gg = [] 
for item in my_nums: 
    gg.append(item) 

:のようなものです。もう一度ループすると、StopIterationが発生し、ループが解除されます。例えば

>>> my_nums = (i for i in [1, 2]) 
>>> list(my_nums) 
[1, 2] 
>>> list(my_nums) 
[] 
>>> next(my_nums) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> 

あなたはlist(my_nums)を呼んで二回目は、それが空のリストを返す方法を参照してください?これは、発電機が使い尽くされたためです。そこから次のアイテムを取得しようとすると、それがどのように発生するのかを見ることができます。StopIteration

0

ジェネレータはイテレータですが、繰り返し実行することはできません。これは、すべての値をメモリに保存しないで、値をオンザフライで生成するためです。

my_nums =(i*i for i in [1,2,3,4,5]) 
for k in (my_nums): 
    print(k) 

それは出力します。

1 
4 
9 
16 
25 

をそれはあなたの代わりに[]の()を使用除いて全く同じです。しかし、for k in my_numsは発電機を一度しか使用できないため、2回目は実行できません。1を計算して忘れて4を計算し、25を1ずつ計算して終了します。

繰り返しを実行すると、StopIterationトレースバックが発生します。

これについては、threadで詳細に説明しました。