LoginSignup
66
42

More than 1 year has passed since last update.

リテラルに親を殺されたPython解説

Last updated at Posted at 2020-02-19

@Raclett3さんの
文字列と数値と真理値のリテラルに親を殺されたPythonプログラミング
がめっちゃ面白いな:raised_hands:と思うと同時に、何が起きているのか理解できなかったので調べてみました。
解説というか、自分のお勉強です。

おもに「小さな数値」の項目をつらつら書きます。
間違ってたらマサカリ投げてください。

0

int()  # 0

これは@Raclett3さんのリンクにもある通りです。

or return 0 if no arguments are given

引数が指定されていない場合は0を返す、そうです。
これは簡単。

1

len([()])  # 1

これはリストがその要素にタプルを1つ持っているので、lenで長さ1が返されるだけですね。
つまり下のような例だと何が起きているか分かりやすいでしょうか。

len([(), ()])  # 2
len([1, 2, 3])  # 3

2

len(((),()))  # 2

いやらしく全てタプルになっていますが、やっていることは1の外側のリストがタプルになっているだけです。
ちょっと空白を入れてやると分かりやすい。

len( ( () , () ) )  # 2
len( ( () , () , () ) )  # 3

3

len(hex(not()))  # 3

not()は元記事の@Raclett3さんの解説がめっちゃ分かりやすいのでそちらを。
少しずつ変形してみます。

len(hex(not()))

# ↓ not() == True

len(hex(True))

# ↓ True == 1

len(hex(1))

# ↓ hex()は引数を16進数の 文字列 に変換する。

len('0x1')  # つまり3!!

4

len(str(not()))  # 4

これは3が理解できると簡単ですね!
4文字のTrueをstr型にし、lenで長さを取得しています。

len(str(not()))

# ↓ not() == True

len(str(True))

# ↓ Trueが文字列に変換される。

len('True')  # 4!!

5

len(str(not[()]))  # 5

これは4のFalse版。

len(str(not[()]))

# ↓ not[()] == False

len(str(False))

# ↓ Falseが文字列に変換される。

len('False')  # 5

6

len(str(complex(not(),int())))  # 6

この辺から頭痛くなりますね:scream_cat:
complexは第一引数に実部、第二引数に虚部を取り、complex型の複素数を返します。
こちらも細かく見ていった方が分かりやすいと思います。

len(str(complex(not(),int())))

# ↓ not()はTrue、int()は0

len(str(complex(True, 0)))

# ↓ Trueは1

len(str(complex(1, 0)))

# ↓ 実部1、虚部1のcomplex型の複素数、(1+0j)が返る。

len(str((1+0j)))  # len( str( (1+0j) ) )

# ↓ (1+0j)をstr型にする。

len('(1+0j)')  # ()を含んだ6文字なので6が返る。

7

len(str(bytes(len(((),)))))  # 7

(((( ;゚Д゚)))
一瞬震えますが、よく見ると1をbytes型にしているだけ。
bytes型の文字列変換については、@Raclett3さんの記事にある通りこちらにサンプルコードもあります。

len(str(bytes(len(((),)))))  # bytesの中身は、len( ( (), ) )

# ↓ つまり要素数1のタプルの長さがbytesの引数になる。

len(str(bytes(1)))

# ↓ 1をbytes型にする。

len(str(b'\\x00')  # \\ はエスケープシーケンスなので1文字。

# ↓ b'\\x00'を文字列にしてその長さを得る。

len("b'\\x00'")  # 7!

8

len(str(((),())))  # 8

後半戦は()が多く見た目が複雑ですね...

len(str(((),())))  # len( str( ((),()) ) )

# ↓ 「空のタプルを2つ要素に持つタプル」がstr()の引数。

len('((),())')  # 要素数2のタプルがそのまま文字列に変換され、文字列の長さ8が返る。

9

len(str(([int()],[])))  # 9
len(str(((int()),())))  # 全部タプルにしたらやばい見辛い

ようやく最後です。
これは8と同じですね:bee:

len(str(([int()],[])))

# ↓ int() == 0

len(str(([0],[])))

# ↓ 8と同じくstrの引数は、([0],[])なので...

len('([0],[])')  # 9!!!

めちゃくちゃ長くなりましたが需要あったのだろうか。
こういう基本的なやつは普段ドキュメントを読んだりすることないので勉強するいい機会になりました。
@Raclett3さんに感謝。

66
42
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
42