ユーザ用ツール

サイト用ツール


it技術:python

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
it技術:python [2022/04/05 17:48] – [Pyhon] yajuadminit技術:python [2022/04/22 10:31] (現在) yajuadmin
行 1: 行 1:
-====== Pyhon ======+====== Python ======
 C#で作成したものをPythonに移植する上で調査したメモ\\ C#で作成したものをPythonに移植する上で調査したメモ\\
-Visual Studio 2022を使用\\+Visual Studio 2022を使用するも、途中で拡張機能が充実しているVisual Studio Codeに変更した。
  
- +===== Visual Studio関連 ===== 
-===== Tips ===== +==== Visual Studio上でUTF-8にして保存したい =====
-==== Visual Studio上でUTF-8にして保存したい ====+
 Visual StudioでPythonファイルを保存するとShift-JISになりデバッグエラーになってしまう。\\ Visual StudioでPythonファイルを保存するとShift-JISになりデバッグエラーになってしまう。\\
 UTF-8で保存できるようにしたい。 UTF-8で保存できるようにしたい。
行 26: 行 25:
  
 [[https://docs.microsoft.com/ja-jp/visualstudio/ide/reference/how-to-display-line-numbers-in-the-editor?view=vs-2022|エディターで行番号を表示する]] [[https://docs.microsoft.com/ja-jp/visualstudio/ide/reference/how-to-display-line-numbers-in-the-editor?view=vs-2022|エディターで行番号を表示する]]
 +
 +===== Visual Studio Code関連 =====
 +==== 環境構築 ====
 +
 +  * [[https://www.kkaneko.jp/tools/win/vscodepro.html|Visual Studio Code で Python プログラミング(Windows 上)]]
 +  * [[https://note.kiriukun.com/entry/20220226-creating-python-project-with-windows-and-vscode-pipenv|Windows + VSCode + pipenv でPythonの開発環境を作る]]
 +==== 拡張機能 ====
 +[[https://yurupro.cloud/767/|【2022年最新版】VSCodeをPython超特化型にする、最高の拡張機能20選まとめ。 【VisualStudio Code】【プラグイン】]]
 +
 +下記の拡張機能をインストール
 +
 +  * indent-rainbow
 +  * ZenKaku
 +  * Trailing Spaces
 +  * Python Indent
 +  * Python Docstring Generator
 +
 +===== コーディング関連 =====
 +==== コーディング規約 ====
 +PEP(Python Enhancement Proposal)の中で、PEP 8は「Style Guide for Python Code」と銘打ち、Pythonのコードを記述する際の基本的なコーディングスタイルを定めている。
 +
 +  * [[https://qiita.com/naomi7325/items/4eb1d2a40277361e898b|Python命名規則一覧]]
 +  * [[https://atmarkit.itmedia.co.jp/ait/articles/1912/10/news045.html|[Python入門]Pythonコーディングスタイルガイド]]
  
 ==== main関数の書き方 ==== ==== main関数の書き方 ====
行 42: 行 64:
  
 [[https://yu-nix.com/blog/2021/6/25/python-main/|Pythonのmain関数の書き方をわかりやすく解説]] [[https://yu-nix.com/blog/2021/6/25/python-main/|Pythonのmain関数の書き方をわかりやすく解説]]
-==== コーディング規約 ==== 
-[[https://qiita.com/naomi7325/items/4eb1d2a40277361e898b|Python命名規則一覧]] 
  
-=== コメント記載方法 ===+==== fromやimportの基礎 ==== 
 +[[https://techacademy.jp/magazine/23818|Pythonのfromやimportの基礎を現役エンジニアが解説【初心者向け】]] 
 +==== コメント記載方法 ====
 Google Styleを採用 Google Styleを採用
  
行 65: 行 87:
 </code> </code>
  
-=== 定義変数 ===+==== 定義変数 ====
 <wrap em>Python には、C/C++ の const のような、定数を定義するためのキーワードは用意されていません。 <wrap em>Python には、C/C++ の const のような、定数を定義するためのキーワードは用意されていません。
 </wrap> </wrap>
行 89: 行 111:
 </code> </code>
  
-==== 自作クラスで'module' object is not callable エラー ==== +==== 文字列の囲み ==== 
-原因importの書き方が間違っているから\\ +Python で、単一引用符 ' で囲まれた文字列と、二重引用符 " で囲まれた文字列は同じです。\\ 
-以下の書き方だとエラーになる。+PEP 8では、どちらを推奨すかの立場は示しません
  
-<code python> +C#からの移植なので、二重引用符(ダブルクォーテーション)をベースとする。 
-import myClass + 
-myInstance myClass() +=== 文字列の長さ取得 === 
-</code>+C#の用に文字列のメソッドになっていない。
  
-下の書き方に修正すると動く。 
 <code python> <code python>
-from (myClassのファイル名) import myClass +✕ "abc".Length 
-myInstance = myClass()+ 
 +◯ len("abc")
 </code> </code>
  
-[[http://mynetabook.blogspot.com/2018/10/importtypeerror-module-object-is-not.html|[トラブル] 自作クラスのimport時にTypeError: 'module' object is not callableになる]]+[[https://methane.hatenablog.jp/entry/20090702/1246556675|len が関数になってい理由]]
  
-==== クラス内のメソッドを別のメソッド内で呼ぶ ==== +==== switch case文はない ==== 
-クラス内のメソッを別のソッド内で呼ぶと「name 'xxx' is not defined」エラーなる\\ +Pythonにswitch文が実装されない理由として、公式キュントは以下のように記述されています。 
-関数順序は係ない、クラス内メソッド第1引数必ずselfを付け、self.xxx 呼び出必要があった。+>if… elif… elif… else 繰り返しで簡単に同じことができます。switch 文の構文にする提案がくつかありましたが範囲判定をするべきか、あるいはどようにするべきかについて合意は (まだ) 得られていません。 
 +[[https://docs.python.org/ja/3/faq/design.html?highlight=switch%23why-isn-t-there-a-switch-or-case-statement-in-python#why-isn-t-there-a-switch-or-case-statement-in-python|Python に switch や case 文がないのはなぜですか?]]
  
-Pythonはメソッド第一引数は「self」必須でり、自身のクラスのインスタンスを受け取るとコーディング規約決まているらしい。\\ +If文を駆使すること同様処理行えるため、議論こそったようすが実装はされなかたようです。\\ 
->Pythonのメソッド引数に書く「self」はば,他言語からのPython移民を中心にウザイ「キモイ」「消えてなくな」と攻撃の対象となることが多いのです。 +、Python3.10からはswitch文と同様の構文の「match文が導入さす。
-https://coreblog.org/ats/translation-of-why-explicit-self-has-to-stay/+
  
-  * [[https://teratail.com/questions/138900|pythonでのクラス内のメソッドを別のメソッド内で使う方法]] +[[https://camp.trainocate.co.jp/magazine/python-switch-case/|Pythonでswitch/case文がない?代用方法を!]]
-  * [[https://python.ms/self/|なんで self を書かないといけないの?]] +
-  * [[https://qiita.com/DataBridge/items/2580522199e407abd8df|Python3のメソッド(第一引数にself必須)とスタティックメソッド(引数不要)の違いを検証してみた]] +
-  * [[https://qiita.com/yaboxi_/items/70249bd5a977d614aa4c|Pythonにおける「self.クラス変数」のクラス変数・インスタンス変数の参照順]] +
- +
-==== コマンドライン引数の処理 ==== +
-[[https://atmarkit.itmedia.co.jp/ait/articles/2112/21/news025.html|[解決!Python]Pythonスクリプトに与えられたコマンドライン引数を処するに]] +
- +
-==== ファイル出力 ==== +
-[[https://atmarkit.itmedia.co.jp/ait/articles/2104/27/news021.html|[Python]エンコーディングを指定して、シフトJISなどのファイルを読み書きするには]] +
- +
-=== フォルダ未存在時作成 === +
-フォルダ名は、フルパスで指定すればいい。+
  
 +==== フォーマット書式 ====
 <code python> <code python>
-import os 
- 
-new_path = "demo_folder" 
-if not os.path.exists(new_path): 
-    os.mkdir(new_path) 
-</code> 
- 
-[[https://qiita.com/yusa0827/items/b70780c7ee38a8282375|Python フォルダの作成 既存かチェックあり]] 
-==== フォーマット書式 ==== 
-<code pyhon> 
 line = "{0}さんの身長は{1}cmです。{0}さんの体重は{2}kgです。".format("山田", 190, 105.3) line = "{0}さんの身長は{1}cmです。{0}さんの体重は{2}kgです。".format("山田", 190, 105.3)
 print(line) print(line)
行 145: 行 146:
  
 単純に左から順に一対一になっている場合は、以下のようにインデックス番号を省略できます。 単純に左から順に一対一になっている場合は、以下のようにインデックス番号を省略できます。
-<code pyhon>+<code python>
 line = "{}さんの身長は{}cmです。{}さんの体重は{}kgです。".format("山田", 190, 105.3) line = "{}さんの身長は{}cmです。{}さんの体重は{}kgです。".format("山田", 190, 105.3)
 print(line) print(line)
行 180: 行 181:
 %fはマイクロ秒なのでミリ秒にする。 %fはマイクロ秒なのでミリ秒にする。
  
-<code>+<code python>
 from datetime import datetime from datetime import datetime
  
行 189: 行 190:
  
 [[https://www.delftstack.com/ja/howto/python/python-datetime-milliseconds/|Python で DateTime をミリ秒単位の文字列に変換する]] [[https://www.delftstack.com/ja/howto/python/python-datetime-milliseconds/|Python で DateTime をミリ秒単位の文字列に変換する]]
 +==== 例外処理 ====
 +  * [[https://note.nkmk.me/python-try-except-else-finally/|Pythonの例外処理(try, except, else, finally)]]
 +  * [[https://qiita.com/qqhann/items/5dbe38be94bd44b20937|Pythonの例外処理で例外の内容を知る]]
 +
 +=== 例外を発生させる ===
 +自作の例外を発生させるraiseの使い方
 +
 +  * [[https://uxmilk.jp/39845|Pythonで例外を発生させる:raise]]
 +  * [[https://www.delftstack.com/ja/howto/python/manually-raise-exceptions-in-python/|Python で手動で例外を発生させる]]
 +  * [[https://techacademy.jp/magazine/22124|Pythonで自作の例外を発生させるraiseの使い方を現役エンジニアが解説【初心者向け】]]
 +
 +=== catchした例外をそのまま親まで届ける ===
 +[[https://teratail.com/questions/292576|【python/例外処理】 catchした例外をそのまま親まで届ける方法はありますか?]]
 +
 +式を伴わなければ、 raise は現在のスコープで最終的に有効になっている例外を再送出します。
 +
 +<code python>
 +try:
 +  ...
 +except Exception as e:
 +  raise
 +そもそもraiseには例外インスタンスが渡せるので
 +</code>
 +<code python>
 +try:
 +  ...
 +except Exception as e:
 +  raise e  # ★
 +でもいいです。こちらだとTracebackに★の行の情報が加えられます。
 +except節の中でifの分岐などでraiseが2箇所以上現れるならこちらで。
 +</code>
 +
 +==== 配列およびリスト処理 ====
 +  * [[https://note.nkmk.me/python-split-strip-list-join/|Python, splitでカンマ区切り文字列を分割、空白を削除しリスト化]]
 +  * [[https://pyhoo.jp/python-list-change|Python list(リスト)の変更|追加・並替・更新など]]
 +  * [[https://note.nkmk.me/python-copy-deepcopy/|Pythonの浅いコピーと深いコピー: copy(), deepcopy()]]
 +
 +==== クラス内のメソッドを別のメソッド内で呼ぶ ====
 +クラス内のメソッドを別のメソッド内で呼ぶと「name 'xxx' is not defined」エラーになる。\\
 +関数の順序は関係ない、クラス内のメソッドの第1引数は必ずselfを付け、self.xxx で呼び出す必要があった。
 +
 +Pythonではメソッドの第一引数は「self」が必須であり、自身のクラスのインスタンスを受け取るとコーディング規約で決まっているらしい。\\
 +>Pythonのメソッド引数に書く「self」はしばしば,他言語からのPython移民を中心に「ウザイ」「キモイ」「消えてなくなれ」と攻撃の対象となることが多いのです。
 +>https://coreblog.org/ats/translation-of-why-explicit-self-has-to-stay/
 +
 +  * [[https://teratail.com/questions/138900|pythonでのクラス内のメソッドを別のメソッド内で使う方法]]
 +  * [[https://python.ms/self/|なんで self を書かないといけないの?]]
 +  * [[https://qiita.com/DataBridge/items/2580522199e407abd8df|Python3のメソッド(第一引数にself必須)とスタティックメソッド(引数不要)の違いを検証してみた]]
 +  * [[https://qiita.com/yaboxi_/items/70249bd5a977d614aa4c|Pythonにおける「self.クラス変数」でのクラス変数・インスタンス変数の参照順]]
 +
 +
 +===== 自作クラスで'module' object is not callable エラー =====
 +原因はimportの書き方が間違っているから\\
 +以下の書き方だとエラーになる。
 +
 +<code python>
 +import myClass
 +myInstance = myClass()
 +</code>
 +
 +下の書き方に修正すると動く。
 +<code python>
 +from (myClassのファイル名) import myClass
 +myInstance = myClass()
 +</code>
 +
 +[[http://mynetabook.blogspot.com/2018/10/importtypeerror-module-object-is-not.html|[トラブル] 自作クラスのimport時にTypeError: 'module' object is not callableになる]]
 +
 +
 +===== コマンドライン引数の処理 =====
 +[[https://atmarkit.itmedia.co.jp/ait/articles/2112/21/news025.html|[解決!Python]Pythonスクリプトに与えられたコマンドライン引数を処理するには]]
 +
 +===== ファイル関連 =====
 +==== パス操作 ====
 +<code python>
 +import os
 +
 +filepath = r"C:\temp\Image.bmp"
 +
 +# ファイル名 os.path.basename()
 +print(os.path.basename(filepath))       # 'Image.bmp'
 +
 +# フォルダ名 os.path.dirname()
 +print(os.path.dirname(filepath))        # 'C:\temp'
 +
 +# 拡張子の取得 os.path.splitext()
 +print(os.path.splitext(filepath)[1])    # '.bmp'
 +
 +# 拡張子なしのパス os.path.splitext()
 +print(os.path.splitext(filepath)[0])    # 'C:\temp\Image'
 +
 +# 拡張子なしのファイル名 os.path.basename(), os.path.splitext()
 +print(os.path.splitext(os.path.basename(filepath))[0])    # 'Image'
 +
 +# ルートディレクトリ os.path.splitdrive()
 +print(os.path.splitdrive(filepath)[0])  # 'C:'
 +</code>
 +
 +[[https://imagingsolution.net/program/python/python-basic/get_file_name_extension_etc/|【Python/os】パスからファイル名、拡張子、フォルダ名などを取得する]]
 +
 +==== ファイル読み書き ====
 +[[https://atmarkit.itmedia.co.jp/ait/articles/2104/27/news021.html|[解決!Python]エンコーディングを指定して、シフトJISなどのファイルを読み書きするには]]
 +
 +==== フォルダ未存在時作成 ====
 +フォルダ名は、フルパスで指定すればいい。
 +
 +<code python>
 +import os
 +
 +new_path = "demo_folder"
 +if not os.path.exists(new_path):
 +    os.mkdir(new_path)
 +</code>
 +
 +[[https://qiita.com/yusa0827/items/b70780c7ee38a8282375|Python フォルダの作成 既存かチェックあり]]
 +
 +===== HTTP クライアント =====
 +urllibライブラリーを使用する。
 +
 +  * [[https://qiita.com/hoto17296/items/8fcf55cc6cd823a18217|Python の HTTP クライアントは urllib.request で十分]]
 +  * [[https://atmarkit.itmedia.co.jp/ait/articles/1910/15/news018.html|[Python入門]urllib.requestモジュールによるWebページの取得]]
 +  * [[https://docs.python.org/ja/3/howto/urllib2.html|urllib パッケージを使ってインターネット上のリソースを取得するには]]
 +  * [[https://dev.classmethod.jp/articles/python-urllib-examples/|urllibだけである程度HTTPリクエストを頑張る]]
it技術/python.1649148490.txt.gz · 最終更新: 2022/04/05 17:48 by yajuadmin