Python入門(2.制御フロー)です。
Python[完全]入門を参考に執筆しました。
構造化プログラミングも参照のこと。
Pythonでは、タブと空白のインデントでブロックを記述する。たとえば、if~else文は以下のようになる。
def hoge(x): if (x < 3): print(f"{x}は3より小さい") elif (x == 3): print(f"{x}は3と等しい") else: print(f"{x}は3より大きい") hoge(5) hoge(2) hoge(3)
字下げが文法に含まれるのは賛否両論があるが、必ずある程度美しいコードになる、ということで、Linux界でPythonはとても流行っている。
if文やfor文、def文やclass文などで、どこからがコードブロックや関数やクラスの続きであり、どこが終わりであるかは必ずインデントで指定する。また、慣習として、インデントは多くの場合半角スペース4つにすることになっている。
また、if文で複数の条件を分岐する時にはelifを使う。
後日注記:if文などの論理式を書く時は、等しいかどうか比較するには==を使う。大きさの比較には<, <=, >, >=などを使うほか、等しくないことを確かめたい時は!=を使う。また、and, or, notを使うことで論理演算も可能。型が一致するかどうかを確かめるにはisを使う。
後日注記:if文の中にif文を使う時はネストしてスペース8つでインデントすればよい。インデントの位置によってコードの意味が全く違うものになるので、ifとelseは必ず同じ位置にインデントを揃えなければならない。elifを使うこともできる。また、if文の中で何もすることがない時はpassを使って明示的に「ここは飛ばす」と書くこともできる。
Pythonのfor文は特殊で、
for ループ変数 in 反復可能なオブジェクト:
となる。
たとえば、
msg = 'Schwarz' for ch in msg: print(ch)
となる。ここでは反復可能オブジェクトは文字列で、文字のひとつひとつ全てに対して処理を行う。
文字列以外にも、リストなどからも反復できる。
animals = ["犬", "猫", "鳥", "牛"] for name in animals: print('わたしは' + name + 'です。')
このように、Pythonでは他の言語におけるforeach文と同じことをfor文で行える。
他の言語と同じように、回数を指定して繰り返すのであれば、range()関数を使う。
for x in range(10): print(f'{x + 1}:' + (' Hoge' * (x + 1)))
このコードでは、文字列を繰り返し連結する*演算子を使って、インデックス変数xの後に、' Hoge'をxの値だけ複数回連結した文字列を表示している。たとえば3回目なら'3: Hoge Hoge Hoge'となる。
ちなみに、C言語などでも使われるwhile文も使える。これには
while 条件:
とすればいい。条件が満たされる間、繰り返しをし続ける。
繰り返しを途中で抜けるのはbreak文、途中で処理を中断して次の繰り返しに行くにはcontinue文を使う。else節を使うことで繰り返し後に行いたい処理を書ける。
詳しくは以下を参照のこと。
Pythonのfor文はイテレータと結びつきが強い。いわば「for文はイテレータのための構文」であると言える。
詳しくはPython入門(関数型言語の機能)やイテレータとジェネレータも参照のこと。
2023.02.22
Pythonでは、辞書を以下のようにループさせると、キーだけを取り出す。
dct = {"human": "Assy", "robot": "Schwarz", "god": "Frey"} for k in dct: print(k)
上記の例ではkにキーが代入されるため、出力されるのは
human robot god
となる。値を代入したい場合は、
dct = {"human": "Assy", "robot": "Schwarz", "god": "Frey"} for k in dct: print(dct[k])
とする。あるいは、items()を使えば以下のような書き方もできる。
dct = {"human": "Assy", "robot": "Schwarz", "god": "Frey"} for k, v in dct.items(): print(f"I'm {k}, my name is {v}.")
他にも、keys()やvalues()などを使ってキーや値を取得することもできる。
Pythonではdefで関数オブジェクトを作成できる。
def ave2(x, y): return (x + y) / 2
呼び出す時は以下のようにする。
print(ave2(11, 34))
(以上はdef による関数オブジェクトの作成 - Python 入門を参考に執筆しました。)
後日注記:Pythonでは上から下へ順番にプログラムを実行するが、defで定義したメソッドは呼び出されるまで実行されない。またメソッド名の()の中に引数を書くことで、呼び出した時の具体的な値を関数の内部に渡すことができ、関数の内部でreturnを実行すると呼び出し元に戻り値を返すことができる。
関数も参照のこと。
別のファイルにある関数を使うには、importを使う。
まず、hoge_calc.pyを作って以下のように書く。
def print_calc(x, y): print(f"{x} + {y} = {x + y}") print(f"{x} - {y} = {x - y}") print(f"{x} * {y} = {x * y}") print(f"{x} / {y} = {x / y}")
次に、main.pyを作って次のように書く。
import hoge_calc hoge_calc.print_calc(10, 2)
関数において、
func(x=200, y=300)
のように引数を与えると、キーワード引数として引数の順序に関係なく、目的の引数に値を渡すことができる。
位置引数とキーワード引数を併用する場合、位置引数を左に、キーワード引数を右に書く。
また、関数定義の際、
def add100(x, y=100): return x + y print(add100(70))
のようにすることで引数にデフォルト値を設定できる。デフォルト値を設定した引数は、そうでない引数よりも右に書く。
また、**(アスタリスク2つ)を用いると、辞書のキーと値の関係を引数として与えることができる。
def ave2(x, y): return (x + y) / 2 arg1 = {'x': 200, 'y': 300} print(ave2(**arg1)) arg2 = {'x': 300, 'y': 500} print(ave2(**arg2))
アスタリスクがひとつ(*)の場合は、リストを引数として与えることができる。
def ave2(x, y): return (x + y) / 2 print(ave2(*[200, 300]))
また、関数定義の方に*あるいは**を付けた場合、可変長引数として値を受け取れる。タプルとして受け取る場合は*、辞書として受け取る場合は**とする。
def ave(*arg): x = 0 for v in arg: x = x + v return x / len(arg) print(ave(100, 200, 300))
Pythonでは、エラー処理のために例外を使うことができる。
例外はraiseで自分で投げることもできる。キャッチしなかった場合は、その場で強制終了になる。
例外をtry ~ exceptでキャッチした場合、tryブロックのどこかで例外が発生するとexceptブロックに強制的にジャンプし、exceptブロックの内容を実行した後で、その後の処理が行われる。
Pythonのエラーには構文エラーと例外の二種類があり、例外は必ずしも致命的とは限らない。そのため、例外をキャッチしてそのまま処理を継続することも多くある。
try: if d == 0: raise ZeroDivisionError except ZeroDivisionError as e: print(e)
後日注記:例外が発生しなかった場合に行う処理はelse節、例外が発生してもしなくてもどちらの場合も行う処理はfinally節に書ける。
2023.05.17編集
これは、そのスクリプトがコマンドラインで単独で実行された場合、__name__変数に__main__が代入されるので、その時に実行されることを意味している。要は、ライブラリとしてインポートされた場合ではなく、C言語のコマンドのようにコマンドラインから実行される時に実行される処理をここに書く。
最近のPythonには構造化パターンマッチングという機能がある。C言語でいうswitch-case文に相当する。