2017-10-08 7 views
-3

リストの理解をいつ使うべきか理解しています。多くの時間、それは便利で行を保存します。しかし時々、それは期待どおりに動作しませんか?python list comprehension transform

私が持っている場合:

1 
2 
3 
4 

私がしようとした場合::

print(i for i in listA) 

listA = ['1', '2', '3', '4'] 

私は明らかに、これは私を与えるループ

for i in listA: 
    print(i) 

のために使用することができます

しかし、これは私の同じ結果を与えることはありません?

<generator object <genexpr> at 0x102a3b3b8> 

これをどのように理解する必要がありますか?

私のその他の質問は次の通りです: 私はforループの後に1行のコードがあると、常に理解を使って書くことができますか?

答えて

1

あなたはリストの理解がありません。 ジェネレータ式print()を渡しました。 print()関数は、渡す引数を反復処理しません。 str()の変換をstdoutに送信するだけです。

あなたが*(...)を使用し、print()に発電機のすべての値を送信したい場合は、次の

print(*(i for i in listA)) 

ここでそれはあなただけlistA内の値のために同じことを行うことができ、やり過ぎだ:

print(*listA) 

どちらの場合も、デフォルトのセパレータであるスペースを使用して値が出力されます。あなたは改行を持っていると思った場合は、セパレータとして\nを使用するprint()を伝える:

print(*(i for i in listA), sep='\n') 
print(*listA, sep='\n') 

そして、いや、すべてのforループはリストの内包に変換するのに適しているではありません。リストの理解は、新しいリストオブジェクトを作成し、すべてのループ構築リストではありません。

フォームのリストがある場合:

some_name = [] 
for <target> in <iterable>: 
    some_name.append(<expression>) 

を、あなたはリストの内包にそれを変換することができます:

some_name = [<expression> for <target> in <iterable>] 
0

あなたは、次の操作を行うことができます

listA = ['1', '2', '3', '4'] 
# option 1 
print(*listA, sep='\n') 
# option 2 
for p in listA: print (p) 
1

ジェネレータは、反復処理が可能なオブジェクトです。それは印刷するつもりはありません。

リスト内包を有するブラケットなしで、2つの形で来る:

print(i for i in listA) 
print([i for i in listA]) 

他方は実際のリストを生成しながら、最初のものは、イテレータオブジェクトを生成します。

あなたが行うことができ、あなたの問題のために:彼らはコードが曖昧にする際に一般的に

print(*listA, sep='\n') 

、リストの内包表記は避けるべきです。なぜ単純なforループを使用しないのですか?

関連する問題