Note: 「ポリモーフィズム」という言葉は「多様な形」という意味であり、プログラミングにおいては同じ名前のメソッド/関数/演算子が多くのオブジェクトやクラスで実行可能であることを指します。

関数のポリモーフィズム

異なるオブジェクトで使用できるPython関数の例としては、len() 関数があります。

文字列

len() は文字列の文字数を返します:

x = "Hello World!"

print(len(x))

タプル

len() はタプル内のアイテム数を返します:

mytuple = ("apple", "banana", "cherry")

print(len(mytuple))

辞書

len() は辞書内のキー/値ペア数を返します:

thisdict = {
  "brand": "Ford",
  "model": "Mustang",
  "year": 1964
}

print(len(thisdict))

クラスのポリモーフィズム

ポリモーフィズムはクラスのメソッドでよく使用され、複数のクラスで同じメソッド名を持つことができます。

異なるクラスで同じメソッドを持つ場合:

class Car:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Drive!")

class Boat:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Sail!")

class Plane:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Fly!")

car1 = Car("Ford", "Mustang")       # Car クラスのインスタンスを作成
boat1 = Boat("Ibiza", "Touring 20") # Boat クラスのインスタンスを作成
plane1 = Plane("Boeing", "747")     # Plane クラスのインスタンスを作成

for x in (car1, boat1, plane1):
  x.move()

上記の最後のforループを見てください。ポリモーフィズムのおかげで、すべてのクラスで同じメソッドを実行することができます。

継承クラスのポリモーフィズム

親クラス名が同じ子クラスを持つクラスでポリモーフィズムを使用できるでしょうか?

答えは「YES」です。上記の例を使用して、親クラスとしてVehicleというクラスを作成し、Car、Boat、PlaneをVehicleクラスの子クラスにすれば、子クラスはVehicleのメソッドを継承しますが、オーバーライドすることもできます:

Vehicleというクラスを作成し、Car、Boat、PlaneをVehicleクラスの子クラスにします:

class Vehicle:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Move!")

class Car(Vehicle):
  pass

class Boat(Vehicle):
  def move(self):
    print("Sail!")

class Plane(Vehicle):
  def move(self):
    print("Fly!")

car1 = Car("Ford", "Mustang")       # Car オブジェクトを作成
boat1 = Boat("Ibiza", "Touring 20") # Boat オブジェクトを作成
plane1 = Plane("Boeing", "747")     # Plane オブジェクトを作成

for x in (car1, boat1, plane1):
  print(x.brand)
  print(x.model)
  x.move()

上記の例では、Carクラスは空ですが、Vehicleからbrand、model、move()を継承しています。

BoatとPlaneクラスもVehicleからbrand、model、move()を継承していますが、move()メソッドをオーバーライドしています。

ポリモーフィズムのおかげで、すべてのクラスで同じメソッドを実行することができます。

Note: イテレータは数えられる値を含むオブジェクトです。

Python イテレータ

イテレータは、順次アクセス可能なオブジェクトであり、すべての値をトラバースできます。

技術的には、Pythonでは、イテレータはイテレータプロトコルを実装したオブジェクトであり、そのメソッドに __iter__()__next__() が含まれます。

イテレータ vs イテラブル

リスト、タプル、辞書、セットはすべてイテラブルオブジェクトです。これらはイテレータを取得できるイテラブルコンテナです。

これらのオブジェクトはすべて、イテレータを取得するために使用される iter() メソッドを持っています:

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)

print(next(myit))
print(next(myit))
print(next(myit))

文字列もイテラブルオブジェクトであり、イテレータを返すことができます:

mystr = "banana"
myit = iter(mystr)

print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

イテレータをループで回す

forループを使用してイテラブルオブジェクトをイテレートすることもできます:

mytuple = ("apple", "banana", "cherry")

for x in mytuple:
  print(x)

mystr = "banana"

for x in mystr:
  print(x)

