Open21

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

masaobluemasaoblue

10. 数値

# これでべき乗。他の言語にもあるけど使わないから忘れていた
5 ** 5

# これは普通の割り算
10 / 3
> 3.3333333333333335

# こっちは整数で返してくれる
10 // 3
> 3

# これでmathモジュールのドキュメントを見れる
# 便利そうだけど実際はネットで調べるかGPTに聞きそう
import math
print(help(math))
masaobluemasaoblue
>>> 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つ目の要素の手前まで というルールが、逆側探索の時にもそのまま適用されるようなイメージ

masaobluemasaoblue
  1. リストのコピー

id() はjavaで言うhashCode的なやつ(どこまで違いがあるかは知らない)

>>> a = [1, 2, 3]
>>> b = a
>>> id(a) == id(b)
True
masaobluemasaoblue

比較演算子を複数繋げて書けるらしい。これ地味に嬉しいな

>>> 1 < 2 < 3
True
>>> 1 < 3 < 3
False
masaobluemasaoblue

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

masaobluemasaoblue
  1. タプル型

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,)
masaobluemasaoblue

なるほど...間違えやすそうだけど、まぁ単品をタプルにしたいことはあんま無さそう

>>> a = ()
>>> a
()
>>> b = (1)
>>> b
1
>>> c = ('sample')
>>> c
'sample'
masaobluemasaoblue

37. 値が入っていない判定をするテクニック

(jsだけでなく)pythonもこの仕様なのか...この仕様で良いことがある理由がいまいち分からない

>>> True if 0 else False
False
>>> True if 1 else False
True

確かに0を特別扱いするかどうかってケースによるからどっちでも良いんだろうけど、個人的にはTrueであってくれた方が脳が理解しやすいんだよなぁ。変えられるものではないから覚えゲーではある

masaobluemasaoblue

って思ったけど、これは結構嬉しい気がする。
基本的に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
masaobluemasaoblue

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("これは通らない")
masaobluemasaoblue

麻雀の三面待ち出力するのに便利なやつだ

for i in range(2, 10, 3):
    print(i)

> 2
> 5
> 8
masaobluemasaoblue

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最高

masaobluemasaoblue

名前付きで引数を渡すのは キーワード引数 と呼ぶらしい

def kakezan(a: int, b: str) -> str:
    return b * a

print(kakezan(b="abc", a=3))
masaobluemasaoblue

51. デフォルト引数で気をつけること

デフォルト引数にそのまま配列(=たぶん参照渡しされるもの全般)を指定すると関数定義時点で生成された配列を使いまわしちゃうから注意が必要らしい。やりがち

def append(arr=[]):
    arr.append(1)
    print(arr)

append()
append()
append()

> [1]
> [1, 1]
> [1, 1, 1]
masaobluemasaoblue

辞書型を*で展開して渡すと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'>
masaobluemasaoblue

キーワード引数を ** 付きの引数で受け取ると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))
masaobluemasaoblue

直感通り書ける感じは良いなぁ

def sample(a: str, b: str):
    print(a, b)

sample(a=1, b=2)
sample(**{"a": 1, "b": 2})

> 1 2
> 1 2
masaobluemasaoblue

デコレータすげぇ...そしてCopilotも凄い。俺はもう不要かもしれない

# デコレータの定義
def deco(func):
    def wrapper():
        print('before')
        func()
        print('after')
    return wrapper

# デコレータをつけた関数の定義
@deco
def sample():
    print('sample')

# デコレータをつけた関数の実行
sample()