Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@jeyei

Python内包表記をprintする際のお作法

はじめに

本記事は2019/4/8 16:07に投稿した記事の改訂版です。
コメントでご指摘頂いた内容を反映する形でごっそり内容を刷新させて頂きました。
目新しい内容は0ですが、よろしければご覧ください。

内包表記とprint関数の組み合わせ

こんな感じです。

printと内包表記の組み合わせ(1)
print([i for i in iterable])

ちなみに下の様にも書けます。

printと内包表記の組み合わせ(2)
[print(i) for i in iterable]

ですが(2)は個人的にはNGと思っています。
コードの1文が、例えばlist()という空シーケンスの宣言と同様に
冗長記載になってしまうからです。 
どうしても書きたいのであれば_=で受けるべきだと思います。

追記:とある有識者にも意見を求めた所
「オブジェクトを生成する」という目的のリスト内包表記において
print関数の「標準出力」という副作用そのものが目的になってしまっている事が
シンプルに気持ち悪い、との事でした。

(2)がNGの理由(モジュール内での記載)
#printの為だけに内包表記を使うのは、言わば空シーケンスの宣言と同じ。
[print(i) for i in iterable]
list()
# どうしても書きたいならこう。でも無理があるから(1)で十分。
_ = [print(i) for i in iterable]
(2)がNGの理由(Pythonコンソール)
# Pythonコンソールで実行すると、Noneのリストが出力されます。
# printの返り値はNoneなので。
>>>[print(i) for i in range(3)]
0
1
2
[None, None, None]
# _で受ければNoneのリストは表示されなくなるけど、長くない?
>>>_ = [print(i) for i in range(3)]
0
1
2

iterableとして適切(然るべき)なオブジェクト

例えば、itertoolsのイテレータ。
でもlist()で代替できるのでコード量的にはlist()の方がベター。
(じゃあ適切ではないね!)

>>>import itertools
>>>p = itertools.permutations([i for i in range(3)])
>>>print(p)
<itertools.permutations object at 0x03AAF3C0>
>>>print([i for i in p])
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
# ただしiteratorを使い果たしてしまうので2度は実行できない。
>>>print([i for i in p])
[]
>>>
# list()で代替できる (こっちの方がよくない…?)
>>>q = itertools.permutations([i for i in range(3)]) 
>>>print(q)
<itertools.permutations object at 0x05AAB900>
>>>print(list(q))
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]

例えば、シーケンス型の表示フォーマットの変更。

>>>hoge = [for i in range(16)]
>>>print(*[f'{i:04b}' for i in hoge])
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
>>>print(*[f'{i:04o}' for i in hoge])
0000 0001 0002 0003 0004 0005 0006 0007 0010 0011 0012 0013 0014 0015 0016 0017
>>>print(*[f'{i:04x}' for i in hoge])
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f
>>>print(*[f'{i*0.01:.1%}' for i in hoge])
0.0% 1.0% 2.0% 3.0% 4.0% 5.0% 6.0% 7.0% 8.0% 9.0% 10.0% 11.0% 12.0% 13.0% 14.0% 15.0%

iterableとして不適切(冗長)なオブジェクト

例えば、型の内包表記がインタプリタでサポートされているもの、
つまり、シーケンス型(list)、集合型(set)、マッピング型(dict)をまんま出す場合。
記載としては間違いではないですが冗長です。

>>>hoge = [i for i in range(3)]
>>>print([j for j in hoge])
[0, 1, 2]
# わざわざ内包表記を使わずとも結果は変わりません
>>>print(hoge)
[0, 1, 2]

以上。
(適宜追加予定)

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What is going on with this article?