pythonで自分が初めて知ったことをメモしていくだけのscrap

ひとまずこれを見てみることにした

10. 数値
# これでべき乗。他の言語にもあるけど使わないから忘れていた
5 ** 5
# これは普通の割り算
10 / 3
> 3.3333333333333335
# こっちは整数で返してくれる
10 // 3
> 3
# これでmathモジュールのドキュメントを見れる
# 便利そうだけど実際はネットで調べるかGPTに聞きそう
import math
print(help(math))

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> a[11:1:-5]
[12, 7]
>>> a[11:0:-5]
[12, 7, 2]
理解はできるけど直感的に分かるようになるには時間かかりそうな内容。(あまり重要ではなさそう)
添字2つ目の要素の手前まで
というルールが、逆側探索の時にもそのまま適用されるようなイメージ

- リストのコピー
id()
はjavaで言うhashCode的なやつ(どこまで違いがあるかは知らない)
>>> a = [1, 2, 3]
>>> b = a
>>> id(a) == id(b)
True

比較演算子を複数繋げて書けるらしい。これ地味に嬉しいな
>>> 1 < 2 < 3
True
>>> 1 < 3 < 3
False

余談だけどJavaScriptでこれやると両方trueになる。true < 3
も false < 3
もtrueだから左から順に判定した結果だと思われる。怖すぎた

- タプル型
readonlyなlist。カッコで囲わなくてもリテラルをカンマで区切ると勝手にタプルになるらしい。へー
>>> a = (1, 2, 3,)
>>> a
(1, 2, 3)
>>> b = 1, 2, 3
>>> b
(1, 2, 3)
>>> c = 1,
>>> c
(1,)
>>> d = (1, )
>>> d
(1,)

なるほど...間違えやすそうだけど、まぁ単品をタプルにしたいことはあんま無さそう
>>> a = ()
>>> a
()
>>> b = (1)
>>> b
1
>>> c = ('sample')
>>> c
'sample'

37. 値が入っていない判定をするテクニック
(jsだけでなく)pythonもこの仕様なのか...この仕様で良いことがある理由がいまいち分からない
>>> True if 0 else False
False
>>> True if 1 else False
True
確かに0を特別扱いするかどうかってケースによるからどっちでも良いんだろうけど、個人的にはTrueであってくれた方が脳が理解しやすいんだよなぁ。変えられるものではないから覚えゲーではある

って思ったけど、これは結構嬉しい気がする。
基本的にif文でempty/blankを判定する時にシンプルに書けるように設計されてるってことなのかな。上の仕様とも統一されている感じがあって好きかもしれない
>>> True if [] else False
False
>>> True if [1, 2, 3] else False
True
>>> True if {} else False
False
>>> True if {"a": 1} else False
True

40. while else文
whileにelseなんて付けれるんだーと思ったけど使うことはあまり無さそう
count = 0
while count < 3:
if count == 3:
break
print(count)
count += 1
else:
print("これは通る")
count = 0
while count < 3:
if count == 2:
break
print(count)
count += 1
else:
print("これは通らない")

よく分からないけど↑のコードを記述するとpylintに怒られた。指摘の内容は変数名をUpper Caseにしろ、だったんだけど小文字のほうが正しいと思うので、.pylintrcで無効化した

麻雀の三面待ち出力するのに便利なやつだ
for i in range(2, 10, 3):
print(i)
> 2
> 5
> 8

railsで使えたzip関数が使える。別にそんなに使用頻度高いわけじゃないんだけどこの感じめっちゃ好きなんだよな
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
for i, j, k in zip(a, b, c):
print(i, j, k)
> 1 4 7
> 2 5 8
> 3 6 9
ファイルの先頭に zipを試す
ってコメント入れたらタブ補完だけで上記のコードが出力された。Copilot最高

pythonのdictは順序保持してくれるらしい。よかったね

名前付きで引数を渡すのは キーワード引数
と呼ぶらしい
def kakezan(a: int, b: str) -> str:
return b * a
print(kakezan(b="abc", a=3))

51. デフォルト引数で気をつけること
デフォルト引数にそのまま配列(=たぶん参照渡しされるもの全般)を指定すると関数定義時点で生成された配列を使いまわしちゃうから注意が必要らしい。やりがち
def append(arr=[]):
arr.append(1)
print(arr)
append()
append()
append()
> [1]
> [1, 1]
> [1, 1, 1]

辞書型を*で展開して渡すとkeysのタプルが渡る感じらしい
from typing import Tuple
def sample(*args: Tuple[str]) -> str:
print(args)
return args
a = sample(*{"a": 1, "b": 2})
print(type(a))
> ('a', 'b')
> <class 'tuple'>

キーワード引数を **
付きの引数で受け取るとdict型として扱えるらしい。何か便利な場所があるような気がした
from typing import Dict
def sample(**args: Dict) -> Dict:
print(args)
return args
a = sample(a=1, b=2, c=3)
print(type(a))

直感通り書ける感じは良いなぁ
def sample(a: str, b: str):
print(a, b)
sample(a=1, b=2)
sample(**{"a": 1, "b": 2})
> 1 2
> 1 2

デコレータすげぇ...そしてCopilotも凄い。俺はもう不要かもしれない
# デコレータの定義
def deco(func):
def wrapper():
print('before')
func()
print('after')
return wrapper
# デコレータをつけた関数の定義
@deco
def sample():
print('sample')
# デコレータをつけた関数の実行
sample()