forループは実際にはイテレータオブジェクトを作成し、各ループごとに next() メソッドを実行します。

イテレータの作成

イテレータとしてオブジェクト/クラスを作成するには、オブジェクトに __iter__()__next__() メソッドを実装する必要があります。

Pythonのクラス/オブジェクトの章で学んだように、すべてのクラスには __init__() 関数があり、オブジェクトが作成されるときに初期化を行うことができます。

__iter__() メソッドは似たような動作をしますが、操作(初期化など)を行うことができますが、常にイテレータオブジェクト自体を返さなければなりません。

__next__() メソッドも操作を行うことができ、シーケンス内の次のアイテムを返さなければなりません。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self

  def __next__(self):
    x = self.a
    self.a += 1
    return x

myclass = MyNumbers()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

StopIteration

上記の例は、十分な next() 文があれば永遠に続くでしょう。

無限に続くことを防ぐために、StopIteration 文を使用することができます。

__next__() メソッドで、指定された回数のイテレーションが終了した場合にエラーを発生させる終了条件を追加することができます:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self

  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
  print(x)

Note: 継承を使うことで、他のクラスからすべてのメソッドとプロパティを継承するクラスを定義することができます。

Python 継承

継承を使うことで、他のクラスからすべてのメソッドとプロパティを継承するクラスを定義することができます。

親クラスは継承元のクラスであり、ベースクラスとも呼ばれます。

子クラスは他のクラスから継承されるクラスであり、派生クラスとも呼ばれます。

親クラスの作成

どんなクラスでも親クラスになれるため、構文は他のクラスを作成する場合と同じです:

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname

  def printname(self):
    print(self.firstname, self.lastname)

Person クラスを使用してオブジェクトを作成し、その後 printname メソッドを実行します:

子クラスの作成

他のクラスから機能を継承するクラスを作成するには、子クラスを作成するときに親クラスをパラメータとして渡します:

class Student(Person):
  pass

Note: クラスに他のプロパティやメソッドを追加したくない場合は、pass キーワードを使用します。

これで Student クラスは Person クラスと同じプロパティとメソッドを持ちます。

x = Student("Mike", "Olsen")
x.printname()

__init__() 関数の追加

これまでに親からプロパティやメソッドを継承する子クラスを作成しました。

子クラスに親の __init__() 関数を追加したいと考えています(pass キーワードではなく)。

Note: __init__() 関数は、新しいオブジェクトを作成するたびに自動的に呼び出されます。

class Student(Person):
  def __init__(self, fname, lname):
    # プロパティなどを追加します。

親の __init__() 関数の継承を保持したい場合は、親の __init__() 関数を呼び出します:

class Student(Person):
  def __init__(self, fname, lname):
    Person.__init__(self, fname, lname)

これで __init__() 関数が追加され、親クラスの継承が成功し、__init__() 関数の機能拡張に備える準備が整いました。

super() 関数の使用

Pythonには super() 関数もあり、子クラスが親からすべてのメソッドとプロパティを継承するようにします:

class Student(Person):
  def __init__(self, fname, lname):
    super().__init__(fname, lname)

super() 関数を使用すると、親要素の名前を使用する必要はなく、自動的にメソッドとプロパティを継承します。

プロパティの追加

次に、Student クラスに graduationyear というプロパティを追加します:

class Student(Person):
  def __init__(self, fname, lname):
    super().__init__(fname, lname)
    self.graduationyear = 2019

次の例では、年を表す2019は変数として、Student クラスを作成するときに渡されるべきです。これを行うには、__init__() 関数に別のパラメータを追加します:

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year

x = Student("Mike", "Olsen", 2019)

メソッドの追加

Student クラスに welcome というメソッドを追加します:

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year

  def welcome(self):
    print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)

子クラスで親クラスの関数と同じ名前のメソッドを追加すると、親メソッドの継承が上書きされます。

Note: Pythonはオブジェクト指向プログラミング言語です。

