それでは下記の記事の続きをやっていこう!
👇前回までは<オブジェクト指向編>ということでオブジェクト指向の概念、クラス、クラス継承などPythonを理解する上で最も重要なことを学習してきました。
【Python6】pythonの文法⑤
今回は<StyleGuide指向編>になります。Pythonコードを実装する上での書き方の決まりごとや標準のルールを学習することで、他の人が理解できるコードが書けるようになります。
難解なコードよりも”綺麗なコード”が書けるように一緒に勉強していこう🤓
Contents
StyleGuideとは
✔️Pythonのコードを書く上での書き方や決まりごと(命名規則etc)
✔️コードの書き方を標準化することで可読性の高いコードを実装できるようになる
✔️共通したルール(PEP8)があるので、それに従って書く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# 変数の定義(変数と代入する値の間にはスペースを入れる) x = 1 y = 2 # wrong xxx = 1 y = 2 # 関数の引数の「=」にはスペース不要 def complex(real, imag=0.0): return magic(r=real, i=imag) # wrong def complex(real, imag = 0.0): return magic(r = real, i = imag) # operatorの周りにスペースを一つ入れる x = x + 1 x += 1 x = x*2 - 1 c = (a+1) * (a-1) # wrong x=x+1 x +=1 x = x * 2 - 1 c = (a + 1) * (a - 1) # カンマの後ろにはスペースをいれる range(1, 11) a = [1, 2, 3, 4] # wrong range(1,11) a=[1,2,3,4] # カンマの後に綴じカッコがある場合はスペース不要 foo = (0,) # wrong foo = (0, ) # listやdict,setの最後の要素の後ろにもカンマを入れる FILES = [ 'aaa', 'bbb', 'ccc', # ←カンマを入れる ] # '\'で区切って改行する print("この中が文章みたいになっているとして、かなり長くなってしまったりする場合は、\ バックスラッシュで区切ることができます") a = 1000000000000 \ + 10000000000000 \ # 演算子が先頭にくるように書く + 100000000000 \ + 100000 \ + 1000 \ + 10 |
関数の書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 行の折り返し def log_function_name(var_one, var_two, var_three, var_four): #変数の頭文字が揃うように折り返す def log_function_name( var_one, var_two, var_three,var_four): # 最初から改行する # wrong foo = log_function_name(var_one, var_two, var_three,var_four) # 関数間は2行空ける def func(): pass def func2(): pass class内の関数間は1行でOK class MyClass: def __init__(self): pass def method(self): pass |
importの書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# importはコードの一番上に書く import os import sys # wrong import os, sys # まとめて書かない # fromから始まる場合は、まとめて書いてOK from subprocess import Popen, PIPE # importを書く順番 # 1. Standard Library(time, sys) # 2. Third party(numpy, pandas) # 3. Our Library(チーム間等で共通するライブラリ) # 4. Local Library(開発者個人で作成したライブラリ) # 1~4の各間は1行空ける # absolute import(絶対パス)でなるべく書く import mypkg.sibling from mypkg import sibling from mypkg.sibling import myfunc |
コメントの書き方
✔️”Command + /“でコメントアウトすることが出来る
✔️コメントは常に最新版となっていることを確認しておく
✔️英語で書くのが好ましい
✔️コメントは文章になっていること(意味が通っている文章を書く)
✔️#に半角スペースを入れてから書き出す
✔️インラインコメントの場合は、コードの一番後ろの後に半角スペースを2つ入れて#を書く
✔️Docstringは基本的に全てのmodule, functionm class, methodにつける(non public関数は不要)
✔️コメントはWhat何を書いているかを書くのではなく、Why なぜそう書ているかを表現する
命名規則(name convention)
✔️変数名、関数名 : snake_case(小文字や数字を_で繋ぐ)で書いていく ex.) car_drive, func_1
✔️クラス名 : CamelCase(各々の単語の頭文字を大文字にする)で書いていく ex.) Car, MyClass
✔️モジュール名、パッケージ名 : 短いlower caseかsnake_caseで書く ex.) time, numpy
✔️internal use only(non public)としたい時は_xxx(ex. _nonpublic)
✔️予約語 : Pythonで既に使われている単語を使いたい時は、xxx_とする(ex. type_)
✔️クラスの属性を名前修飾したい時は_ _xxxとする(ex. __name)
✔️_ _ xxx_ _はmagic methodでPythonが特別に設定しているもので、開発者が定義することはない
✔️l, U, 0などの一文字の変数は見間違えやすいので、使わない
✔️Constants(宣言後変更しない変数)は、大文字のsnakecaseを使う(ex. PI = 3.14)
returnとifの書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# Returnの決まり def foo(x): if x >= 0: return math.sqrt(x) # 平方根 # else以降書かなくても問題ないが、StyleGuideに従って書く else: return None # オブジェクトタイプの確認はisintance()を使う # correct if isinstance(obj, int): # wrong if type(obj) is type(1): # Booleanに比較演算子は使わない bool_var = True # correct if bool_var: #wrong if bool_var == True: # type hint(型を指定する書き方) # 一つhintを付けたら、全てにつける def greeting(name:str) -> str: return "Hello," + name |
Linter(StyleGuideに沿ったコードになっているか確認するライブラリ)
✔️サードパーティライブラリでチェック可能⇨pycodestyle, pyflakes, flake8, pylint
・Stylistic Lint ⇨ import os, sys ex.) 1行で2つのモジュールをimportしているよーー
▶️代表的なlinter: pycodestyle(*元pep8)
・Logical Lint ⇨ impot os, sys ex.)sys:使われていないモジュールがimportされてるよーー
▶️代表的なlinter: pycflakes
✔️pycodcestyleとpyflakesのラッパーライブラリ: flake8
✔️flake8より厳しいlinter: pylint
linterの使い方
✔️ pipを使ってインストール(pip install <library name>)
✔️ pylint <python script>で実行
✔️ 使用頻度の高いオプション
- -show-source : 問題のある箇所のコード表示
- -show-pep8 : 該当するpep8の情報を表示する
- -statistics : 統計のみ表示(通常-qqと併用)
1 2 3 |
<checktool.py> import os, sys print (x,y,z) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<Command> # pycodestyle, pyflakes, flake8, pylintインストール (venv) [~/PycharmProjects/StyleGuide] $ pip3 install pycodestyle pyflakes flake8 pylint # ==============installが開始される=================== # pycodestyle <python script>でlinterを実行 (venv) [~/PycharmProjects/StyleGuide] $ pycodestyle check_tool.py check_tool.py:2:10: E401 multiple imports on one line check_tool.py:4:6: E211 whitespace before '(' check_tool.py:4:6: E271 multiple spaces after keyword check_tool.py:4:32: E231 missing whitespace after ',' check_tool.py:4:34: E231 missing whitespace after ',' check_tool.py:4:37: W292 no newline at end of fil # pyflakes<python script>でlinterを実行 (venv) [~/PycharmProjects/StyleGuide] $ pyflakes check_tool.py check_tool.py:2:1 'os' imported but unused check_tool.py:2:1 'sys' imported but unused check_tool.py:4:31 undefined name 'x' check_tool.py:4:33 undefined name 'y' check_tool.py:4:35 undefined name 'z' # flake8 <python script>でlinterを実行 (venv) [~/PycharmProjects/StyleGuide] $ flake8 check_tool.py check_tool.py:2:1: F401 'os' imported but unused check_tool.py:2:1: F401 'sys' imported but unused check_tool.py:2:10: E401 multiple imports on one line check_tool.py:4:6: E271 multiple spaces after keyword check_tool.py:4:6: E211 whitespace before '(' check_tool.py:4:31: F821 undefined name 'x' check_tool.py:4:32: E231 missing whitespace after ',' check_tool.py:4:33: F821 undefined name 'y' check_tool.py:4:34: E231 missing whitespace after ',' check_tool.py:4:35: F821 undefined name 'z' check_tool.py:4:37: W292 no newline at end of file # pylint <python script>でlinterを実行 (venv) [~/PycharmProjects/StyleGuide] $ pylint check_tool.py ************* Module check_tool check_tool.py:4:0: C0304: Final newline missing (missing-final-newline) check_tool.py:1:0: C0114: Missing module docstring (missing-module-docstring) check_tool.py:2:0: C0410: Multiple imports on one line (os, sys) (multiple-imports) check_tool.py:4:30: E0602: Undefined variable 'x' (undefined-variable) check_tool.py:4:32: E0602: Undefined variable 'y' (undefined-variable) check_tool.py:4:34: E0602: Undefined variable 'z' (undefined-variable) check_tool.py:2:0: W0611: Unused import os (unused-import) check_tool.py:2:0: W0611: Unused import sys (unused-import) |
以上になります、いかがだったでしょうか?
体系的に学んだことがなかった方に関しては、参考にできる部分があったんじゃないでしょうか?
Pythonの勉強にリソースを多く割いてしまい、StyleGuideについて勉強したことない方は多いと思いますが、Pythonの標準化されているルールをしっかり押さえておくことで、誰が見ても読みやすい綺麗なコードが書けるようになります。
面倒臭いところはありますが、一度は勉強してみるのもいいんじゃないでしょうか😃
以上で文法編は終了になります✨①~⑥までとても長かったと思いますが、Pythonの文法に関しては全体の80%程はインプットされたんじゃないでしょうか◎
この後の学習で、最も大切になってくるのが、
これまで学んだことをいかにアウトプットできるかです。今まではインプットばっかりしてきましたが、この知識を正しい場所で正しくアウトプットできないと、今までの学習が水の泡ですよね。
もっと言うならば、いかに自分でアウトプットできる環境にいき、学び続けるかです。
自分でPythonで業務効率化のツールを作ってみる、機械学習ライブラリ(Numpy, Pandas, scikit-learn, Pytorch, etc)の勉強を続け、機械学習を使ってAIを実装してみる、Djangoを勉強してWebアプリケーションを作ってみる、何でもいいんです。
大事なのは自分がやりたいこと、興味ある分野をどんどん勉強してスキルを身につけることです。
このブログではそういったスキルを学び続けられる、筆者と一緒にモチベーション高く学習していけるような題材でどんどん投稿していきますので、楽しみにしててください。
まずは文法80%→100%にするために細かい知識を共有していこうと思います、それでは次回また会いましょう!
今回はこの辺で、ばいばい👋
コメントを残す