Help us understand the problem. What is going on with this article?

いまさらPython3(制御構造編)

はじめに

自分用のPython3として基本的な制御構造を記載する。正確性より実用性を重視する。
(Javaや.NETを主に使ってる自分が、Pythonを使うためのページです)
Python公式HPのPythonチュートリアルを独自の解釈し記載。
https://docs.python.org/ja/3/tutorial/index.html

データ構造については、いまさらPython3(データ構造編)へ

分岐

Pythonの分岐は、if文のみである。CやJavaと違いswitch文がない。

if文

if 条件式1:
    …処理1…
elif 条件式2:
    …処理2…
else:
    …処理3…

条件式

比較演算子

比較演算の優先順位は全て同じ (ブール演算より高い優先順位)

演算子 意味
< より小さい
<= 以下
> より大きい
>= 以上
== (値が)等しい
!= (値が)等しくない
is オブジェクト(ID)が同一
is not オブジェクト(ID)が異なる
in シーケンスに値が存在する
not in シーケンスに値が存在しない
  • 比較演算子は連鎖可能(1<=a and a<=5は、1 <= a <= 5と書ける)
  • シーケンスオブジェクトは、先頭から順に比較し等価の場合は再帰的に比較する

ブール演算子

ブール演算を優先順位が高い順に、以下に記載

演算子 意味
not x 否定
and 積(短絡評価)
or 和(短絡評価)

繰り返し

繰り返しは、for文とwhile文の2種類

while文

while 条件式:
    …繰り返す処理…
else:
    …終了処理(breakで抜けたときは実行されない)…
whileの例
i = 0
while True:
    if i >= 5:
        break 
    i += 1
  • ループ(for文を含む)では、breakでループブロックを終了する
  • ループ(for文を含む)では、continueでループの残りを飛ばして次の反復を開始する
  • Pythonでは、ループ(for文を含む)にelseブロックがあるのが特徴的

for文

for 変数 in 反復可能オブジェクト:
    …反復処理…
else:
    …終了処理(breakで抜けたときは実行されない)…
forの例
for v in ['one', 'two', 'three']:
    print(v)
  • 数値の数え上げはrange()を利用する
    書式:range(終了値), range(開始値, 終了値, ステップ) *終了値は含まない
    例:for i in range(10): #例から、0から9まで数え上げる
  • シーケンスと位置インデックスを合わせて使いたいときは、enumerate()を利用する
    書式:enumerate(シーケンス)
    例:for i, v in enumerate(['one', 'two', 'three']):
  • 2つ以上のシーケンスを同時にループを書けるときは、zip()を使う
    書式:zip(シーケンス1, シーケンス2, ...)
    例:for q, a in zip(['name', 'age', 'hight'], ['hos20rl', '100', '180']):

ブロック

pythonの共通化・構造化する構造は、関数がベースである。
クラスはこの関数を最小限拡張して実装されるため、C++、Java、C#と比べて機能が弱い。

関数定義

def 関数名(仮引数名, 仮引数名, ...):
    ...処理...
    return 戻り値

値3 = 関数名(値1, 値2, ...)
関数の例
def func(a1, a2=10, a3=20):
    print("a1={} a2={} a3={}".format(a1, a2, a3))
    return a1 + a2 + a3

val = func(1, a3=5) 
print( "return={}".format(val))
  • 関数の内部で関数が定義できる
  • 引数の定義方法
    • デフォルト値の指定 書式:仮引数名=値
    • 位置引数のタプル化
      書式:*仮引数名
      例:def func(arg1, *args):
      これより後ろの借り引数は、キーワード引数のみしか指定できない
    • キーワード引数の辞書化
      書式:**引数名
      例:def func(arg1, **kwargs):
  • 関数の呼び出し方法
    • タプル化引数の関数を呼び出すのは、位置引数と同じ
    • 辞書化引数の関数を呼び出すのは、キーワード引数と同じ
    • 演算子を使って関数をコールすると、シーケンスをアンパックして引数を渡せる 例:range(args)

