• 締切済み

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 $

みんなの回答

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

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

TYWalker
質問者

お礼

ありがとうございます! 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を使ったやり方が、何をしているのかはっきり分かって、短くて好きです^^