2017-08-11 4 views
1

Pythonで繰り返し可能な関数を1行呼び出すことは可能ですか?ブロックのない単一行関数呼び出し?

背景:

私はディレクトリのリストに単一のサブディレクトリを作成したいとします。伝統的に、私は希望のサブディレクトリ・パスのリストを構築するために、リストの内包表記を使用します。

rootsはディレクトリのリストである

subs = [os.path.join(root, "sub") for root in roots]

。私はその後、os.mkdir()を呼び出すためにforブロックを作成する必要があります:

for sub in subs: 
    os.mkdir(sub) 

質問:

は、これを達成するために発電機を使用することが可能ですか?

私が試してみた: os.mkdir(os.path.join(root, "sub") for root in roots)

をしかし、それは発電機が受け入れられないと言ってTypeErrorをスローします。

+4

ループをリスト内包として書き直すことができました。しかし、あなたは本当にすべきではありません。あなたは新しいリストを作成しようとしていないからです。ループ内でコマンドを実行しようとしています。これは、通常のfor文が使用するものです。 – khelwood

+1

シングルライン: 'for subs in subs:os.mkdir(sub)'。 –

+0

@AshwiniChaudharyそれは問題を解決しません。その前に 'subs'を実行する必要がありますが、私は別のリストオブジェクトを作成しないようにしています。 – datta

答えて

3

はい、あなたが行うことができます:

[os.mkdir(os.path.join(root, "sub")) for root in roots] 

リストの内包は、あなたがどこにもその結果を割り当てていない場合でも実行されますので、これは動作しますが。 os.mkdirコールはNoneを返しますので、結果はNone(これは気にする必要はありません)のリストになりますが、機能の効果が発生します。

さて、それはどうかというか、議論の余地がある:

for root in roots: 
    os.mkdir(os.path.join(root, "sub")) 

あるいは:人々は一般的にそう、リストの内包表記はリストを生成することを期待してアクションを実行するためにループするので

for root in roots: os.mkdir(os.path.join(root, "sub")) 

は、より読みやすいですたとえば、理解の中でコードを見ているときに実際にフォルダを作成しているのを見逃すことは簡単です。しかし、を望むならば、あなたはできます。

+0

私はこれについてリストの理解を使うことができるかどうかわかりませんでした。知っておいてよかった。 'for'ブロックは伝統的なものですが、プログラムから余分な行を削除してリストを作成し、それに続いて各リストの' for'ループを作成します。むしろ、単一のライナーが '#'のコメントを使って説明することになります。 – datta

+0

@dattaもしあなたがそのような単純なもののコメントを追加しようとするなら、それは間違っている。 for-loopははるかに明白であり、説明を必要としません。 –

+0

私は本当に副作用を生み出すために書かれたリスト内包が特に嫌いです。とにかく私の2セント。 – wwii