クラス定義

class クラス名(基底クラス, 基底クラス, ...):
    def __init__(self, ...):
        …初期化処理…
    def メソッド名(self, 仮引数名, 仮引数名):
        …処理…

obj = クラス名()
クラスの例
class Bird:
    def __init__(self, cry):
        self.__cry = cry
    def sing(self):
        print("Bird<<" + self.__cry)

class Suzume(Bird):
    def __init__(self):
        super().__init__("チュンチュン")

class Rooster(Bird):
    def __init__(self):
        super().__init__("コケコッコー")

b1 = Suzume()
b2 = Rooster()
for b in [b1, b2]:
    b.sing()
  • メソッドの第一仮引数は、クラスオブジェクトそのものが入る
  • メンバ変数はメソッド内で値を代入することで利用開始できる(PythonではJavaやC#と違い変数宣言はない)
  • メンバ変数はすべてパブリック(PythonにはJavaやC++などにあるアクセス修飾子がない)
  • メンバ変数のスコープは、派生クラスと基底クラスともに同じスコープになる
  • プライベートメンバは、先頭がアンダースコアにするのがPythonの慣例
  • __変数名(*)は、_classname__変数名 に置き換えられる(プライベートメンバの名前の衝突を防ぐため)
    (*)2つ以上のアンダースコアを前置し、後置のアンダースコアが1つ以下のもの
  • Pythonでは、クラス定義の外側でクラスの属性を後から追加・削除できる

例外処理

try-except文

try:
    ...例外が発生する可能性のある処理...
except EOFError as ex:
    ...例外が発生したときの処理...
except:
    ...すべての例外をキャッチする...
else:
    ...例外が発生しなかった場合実行(例外が発生したときは通らない)...
finally:
    ...例外が発生しても発生しなくても実行...
    ...(リソースの開放処理を書くことが多い)...
例外処理の例
try:
    (val1, val2) = (5.0, 0.0)
    ans = val1 / val2
    print("{}/{}={}".format(ans, val1, val2))
except ZeroDivisionError as ex:
    print("ゼロで割っちゃだめですよ。")
finally:
    print("割り算を終わります。")

raise文

raise文により例外の送出できる

raise 例外クラスのインスタンス
raise ←raiseの後ろに何もつけない場合、処理中の例外を再送出する
例外の送出の例
raise NameError('HiThere')
except NameError as ex:
    raise ex
except NameError:
    raise

with文

with文は、オブジェクトの使用終了後にクリーンアップを実行させられるために利用する

with コンテキストマネージャ as コンテキストマネージャの名前, ...:
    ...処理...
with文の例
with open("myfile.txt") as f:
    for line in f:
        print(line, end="")
  • コンテキストマネージャは、__enter__() と __exit__() を持つクラスを定義する
    __enter__()が初期化、__exit__()にクリーンアップ処理を定義

参考資料

演算子の優先順位

優先順位の高いものから順に記載

演算子 説明
(expressions...),
[expressions...],
{key: value...},
{expressions...}
式結合またはタプル表示、
リスト表示、
辞書表示、
集合表示
x[index],
x[index:index],
x(arguments...),
x.attribute
添字指定、
スライス操作、
呼び出し、
属性参照
await x Await 式
** べき乗
+x, -x, ~x 正数、負数、ビット反転
*, @, /, //, % 乗算、行列乗算、除算、切り捨て除算、剰余
+, - 加算および減算
<<, >> ビットシフト
& ビット演算(AND)
^ ビット演算(XOR)
| ビット演算(OR)
in, not in, is, is not, <, <=, >, >=, !=, == 所属や同一性のテストを含む比較
not x ブール演算(否定)
and ブール演算(積)
or ブール演算(和)
if -- else 条件式
lambda ラムダ式
= 代入演算子
hos20r1
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした