Help us understand the problem. What is going on with this article?

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]

以上。
(適宜追加予定)

Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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