こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Pythonのanyって何?

下のPythonのプログラムにおいて、any()とは何をしているんでしょうか。たしかに取ると動かなくなります。

$ cat fruits.txt
Banana
Orange
Navel
Strawberry
Apple
$ cat fruits.txt | python -c 'import sys; any(print(l,end="") for l in sorted(sys.stdin))'
Apple
Banana
Navel
Orange
Strawberry
$

投稿日時 - 2018-05-29 12:21:01

QNo.9503120

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

 まず、any関数の意味です。この関数は、引数にイテレータをとります。そして、その中の一つでもtrueなら、trueを返します。
 この使い方は、器用ですね。正直、any関数の意味なんてお構いなしに見えます。戻り値もどうでもよい。ただ、イテレータを取り、何の副作用も無いという関数が欲しかった。つまり、関数の構文だけが欲しかったようです。その理由は、ジェネレータを使いたかったから。ジェネレータの中でprint文を利用して必要な出力をしてしまったのは良いが、ジェネレータはあくまでイテレータを返しますから、そのイテレータを捨てるゴミ箱が欲しかったと言った感じです。
 ジェネレータを使うにしても、
 print("".join(l for l in sorted(sys.stdin)))
 の方が素直な気がします。
 と考えれば、もともとsortedはリストを返すわけで・・・
 print("".join(sorted(sys.stdin)))
 でも、結果は一緒ですねぇ・・・
 何故にこんな面倒なことをしたのやら?

投稿日時 - 2018-05-30 23:50:44

お礼

ありがとうございます!

joinなるほどですね。

上のプログラムはブログで発見したのですが、もとは
python -c 'import sys; any(print(l,end="") for l in sorted(sys.stdin.readlines()))'
で、他のブログに「sys.stdinにreadline()、readlines()は不要」と書かれていたので取ったものです。

他のブログを見ても、forをanyで囲ったものが多くありますが、コピペの源流を知りたいです。。

python -c 'import sys; [print(l,end="") for l in sorted(sys.stdin)]'

というのもありました。

python -c 'import sys; print(*sorted(sys.stdin), sep="")'

というのもいけるっぽいですね。

でもjoinを使ったやり方が、何をしているのかはっきり分かって、短くて好きです^^

投稿日時 - 2018-05-31 13:23:54

あなたにオススメの質問

オススメのQ&Aはありません。