Python クラス/オブジェクト

Pythonではほとんどすべてがオブジェクトであり、それぞれがプロパティとメソッドを持っています。

クラスはオブジェクトのコンストラクタのようなものであり、「オブジェクトを作成するための設計図」です。

クラスの作成

クラスを作成するには、キーワード class を使用します:

class MyClass:
  x = 5

オブジェクトの作成

今度は、MyClass というクラスを使用してオブジェクトを作成できます:

p1 = MyClass()
print(p1.x)

__init__() 関数

上記の例はクラスとオブジェクトの基本的な形であり、実際のアプリケーションではあまり役立ちません。

クラスの意味を理解するには、組み込みの __init__() 関数を理解する必要があります。

すべてのクラスには、クラスが初期化されるときに常に実行される __init__() 関数があります。

__init__() 関数を使用して、オブジェクトのプロパティに値を割り当てたり、オブジェクトが作成されるときに必要なその他の操作を行います:

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("John", 36)

print(p1.name)
print(p1.age)

Note: __init__() 関数は、クラスが新しいオブジェクトを作成するたびに自動的に呼び出されます。

__str__() 関数

__str__() 関数は、クラスオブジェクトが文字列として表現されるときに返す内容を制御します。

__str__() 関数が設定されていない場合、オブジェクトの文字列表現が返されます:

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("John", 36)

print(p1)

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def __str__(self):
    return f"{self.name}({self.age})"

p1 = Person("John", 36)

print(p1)

オブジェクトメソッド

オブジェクトはメソッドを含むこともできます。オブジェクト内のメソッドは、オブジェクトに属する関数です。

次に、Person クラスにメソッドを作成します:

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def myfunc(self):
    print("Hello my name is " + self.name)

p1 = Person("John", 36)
p1.myfunc()

Note: self パラメータは、クラスの現在のインスタンスへの参照であり、クラスに属する変数にアクセスするために使用されます。

self パラメータ

self パラメータはクラスの現在のインスタンスへの参照であり、クラスに属する変数にアクセスするために使用されます。

これは self という名前でなくても構いませんが、クラス内のすべての関数の最初のパラメータである必要があります:

class Person:
  def __init__(mysillyobject, name, age):
    mysillyobject.name = name
    mysillyobject.age = age

  def myfunc(abc):
    print("Hello my name is " + abc.name)

p1 = Person("John", 36)
p1.myfunc()

オブジェクトのプロパティの変更

次のようにしてオブジェクトのプロパティを変更できます:

p1.age = 40

オブジェクトのプロパティの削除

del キーワードを使用してオブジェクトのプロパティを削除できます:

del p1.age

オブジェクトの削除

del キーワードを使用してオブジェクトを削除できます:

del p1

pass ステートメント

クラス定義は空にすることはできませんが、何らかの理由で内容のないクラス定義がある場合は、エラーを避けるために pass ステートメントを挿入します。

class Person:
  pass

Note: Pythonには組み込みの配列サポートがありませんが、代わりにPythonのリストを使用することができます。

配列

Note: このページではリストを配列として使用する方法を示していますが、Pythonで配列を操作するには、NumPyライブラリのようなライブラリをインポートする必要があります。

配列は、単一の変数に複数の値を格納するために使用されます:

cars = ["Ford", "Volvo", "BMW"]

配列とは

配列は、一度に複数の値を保持できる特別な変数です。

アイテムのリスト(例えば、車の名前のリスト)がある場合、車を単一の変数に格納する場合は次のようになります:

car1 = "Ford"
car2 = "Volvo"
car3 = "BMW"

しかし、車をループして特定の車を見つけたり、3台ではなく300台の車がある場合はどうでしょうか?

その解決策が配列です!

配列は単一の名前で多くの値を保持でき、インデックス番号を参照して値にアクセスできます。

配列の要素にアクセスする

インデックス番号を使用して配列要素にアクセスします。

x = cars[0]

cars[0] = "Toyota"

配列の長さ

len()メソッドを使用して配列の長さ(配列内の要素数)を返します。

x = len(cars)

Note: 配列の長さは常に最高の配列インデックスより1つ多いです。

配列要素のループ

for in ループを使用して配列のすべての要素をループ処理できます。

for x in cars:
  print(x)

配列要素の追加

append()メソッドを使用して要素を配列に追加できます。

cars.append("Honda")

配列要素の削除

pop()メソッドを使用して配列から要素を削除できます。

cars.pop(1)

また、remove()メソッドを使用して配列から要素を削除することもできます。

cars.remove("Volvo")

Note: リストのremove()メソッドは、指定された値の最初の出現箇所のみを削除します。

配列のメソッド

Pythonには、リスト/配列で使用できる一連の組み込みメソッドがあります。

メソッド 説明
append() リストの末尾に要素を追加します
clear() リストからすべての要素を削除します
copy() リストのコピーを返します
count() 指定された値の要素数を返します
extend() リストの末尾にリスト(または任意の反復可能オブジェクト)の要素を追加します
index() 指定された値を持つ最初の要素のインデックスを返します
insert() 指定された位置に要素を挿入します
pop() 指定された位置の要素を削除します
remove() 指定された値を持つ最初の要素を削除します
reverse() リストの順序を反転します
sort() リストをソートします

Note: Pythonには組み込みの配列サポートがありませんが、代わりにPythonのリストを使用することができます。

ラムダ関数は、小さな匿名関数です。

ラムダ関数は任意の数の引数を取ることができますが、式は1つだけです。

構文

lambda 引数 : 式

式が実行され、その結果が返されます。

x = lambda a : a + 10
print(x(5))

ラムダ関数は任意の数の引数を取ることができます。

x = lambda a, b : a * b
print(x(5, 6))

x = lambda a, b, c : a + b + c
print(x(5, 6, 2))

ラムダ関数の利用

ラムダの真の力は、別の関数の中で匿名関数として使用するときによく示されます。

もし、1つの引数を受け取る関数定義があり、その引数が未知の数値と乗算される場合:

def myfunc(n):
  return lambda a : a * n

その関数定義を使用して、送信される数値を常に2倍にする関数を作成します:

def myfunc(n):
  return lambda a : a * n

mydoubler = myfunc(2)

print(mydoubler(11))

または、同じ関数定義を使用して、送信される数値を常に3倍にする関数を作成します:

def myfunc(n):
  return lambda a : a * n

mytripler = myfunc(3)

print(mytripler(11))

また、同じ関数定義を使用して、両方の関数を同じプログラム内に作成します:

def myfunc(n):
  return lambda a : a * n

mydoubler = myfunc(2)
mytripler = myfunc(3)

print(mydoubler(11))
print(mytripler(11))

ラムダ関数は、匿名関数が一時的に必要な場合に使用します。

Pythonの関数

関数は、呼び出された時にのみ実行されるコードブロックです。

パラメータとして知られるデータを関数に渡すことができます。

関数は結果としてデータを返すことができます。

関数の作成

Pythonでは、関数はdefキーワードを使用して定義されます:

def my_function():
  print("関数からこんにちは")

関数の呼び出し

関数を呼び出すには、関数名の後に括弧を付けます:

def my_function():
  print("関数からこんにちは")

my_function()

引数

情報は引数として関数に渡すことができます。

引数は、関数名の後ろに括弧の中に指定します。カンマで区切って複数の引数を追加することができます。

次の例では、1つの引数(fname)を持つ関数があります。この関数が呼び出されるときに、最初の名前を渡し、関数内でフルネームを出力します:

def my_function(fname):
  print(fname + " Refsnes")

my_function("Emil")
my_function("Tobias")
my_function("Linus")

引数はPythonのドキュメントでしばしばargsとして短縮されます。

パラメータまたは引数?

パラメータと引数という用語は同じものを指します:関数に渡される情報。

関数の観点から:

パラメータは、関数の定義の括弧の内側にリストされる変数です。

引数は、関数が呼び出されるときに送信される値です。

引数の数

デフォルトでは、関数は正しい数の引数で呼び出す必要があります。つまり、関数が2つの引数を期待している場合、2つの引数で関数を呼び出す必要があります。

def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil", "Refsnes")

関数を1つまたは3つの引数で呼び出そうとするとエラーが発生します:

def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil")

任意の引数、*args

関数に渡される引数の数がわからない場合は、関数定義内のパラメータ名の前に*を追加します。

このようにして、関数は引数のタプルを受け取り、それに応じてアイテムにアクセスすることができます:

def my_function(*kids):
  print("最年少の子供は " + kids[2])

my_function("Emil", "Tobias", "Linus")

Pythonのドキュメントでは、任意の引数はしばしば*argsとして短縮されます。

キーワード引数

キー = 値の構文で引数を送信することもできます。

この方法では、引数の順序は重要ではありません。

def my_function(child3, child2, child1):
  print("最年少の子供は " + child3)

my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")

キーワード引数というフレーズはPythonのドキュメントではしばしばkwargsとして短縮されます。

任意のキーワード引数、**kwargs

関数に渡されるキーワード引数の数がわからない場合は、関数定義内のパラメータ名の前に2つのアスタリスク**を追加します。

この方法で関数は引数の辞書を受け取り、それに応じてアイテムにアクセスすることができます:

def my_function(**kid):
  print("彼の姓は " + kid["lname"])

my_function(fname = "Tobias", lname = "Refsnes")

Pythonのドキュメントでは、任意のキーワード引数はしばしば**kwargsとして短縮されます。

デフォルトパラメータ値

次の例は、デフォルトパラメータ値の使用方法を示しています。

引数なしで関数を呼び出すと、デフォルト値が使用されます:

def my_function(country = "Norway"):
  print("私は " + country + " 出身です")

my_function("Sweden")
my_function("India")
my_function()
my_function("Brazil")

リストを引数として渡す

任意のデータ型の引数を関数に送信することができます(文字列、数値、リスト、辞書など)。関数に到達すると、それは同じデータ型として扱われます。

たとえば、リストを引数として送信すると、関数に到達するときもリストのままです:

def my_function(food):
  for x in food:
    print(x)

fruits = ["apple", "banana", "cherry"]

my_function(fruits)

戻り値

関数が値を返すようにするには、return文を使用します:

def my_function(x):
  return 5 * x

print(my_function(3))
print(my_function(5))
print(my_function(9))

pass文

関数定義には空にすることはできませんが、何らかの理由で内容のない関数定義がある場合は、エラーを避けるためにpass文を入れてください。

def myfunction():
  pass

位置引数のみ

関数に位置引数のみを持つことを指定することができます。または、キーワード引数のみを持つことを指定することもできます。

位置引数のみを指定するには、引数の後ろに , / を追加します:

def my_function(x, /):
  print(x)

my_function(3)

, / を追加しないと、関数が位置引数を期待していても、実際にはキーワード引数を使用できます:

def my_function(x):
  print(x)

my_function(x = 3)

, / を追加すると、キーワード引数を送信しようとするとエラーが発生します:

def my_function(x, /):
  print(x)

my_function(x = 3)

キーワード引数のみ

関数がキーワード引数のみを受け入れることを指定するには、引数の前に*を追加します:

def my_function(*, x):
  print(x)

my_function(x = 3)

*, を追加しないと、関数がキーワード引数を期待している場合でも、実際には位置引数を使用することができます:

def my_function(x):
  print(x)

my_function(3)

*, / を追加すると、位置引数を送信しようとするとエラーが発生します:

def my_function(*, x):
  print(x)

my_function(3)

位置引数のみとキーワード引数の組み合わせ

同じ関数内でこれら2つの引数タイプを組み合わせることができます。

/の前にある任意の引数は位置引数のみであり、*の後にある任意の引数はキーワード引数のみです。

def my_function(a, b, /, *, c, d):
  print(a + b + c + d)

my_function(5, 6, c = 7, d = 8)

再帰

Pythonは関数の再帰を受け入れることもできます。これは、定義された関数が自分自身を呼び出すことを意味します。

再帰は一般的な数学的およびプログラミングの概念です。これは、関数が自分自身を呼び出すことを意味します。これにより、データをループして結果に到達することができます。

開発者は、再帰は終了しない関数や、過剰なメモリやプロセッサパワーを使用する関数を書き込むのが比較的簡単であるため、非常に注意する必要があります。ただし、正しく書かれている場合、再帰は非常に効率的で数学的にエレガントなプログラミングアプローチとなります。

この例では、tri_recursion()は再帰的に呼び出す関数です。我々はk変数をデータとして使用し、それが0より大きい場合は(つまりそれが0でない場合)、再帰するたびに減少します。

再帰は、その条件が0より大きくない(つまり0である)場合に終了します。

新しい開発者にとっては、これが正確にどのように機能するかを理解するのに時間がかかる場合があります。これをテストして変更するのが最良の方法です。

def tri_recursion(k):
  if(k > 0):
    result = k + tri_recursion(k - 1)
    print(result)
  else:
    result = 0
  return result

print("\n\n再帰例の結果")
tri_recursion(6)

PythonのForループ

Forループはシーケンス(リスト、タプル、辞書、セット、または文字列)を繰り返し処理するために使用されます。

これは他のプログラミング言語のforキーワードとは異なり、他のオブジェクト指向プログラミング言語で見られるイテレーターメソッドのように機能します。

Forループを使うと、リスト、タプル、セットなどの各要素に対して一連のステートメントを実行することができます。

fruits = ["apple", "banana", "cherry"]
for x in fruits:
  print(x)

Forループでは、事前にインデックス変数を設定する必要はありません。

文字列のイテレーション

文字列もイテラブルオブジェクトであり、文字のシーケンスを含んでいます。

for x in "banana":
  print(x)

break文

break文を使うと、全ての要素をループする前にループを終了することができます。

fruits = ["apple", "banana", "cherry"]
for x in fruits:
  print(x)
  if x == "banana":
    break

fruits = ["apple", "banana", "cherry"]
for x in fruits:
  if x == "banana":
    break
  print(x)

continue文

continue文を使うと、現在のイテレーションを停止し、次のイテレーションに進むことができます。

fruits = ["apple", "banana", "cherry"]
for x in fruits:
  if x == "banana":
    continue
  print(x)

range()関数

指定された回数だけコードをループするために、range()関数を使用することができます。

range()関数はデフォルトで0から始まり、デフォルトで1ずつ増加し、指定された数で終了します。

for x in range(6):
  print(x)

注意:range(6)は0から6ではなく、0から5までの値を返します。

range()関数はデフォルトで0から始まりますが、開始値を指定することも可能です。たとえばパラメータを追加してrange(2, 6)とすると、2から6(6は含まれません)までの値を返します。

for x in range(2, 6):
  print(x)

range()関数はデフォルトでシーケンスを1ずつ増加させますが、増加値を指定することも可能です。たとえば第3パラメータを追加してrange(2, 30, 3)とすると、2から30までの値を3ずつ増加させます。

for x in range(2, 30, 3):
  print(x)

Forループのelse文

Forループのelseキーワードは、ループが終了したときに実行するブロックのコードを指定します。

for x in range(6):
  print(x)
else:
  print("Finally finished!")

注意:ループがbreak文によって中断された場合、elseブロックは実行されません。

for x in range(6):
  if x == 3: break
  print(x)
else:
  print("Finally finished!")

ネストされたループ

ネストされたループは、ループの中に別のループがある構造です。

「内側のループ」は、「外側のループ」の各反復ごとに1回実行されます。

adj = ["red", "big", "tasty"]
fruits = ["apple", "banana", "cherry"]

for x in adj:
  for y in fruits:
    print(x, y)

pass文

forループには空にすることはできませんが、何らかの理由で中身のないforループがある場合は、エラーを避けるためにpass文を入れてください。

for x in [0, 1, 2]:
  pass

Pythonのループ

Pythonには2つの基本的なループコマンドがあります:

whileループ

whileループを使うと、条件が真である限り一連のステートメントを実行することができます。

i = 1
while i < 6:
  print(i)
  i += 1

注意:iをインクリメントすることを忘れないでください。そうしないとループが永遠に続きます。

このwhileループでは、1から始まるインデックス変数iが必要です。

break文

break文を使うと、whileの条件が真であってもループを終了することができます。

i = 1
while i < 6:
  print(i)
  if i == 3:
    break
  i += 1

continue文

continue文を使うと、現在のイテレーションを停止し、次のイテレーションに進むことができます。

i = 0
while i < 6:
  i += 1
  if i == 3:
    continue
  print(i)

else文

else文を使うと、条件がもはや真でなくなったときに一度だけブロックのコードを実行することができます。

i = 1
while i < 6:
  print(i)
  i += 1
else:
  print("iはもはや6未満ではありません")

Pythonの条件とIf文

Pythonは数学からの通常の論理条件をサポートしています:

これらの条件は、「if文」やループで最も一般的に使用されます。

インデント

Pythonはコードのスコープを定義するためにインデント(行の先頭の空白)を使用します。他のプログラミング言語では、この目的に波括弧が使用されることが多いです。

a = 33
b = 200
if b > a:
  print("b is greater than a")

Elif

elifキーワードは、「前の条件が真でない場合、この条件を試してみてください」というPythonの方法です。

a = 33
b = 33
if b > a:
  print("b is greater than a")
elif a == b:
  print("a and b are equal")

Else

elseキーワードは、前の条件に該当しないすべてをキャッチします。

a = 200
b = 33
if b > a:
  print("b is greater than a")
elif a == b:
  print("a and b are equal")
else:
  print("a is greater than b")

また、elifなしでelseを持つこともできます:

a = 200
b = 33
if b > a:
  print("b is greater than a")
else:
  print("b is not greater than a")

短縮形のIf

実行するステートメントが1つだけの場合、それをif文と同じ行に置くことができます。

if a > b: print("a is greater than b")

短縮形のIf … Else

実行するステートメントが1つだけの場合、ifとelseそれぞれに1つずつステートメントを置くことができます:

a = 2
b = 330
print("A") if a > b else print("B")

このテクニックは三項演算子または条件式として知られています。

また、同じ行に複数のelseステートメントを持つこともできます:

a = 330
b = 330
print("A") if a > b else print("=") if a == b else print("B")

And

andキーワードは論理演算子であり、条件文を組み合わせるために使用されます:

a = 200
b = 33
c = 500
if a > b and c > a:
  print("Both conditions are True")

Or

orキーワードは論理演算子であり、条件文を組み合わせるために使用されます:

a = 200
b = 33
c = 500
if a > b or a > c:
  print("At least one of the conditions is True")

Not

notキーワードは論理演算子であり、条件文の結果を反転させるために使用されます:

a = 33
b = 200
if not a > b:
  print("a is NOT greater than b")

ネストされたIf

ネストされたif文を使用することができます。これをネストされたif文と呼びます。

x = 41

if x > 10:
  print("Above ten,")
  if x > 20:
    print("and also above 20!")
  else:
    print("but not above 20.")

pass文

if文は空にすることはできませんが、何らかの理由で内容がないif文がある場合は、エラーを回避するためにpass文を入れてください。

a = 33
b = 200

if b > a:
  pass