Pythonの基礎であるが、忘れがちなものを列挙しておく。
Pythonをコマンドプロンプトで実行する。
python -c コマンド [引数] ...
引数を受け取るようにするにはsysモジュールを使う。
import sys if __name__ == "__main__": for p in sys.argv: print(p)
エンコードの設定はファイルの先頭に以下のような記法で記述する。
#!/usr/bin/env python3.9 # -*- coding: cp1252 -*-
記法
raw文字列
文字エスケープとして認識しないように文字列を利用したい場合「raw文字列」として定義する。
>>> print("C:\n\some") C: \some >>> print(r"C:\n\some") C:\n\some >>>
for-else
forの条件式がfalseになったときelseブロックが実行される。breakでループを抜ける場合、条件式を判定しないためelseブロックの処理は実行されない。
for n in range(2,10): for x in range(2,n): if n % x == 0: print(n, "equals", x, "*", n//x) else: print(n, "is a prime number")
関数
関数における戻り値の仕様
- 関数内にreturnがない場合Noneを返却する
- 関数内にreturnがあり戻り値の記述がない場合はNoneを返す
- 関数内にreturnがあり戻り値の記述がある場合はその値を返す
引数のデフォルト値
デフォルト値を指定するには「引数名=値」で定義する
def xxx(args1,args2=2,args3="3"):
pass
デフォルト値の評価は一度しか行われないため、動的な変更はできない。
#デフォルト引数の仕様 arg=5として定義される i = 5 def f(arg=i): return arg if __name__ == "__main__": f() >>>5
def g(a,L=[]): """ 省略された場合の格納先リストは固定される """ L.append(a) return L if __name__ == "__main__": g(1) g(2) >>>[1] >>>[1, 2]
キーワード引数(名前付き引数)
g(3,L=[])
ディクショナリ型引数
def func(xxx, *arguments, **keywords):
print(xxx)
for arg in argments:
print(arg)
for key in keywords:
print(key)
if __name__ == "__main__":
func("aaa",1,2,3,4,aaa="aaa")
特殊引数
def f( post1, post2, /, post_or_keyword, * , key1, key2):
- 位置のみ引数はユーザに引数名を見せたくない場合に使用する。引数名に意味があまりない場合や順序を強制したい場合に有効。また、任意個数のキーワード引数を取得したい場合にも有効。
- キーワードのみ引数名に意味があるとき、明示することで関数宣言がより理解しやすくなるとき、引数の位置に頼ることを防ぎたいときに有効。
- APIについては引数名が将来変更されることで破壊的API変更となることを防ぐために位置のみ引数を使う。
def f(*args,sep="/"):
return sep.join(args)
この場合、*args形式の場合、仮引数はすべてキーワードのみ引数となる。
ディクショナリをキーワード引数として渡す
ディクショナリをキーワード引数として渡すには「**変数(**演算子の利用)」として関数に渡す。
d = {"a":1, "b":2}
def dict_to_keywords(a=0,b=0):
print(a)
print(b)
if __name__ == "__main__":
dict_to_keywords(**d)
>>>
1
2
lambda(ラムダ)式
lambdaキーワードによって、無名関数を定義することができる。
def wrap_func(n):
""" 引数の値をnに+xする関数を返却する関数 """
return lambda x: x+n
>>> f = wrap_func(100)
>>> f(1)
101
>>> f(2)
102
他には、sort関数に渡す関数をlambdaで定義するなどの用途がある。
p = {(1,"one"),(2,"two"),(3,"three")}
p.sort(key=lambda p: p[1])
print(p)
ドキュメンテーション文字列(docstring)
関数の説明はシングルクォーテーション「”’ ”’」ダブルクォーテーション「””” “””」で行う。
def my_function():
"""要約
1行開けてオブジェクトのコール方法や副作用を記述
"""
pass
print(my_function.__doc__)
関数注釈(関数アノテーション)
関数の__annotations__属性にディクショナリとして格納される。引数注釈は引数名の後に「コロン:式」と続けることで定義する。
def annotation(a: str, b: str = "b") -> str:
print(f.__annotations__)
return a + b
コーディングスタイル
PEP8
コーディングをする際に、他者が読みやすいルールを設けておくことで、メンテナンス向上やチーム開発での余計なレビューが削減されるであろう。公式のコーディングルールPEP8を参考にするのがよい。
例)
- インデントはスペース4つ
- 79文字以下で行を折り返す
- 関数やクラスで大き目のブロックを分離するためには空白行を使う
- コメント行はできるだけ独立させる
- docstringを使う
- カンマのうしろはスペースを入れる … a,b
- カッコのすぐ内側ではスペースを入れない … f(a, b)
- クラス名は「大文字キャメルケース(ClassName)」メソッド名は「小文字スネークケース(method_name)」
- エンコーディングは「UTF-8」「ASCⅡ」を利用する
データ構造
リスト
- list.append(x):リストの末尾にアイテムを1つ追加する。a[len(a):] = [x]と等価。
- list.extend(iterable):末尾に反復可能隊(iterable)の全アイテムを追加する。a[len(a):] = iterableと等価。
- list.insert(i, x):指定されたアイテムを挿入する。list.insert(0, x)でリストの先頭に挿入される。list.insert(len(a), x)はa.append(x)と等価。
- list.remove(x):値がxに等しい最初のアイテムを削除する。そのようなアイテムがない場合はValueErrorを生成する。
- list.pop([i]):指定された位置のアイテムをリストから削除する。削除したアイテムを戻り値として返却する。インデックスが指定されていないと、リストの最後のアイテムを削除し、返却する。
- list.clear():リストからすべてのアイテムを削除する。del a[:]と等価。
- list.index(x[, start[, end]]):値がxに等しい最初のアイテムのインデックス(0始まり)を返す。そのような値がなければValueErrorを生成する。
- list.count(x):リスト内のxの個数を返す。
- list.sort(key=None, reverse=False):リストをインプレースで(=コピーを取らず、そのリストオブジェクトを直接)ソートする。
- list.reverse():リストの要素をインプレースで逆順にする。
- list.copy():リストのシャローコピー(浅いコピー)を返す。a[:]と等価。
※[i]はオプションでiを指定しているという意味であり、[]が必要であるという意味ではない
リスト内法
リストの生成方法はlist()を使うこともできるが、リスト内法で書くことで簡略化された記述ができる
squares = list(map(lambda x: x**2, range(10)))
squares = [x**2 for x in range(10)]
del文
値を削除する記法だが、list.pop()と異なり、戻り値はない。
a = [1,2,3] del a[0] a = [1,2,3] del a
del文で削除した変数は参照できず、エラーとなる。
タプル
リストと異なり、immutable(不変体)オブジェクト。
# タプル・パッキング(タプル梱包) t = "Hello", "world","!" # タプル・アンパッキング(開梱) x,y,z = t