#author("2024-02-15T00:16:49+09:00","default:irrp","irrp")
#author("2024-03-11T01:52:26+09:00","default:irrp","irrp")
→Python関連Tips

#contents


*文法一般 [#w0c281b0]
-[[[Python] コードを簡潔に書ける代入式を学ぶ | DevelopersIO>https://dev.classmethod.jp/articles/python-assignment-expressions-study/]] 2024.1

-[[Pythonの構造的パターンマッチングのさらに便利なパターン紹介 | gihyo.jp>https://gihyo.jp/article/2024/01/monthly-python-2401]] 2024.1

-[[Pythonでハッシュ可能なものの整理 | DevelopersIO>https://dev.classmethod.jp/articles/python-hashable/]] 2023.12

-[[みんなのPython勉強会_LT枠_10_12__5分で理解するディスクリプタ.pdf - Speaker Deck>https://speakerdeck.com/tamtam0423/minnanopythonmian-qiang-hui-ltwaku-10-12-5fen-teli-jie-suruteisukurihuta]] 2023.10

-[[Pythonの罠10選 - Qiita>https://qiita.com/python_academia/items/c71fdd6c08c27a3cf2e0]] 2023.8
--罠1:アイテム1のタプルもカンマが必要
--罠2://を小数で使うと小数が返ってくる
--罠3: 代入はデータをコピーしない(オブジェクトを名前に束縛するだけ)
--罠4:浅いコピーと深いコピーが存在する
--罠5:同じオブジェクトを参照する時としない時がある
--罠6:デフォルト値は1回しか評価されない
--罠7:小数にはずれが生じる
--罠8:round関数は四捨五入ではない
--罠9:クラスのスコープは注意が必要
--罠10:ローカル変数は静的な名前解決をしている

-[[[ Python ] クラス変数とインスタンス変数 - Qiita>https://qiita.com/Topology/items/ddb501969f9f1e609681]] 2023.7

-[[Pythonのハマりやすいポイントを学ぶ問題集を作ってみた - Qiita>https://qiita.com/to-fmak/items/9d1be12713f38b8bd6fa]] 2023.6

-[[[初心者向け]Pythonのbytes型について初心者向けに書いてみた | DevelopersIO>https://dev.classmethod.jp/articles/python-bytes-newshiro/]] 2023.5

-[[JavaScript・Python・Swiftでは配列の挙動が違いハマった話 - Qiita>https://qiita.com/dachscafe/items/3593b30ad6768774346b]] 2023.4
--JavaScriptの配列は参照型であり、比較演算子を使うときはメモリ位置を参照する
--Pythonの配列も参照型ではあるが、比較演算子==を使う時は配列の要素と順番を見てくれる。isを使うと、メモリ位置を参照する。
--Swiftはそもそも配列が値型

-[[Pythonのヒアドキュメント - Qiita>https://qiita.com/ykhirao/items/c7cba73a3a563be5eac6]] 2017

-[[python - Boolean identity == True vs is True - Stack Overflow>https://stackoverflow.com/questions/27276610/boolean-identity-true-vs-is-true]] 2014
 >>> True is True
 True
 >>> True == True
 True
 >>> 1 is True
 <stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
 False
 >>> 1 == True
 True
 >>>

-[[ねぇPythonのその仕様,本当に理解してる?? - Qiita>https://qiita.com/Junya_Tsukuba/items/9f39f25499c519b145a7]] 2022.12

-[[【ショートコーディング】 Pythonで空のシーケンスを渡せない関数の周辺 - Qiita>https://qiita.com/yaneurao/items/8108f8e4945fc097f640]] 2022.11
-[[【ショートコーディング】Pythonの三項演算子の周辺 - Qiita>https://qiita.com/yaneurao/items/41b250a4eeb152d4c190]] 2022.11

-[[Python例外処理 - Qiita>https://qiita.com/imuimu/items/7f27d156dd0f6507803b]] 2022.9

-[[Pythonで文字列が数字か英字か英数字か判定・確認 | note.nkmk.me>https://note.nkmk.me/python-str-num-determine/]] 2018

-[[Pythonで本当に役立つ機能「アサーション」の使い方を解説!『Pythonトリック』から:CodeZine(コードジン)>https://codezine.jp/article/detail/12179]] 2020

-[[【Python】最初、混同してしまう「assert, except, raise」文について - Qiita>https://qiita.com/baby-0105/items/0e30348589fa0a9d2424]] 2022.6

-[[数式とPython式の対応関係をまとめてみた>https://qiita.com/wotsushi/items/fcd4b5edfab3d64e27f7]] 2018.7.8

-[[TensorFlowやChainerに興味があるけど、Python未経験の技術者が最低限知っておいた方がいい基礎文法まとめ>http://www.atmarkit.co.jp/ait/articles/1610/28/news027.html]] 2016.10.27

-[[pythonのアンダーバーこれなんやねん - Qiita>https://qiita.com/kiii142/items/6879cb065ad4c5f0b901]] 2022.1
-[[【Python】__name__とはなんだろな?|ゆうまるブログ>https://yumarublog.com/python/__name__/]] 2021.10
--モジュール名(完全修飾名)
--トップレベルで実行された場合は__main__


*Python 3.12 [#x2e6ff61]
-[[Pyhotn3.12の機能追加の深掘りをしてみた #Python - Qiita>https://qiita.com/hfslca7439/items/9d778684e75465ec42b5]] 2023.11

-[[【Python 3.12への道のり】3.10で実装された型機能など、魅力的な機能を正式リリースまでに使いこなす (1/5)|CodeZine(コードジン)>https://codezine.jp/article/detail/18356]] 2023.10

-[[Python3.12からPEP695-Type Parameter Syntax(型引数構文)が導入され、型変数を使ったクラスや関数の定義が大きく変わる - Qiita>https://qiita.com/junkmd/items/1aa7be17401cfebab92d]] 2023.7



*制御構造/for/if [#u5d9b4ad]
-[[【Python】イテレータが何となく分かる様になる - Qiita>https://qiita.com/babashoya/items/9d87bcca1541bd20ea4a]] 2023.9

-[[【Python】isinstanceをmatch/caseに置き換える - Qiita>https://qiita.com/valusun/items/29d208cff3976631f66a]] 2023.3

-[[【Python】ネスト構造の辞書をfor文を書かずに取得する(再帰関数) - Qiita>https://qiita.com/BUU-SAN/items/66d0da5c0230835bb18f]] 2023.2

-[[pythonのfor文で、現在何番目か知る時>https://teratail.com/questions/159366]] 2018
 for i, fruit in enumerate(fruits):
    if 条件:
        print(i, fruit)

--filter()を使う方法
 fruits = ['apple','banana','orange']
 
 it = filter(
    lambda kv: 'n' in kv[-1],  # 『nを含む』という仮の条件
    enumerate(fruits)
 )
 for i, fruit in it:
    print(i, fruit)

-for分で辞書のkey, value
 for k,v in dic.items():
   ...

-[[pythonのifはどうやってTrue/Falseを判定する?>https://qiita.com/aloabtshk/items/1cb9b3a277539ce773bb]] 2020.3

-[[Pythonのpass文の意味と使い方 | note.nkmk.me>https://note.nkmk.me/python-pass-usage/]] 2022.7
--passは何もしない



*リスト操作/内包表記など [#o848a3fd]
-[[【Python】リストの中に特定の要素があるか判定する処理はsetを使え #Python - Qiita>https://qiita.com/sekibouya/items/ecf86287dfcc9cbe74d7]] 2024.3

-[[Pythonでリストを多用しがちな新人に贈りたい、array/tuple/set/queueの魅力と使い分けフローチャート #Python - Qiita>https://qiita.com/fujine/items/42cddf1cd13aedc6c4b8]] 2024.2

-[[[Python]リストの最後から順に取り出す - Qiita>https://qiita.com/dys7/items/2a61bbf43cfacc53c17d]] 2021
--reverse()を使うのが楽
--または for i in range(len(a)-1, -1, -1):

-[[Pythonのリストに関する小技 - Qiita>https://qiita.com/akiyoshiii/items/1845de55c02a1cc25aab]] 2022.11

-[[Pythonのmap()でリストの要素に関数・処理を適用 | note.nkmk.me>https://note.nkmk.me/python-map-usage/]] 2021

-[[Pythonで辞書のリストを特定のキーの値に従ってソート | note.nkmk.me>https://note.nkmk.me/python-dict-list-sort/]] 2018



**内包表記 [#o64f72a0]
-[[Python 内包表記の限界: 複雑な処理と実行速度の関係 - Qiita>https://qiita.com/GuriTech/items/f2bba9dc306bb15793bf]] 2023.5

-2つのリストの内容比較
    # a_list にあって b_list にないもののリスト
    a_only_list: list[str] = [
        x for x in a_list if x not in b_list
    ]


-内包表記を使った文字列部分一致判定のサンプル
    # 学校種別を学校名から判定する
    # 学校種別 1:専門学校 2:大学 3:大学院 4:その他
    # 引数:school_name 学校名
    def get_school_type(self, school_name: str) -> str:
        # 以下のtuple内の文字列が含まれていた場合は大学院とする
        names: tuple[str, ...] = ("大学院",)
        if any([school_name.find(x) >= 0 for x in names]):
            return "3"
 
        # 以下のtuple内の文字列が含まれていた場合は大学院とする
        names: tuple[str, ...] = ("大学", "短大", "ユニバーシティ", "カレッジ", "国大")
        if any([school_name.find(x) >= 0 for x in names]):
            return "2"
 
        # 以下のtuple内の文字列が含まれていた場合は専門学校とする
        names: tuple[str, ...] = ("専門学校", "スクール", "学院", "学園")
        if any([school_name.find(x) >= 0 for x in names]):
            return "1"
 
        # 上記以外は その他"4"を返す
        return "4"

--any()は、引数に指定したリストの中に、条件に合うもの(Trueと評価できるもの=Truethyな値)があればTrueを返す関数
--find()は、引数に指定した文字列が、文字列内に含まれているかどうかを判定する関数


-[[[Python] for文処理が1行で書ける!素敵なリスト内包表記 - YoheiM .NET>https://www.yoheim.net/blog.php?q=20150702]] 2015
-[[Pythonの内包表記に再入門する | DevelopersIO>https://dev.classmethod.jp/articles/python-intro-list-comp/]] 2022.5
-[[【Python 入門】リスト内包表記について解説! | キカガクの技術ブログ>https://blog.kikagaku.co.jp/python_list_comprehensions]] 2022.3



*Enum [#nb533e00]
-コードと文字列の紐づけ(1)
 from enum import Enum
 
 class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
 
    @property
    def label(self):
        return ['赤', '緑', '青'][self.value - 1]

-コードと文字列の紐づけ(2)
 from enum import Enum
 
 class Color(Enum):
    RED = (1, "赤")
    GREEN = (2, "緑")
    BLUE = (3, "青")
 
    def __init__(self, num, label):
        self.num = num
        self.label = label
 
 #Color.RED.labelで"赤"、Color.GREEN.labelで"緑"、Color.BLUE.labelで"青"


-[[Python Enum ベストプラクティス - Qiita>https://qiita.com/Yusuke_Pipipi/items/d591743eb4b49837e061]] 2021
-[[enum 超まとめ python3.10 - Qiita>https://qiita.com/macinjoke/items/13aa9ba64cf9b688e74a]] 2017


*None(Nullではない) [#g7563126]
-[[「a is not None」と「not a is None」は違うのか - Qiita>https://qiita.com/junjis0203/items/25959074a8b642db7368]] 2018
-[[Python で変数が None かどうかを確認する | Delft スタック>https://www.delftstack.com/ja/howto/python/check-if-variable-is-none-python/]] 2021
-[[PythonのNoneの判定に==ではなくisを使う理由。同値性と同一性を解説します - Python学習チャンネル by PyQ>https://blog.pyq.jp/entry/Python_kaiketsu_181220_is_none]] 2018


*オブジェクト指向とクラス [#q8411d6f]
-[[pythonで考えるメタクラスとは? #Python - Qiita>https://qiita.com/slope-book/items/3319c357c1a092d9d841]] 2021

-[[【Python中級者への道】__call__でクラスインスタンスを関数のように呼び出す #Python - Qiita>https://qiita.com/ganyariya/items/27ade6b149728f6aae88]] 2019

-[[Python Magic Methods You Haven't Heard About | Martin Heinz | Personal Website & Blog>https://martinheinz.dev/blog/87]] 2022.12

-[[Pythonのクラスで__eq__などを汎用的に実装する - Qiita>https://qiita.com/adatchey/items/1f9acb3e2b66914a435b]] 2013

-[[Pythonの抽象クラス(ABCmeta)を詳しく説明したい - Qiita>https://qiita.com/TrashBoxx/items/7a76e46122191529c526]] 2020

-[[Pythonのクラスでカスタマイズできる特殊メソッド>https://zenn.dev/bluepost/articles/9324d623936afa]] 2021
--演算子オーバライド用の特殊メソッドなど

-[[Python classの使い方 - Qiita>https://qiita.com/disk131/items/99b3d0181b2d98752012]] 2021
-[[【初心者向け】Pythonクラス(class)のselfとは何か?実例でself有無の違いやエラーになる理由、役割をわかりやすく解説>https://prograshi.com/language/python/py-self-in-class/]] 2021
-[[【Python】propertyとついでにclassを完全に理解する - Qiita>https://qiita.com/Hanjin_Liu/items/16b1035e5cfdadb161af]] 2022.9
-[[Python Object Oriented Programming | Python 101 | Level Up Coding>https://levelup.gitconnected.com/python-object-oriented-programming-c74cecfc00f6]] 2022.7
-[[How Classes and Objects Work in Python - Earthly Blog>https://earthly.dev/blog/how-cls-obj-work-python/]] 2022.9
-[[Pythonのclassで値をvalidationする方法4選 - Qiita>https://qiita.com/abemaru/items/73b7fec59ed6e62569b1]] 2022.8
-[[python selfについてまとめる - Qiita>https://qiita.com/komekome111/items/9189a8b9250cc95fa4d3]] 2022.7

-[[【デザインパターン with Python】1-1. デザインパターンとは何か - サーバーワークスエンジニアブログ>https://blog.serverworks.co.jp/design-pattern-with-python-1-1]] 2022.11
-[[GOFデザインパターンをPythonで理解する ~ Creational Design Patterns編 ~ - Qiita>https://qiita.com/c0ridrew/items/7b39b003cbe5b8c06c96]] 2022.6


*関数、ラムダ式 [#t5075bde]
-[[python の yield。サクッと理解するには return と比較>http://ailaby.com/yield/]] 2019

-[[Python3.xのアスタリスク逆引き - Qiita>https://qiita.com/LouiS0616/items/1bbe0a9bb93054f6c380]] 2022.9
--関数に渡す引数の* ... リスト、タプルの中身を分解して渡す
--関数に渡す引数の** ... 辞書の中身をキーワード=値に分解して渡す。可変長のキーワード引数と併用し、渡す辞書はkeyを引数名、valueを引数の値としておく。

-[[Pythonで引数の型に応じて返り値の型を変えるには@overloadを使う - Qiita>https://qiita.com/suzuki_sh/items/0f05d3e6d3c4c6f12c26]] 2021

-[[Pythonで複数の返り値を返す - サーバーワークスエンジニアブログ>https://blog.serverworks.co.jp/2022/03/22/105718]] 2022.3
-[[【Python 入門】lambda (ラムダ式、無名関数)について解説! | キカガクの技術ブログ>https://blog.kikagaku.co.jp/python-lambda]] 2022.3
-[[【Python】引数が異なる関数を定義する方法【オーバーロード】|ゆうまるブログ>https://yumarublog.com/python/overload/]] 2020
-[[Python 3の美しい関数引数システム>https://qiita.com/raviqqe/items/ee2bcb6bef86502f8cc6]] 2017.11.12


**複数の戻り値と分割代入 [#a2d9f300]
-[[Python で複数の戻り値を返す方法 - Python の関数 - Python の基本 - Python 入門>https://python.keicode.com/lang/function-return-tuple.php]] 2022.9
--関数で複数の戻り値を返したときは内部的には1つのタプルになる
-[[PythonでJavaScriptの分割代入をどこまで再現できるかやってみた | I Was Perfect>https://tech.515hikaru.net/post/2020-01-13/]] 2020



*データ型/型ヒント [#oa68c1b7]
-[[【Python 3.12】型ヒント機能がいつの間にか進化していたので、慌ててキャッチアップする - ABEJA Tech Blog>https://tech-blog.abeja.asia/entry/python-312-typing-202402]] 2024.2

-[[Pythonで型定義にNamedTupleを使うのはやめたほうが良さそう>https://zenn.dev/ncdc/articles/bacfc0304f9294]] 2024.1

-[[TypeError: unsupported operand type(s) for |: 'type' and 'NoneType' &#183; Issue #371 &#183; tiangolo/typer &#183; GitHub>https://github.com/tiangolo/typer/issues/371]] 2023.12
-- 型の共有を示す | は3.10から有効なので、それ以前のバージョンでは下記のようなimport指定をすると行ける場合がある。
 from __future__ import annotations

-[[python の TypeVar を最もシンプルな例で理解する #Python - Qiita>https://qiita.com/Showy1/items/d0829f1bdc3d9c92277f]] 2021

-[[【Python】 拡張子が .pyi のファイルってなんだろ?|ゆうまるブログ>https://yumarublog.com/python/pyi/]] 2022
--mypy の型インターフェイスを指定するファイル

-[[【Python】`typing.NoReturn`の使いどころ - Qiita>https://qiita.com/junkmd/items/e79e4138ad4ea5be24eb]] 2023.6

-[[【Python】collectionsライブラリを活用しよう_3. deque - サーバーワークスエンジニアブログ>https://blog.serverworks.co.jp/python_library_collections_3]] 2022.10
-[[【Python】collectionsライブラリを活用しよう_2. OrderedDict - サーバーワークスエンジニアブログ>https://blog.serverworks.co.jp/python_library_collections_2]] 2022.10
-[[【Python】collectionsライブラリを活用しよう_1. namedtuple - サーバーワークスエンジニアブログ>https://blog.serverworks.co.jp/python_library_collections_1]] 2022.10

-[[2021年版Pythonの型ヒントの書き方 (for Python 3.9) | フューチャー技術ブログ>https://future-architect.github.io/articles/20201223/]] 2021
-[[Pythonの型を完全に理解するためのtypingモジュール全解説(3.10対応) - Qiita>https://qiita.com/nicco_mirai/items/5591c1c48b1422c324c9]] 2021

-[[Pythonのrangeによる連続する整数の生成と利用方法を具体的に解説! | ゴマフリーダムのPython教室>https://gomafree-tech.com/?p=2766]] 2024.1
-[[range型 | Python学習講座>https://www.python.ambitious-engineer.com/archives/198]] 2020
--range型はシーケンスの1種。for文で番目をこさえるときに使うことが多い

-[[【入門】Python を書く前に知っておきたいデータ型のあれこれ - Qiita>https://qiita.com/kissy24/items/40b511cee9b555b46691]] 2022.8

-[[Pythonの辞書(dict)をソートする方法まとめ | HEADBOOST>https://www.headboost.jp/python-how-to-sort-dict/]] 2022.7
-[[Pythonのdict()が特定の入力に対し非常に遅い件について - Qiita>https://qiita.com/Shirotsume/items/890afc81988c63ae9603]] 2022.5


**Pylance [#y15bdab4]
-[[【Python】可変長引数の型って何をつけたら良いの? - Qiita>https://qiita.com/kissy24/items/79fd3691bb77ec5ea2cb]] 2023.5

-[[[小ネタ] Pythonの型ヒントで特定の文字列のみ受け入れる型を定義する | DevelopersIO>https://dev.classmethod.jp/articles/python-typing-literal/]] 2022.10

-[[【Python】【上級者向け】型絞り込み(type-narrowing)を使ったガード節は`isinstance(a, B)`ではできるけど`type(a) is B`ではできない - Qiita>https://qiita.com/junkmd/items/d1d34cd167cf91f9c504]] 2022.9
-[[Pylance (type hints) の裏側を調べてみた - VisasQ Dev Blog>https://tech.visasq.com/2022/09/30/122111]] 2022.9
-[[[Python]PylanceのVS Code拡張機能をさっそく使ってみた。 - Qiita>https://qiita.com/simonritchie/items/33ca57cdb5cb2a12ae16]] 2020


* デコレータ [#q14f1617]
-[[[Python] 絶対わかるデコレータの説明 - Qiita>https://qiita.com/PuchiCorner/items/f8965940943819005c5f]] 2023.1

-[[Pythonの関数の引数と戻り値のログ出力をデコレータで部品化する(Google Cloud Functions) | DevelopersIO>https://dev.classmethod.jp/articles/python-decorator-log-gcf/]] 2022.11

-[[Python をデコってかわいくしよう! - Qiita>https://qiita.com/ikeday_jaga/items/0adcc1194d308b2059ab]] 2022.9

-[[Pythonのデコレータを使ってAWS Lambdaを圧倒的に読みやすくする - BIGLOBE Style | BIGLOBEの「はたらく人」と「トガッた技術」>https://style.biglobe.co.jp/entry/2022/02/09/080000]] 2022.2

-[[【Python】"@(アットマーク)"から始まる行はどういう意味?【デコレータ】 - Knowhow,Nohow>https://keymaso.com/programemory/python/decorator/]]  2021.12

-[[Pythonのデコレータってなんですか? と採用面接で聞かれて答えられなかった話>https://qiita.com/shitikakei/items/0d218c26d4d1bbede6b3]] 2021.3
--デコレータは関数を引数にとって、さらに新たな関数を返すcallable()のようなもの(呼び出し可能であり、関数を引数に取り、それに代わる新たな関数を返すもの)である。
--ここから転じて引数の関数の中身を変えずに、実行結果を修飾(語弊があるが感覚としては編集)することができる。

-[[Pythonのデコレータを理解するための12Step - Qiita>https://qiita.com/_rdtr/items/d3bc1a8d4b7eb375c368]] 2014


**contextmanager [#fc800c20]
-[[contextlib --- with 文コンテキスト用ユーティリティ &#8212; Python 3.11.0b5 ドキュメント>https://docs.python.org/ja/3/library/contextlib.html]]
-[[with 文と @contextlib.contextmanager が便利 - Qiita>https://qiita.com/QUANON/items/c5868b6c65f8062f5876]] 2017
-[[「実行時間を測定するために現在時刻を取得するコードで挟んで…というのをよく見るけど、Pythonならこういうコンテキストマネージャを書いておいた方が便利だと思う。途中で死ぬ以外のどういうコードの抜け方をしても必ず結果を報告してくれる。 https://t.co/W3yfHkWuet」 / Twitter>https://twitter.com/odashi_t/status/1606453676088123399]] 2022.12
--[[Python: context manager to measure elapsed time. &#183; GitHub>https://gist.github.com/odashi/03a4d7b1901fe6e5c40b208ab2010507]] 2022.12



* 例外処理 [#zea75836]
-[[[Python] 例外処理のやり方と、スタックトレース取得の実装方法 - YoheiM .NET>https://www.yoheim.net/blog.php?q=20190601]] 2019

-例外処理でトレースバックをログ出力したいとき 2022.12
 try:
    def hoge()
 
 except:
    import traceback
    s = traceback.format_exc()
    logger.error(s)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS