はじめに
今回はPythonの学習記録です。
自分がこれまで経験してきた技術との違いを掘り下げながら記録していきます。
Pythonを初めて触る方にも分かるように基本的な内容から触れていきますが、PHPやC#との違いについても合わせて見ていきます。
そのため、ところどころ他の言語に関する内容も出てくるかと思いますがご容赦ください。
Pythonとは?
Pythonとはオブジェクト指向に属する言語です。
これまで私が触れてきたPHPやC#と属性を同じとしており、オブジェクトという実体を作成し、それに対して操作するという特徴を持ちます。
ただし、Pythonはオブジェクト指向だけで記述する必要があるわけではなく、関数をクラスの外に記述することもできます。
このあたりは後ほど実際のコードを見ながら触れていきます。
PHPやC#とは記法が異なり、最近ではAI関係の開発でPythonが使われることも多いため、最近のAI動向を追うのであれば触れておきたい言語であるとも言えます。
では、Pythonを初めて触る方にも基本的な部分が分かるようにしつつ、私が経験してきた言語との違いも交えながらPythonの仕様を見ていきましょう。
Pythonの記法
インデントで処理の範囲を表す
まず大きな違いとして、処理の有効範囲の表し方があります。
私が触れてきたC#では、
class A
{
// ここに処理
}
というように、{}を使って処理の範囲を表します。
それに対してPythonでは、
class A:
# ここに処理
というように、{}ではなくインデントによって処理の範囲を表します。
インデントとは、行の先頭に空白を入れて位置をずらすことです。
例えば、
class Product:
id: int
name: str
price: int
def check_price(self) -> None:
if self.price < 0:
raise ValueError("価格は0以上にしてください")
というような形です。
class Product:の中にある処理は1段階インデントされ、さらにif文の中ではもう1段階深くなっています。
行が短くなる一方で、インデントがずれているとエラーになるため記述には注意が必要です。
コメントの書き方
Pythonだけではないですがこういった言語は「コメント」というものを書くことができます。
コメントは実際の挙動とは関係なく記述を残せるもので、挙動の説明などに使用します。
下記のように使用します。チーム開発などではほぼ使いますので書き方は覚えておきましょう。
# これはコメントです
importについて
こちらもPythonに限ったことではないですが他のファイルや外部ライブラリを使用する場合は「インポート」が必要です。
ファイル分けなどでファイルを分けたり既存のライブラリを使用するなどといったことは実際にもよくあることです。
こちらも書き方は覚えておきましょう。
from pathlib import Path
from practice_inventory import Inventory, Product
変数の型を毎回書く必要がない
Pythonでは、変数を作成するときに型を明示しなくても記述できます。
型というのは、その値がどのような種類のデータなのかを表すものです。
例えばC#では、
int num = 100;
のように、整数を表すintを付けて記述します。
それに対してPythonでは、
num = 100
と記述することができます。
ただし、Pythonに型が存在しないわけではありません。
この場合のnumには整数であるint型の値が入っています。
またPythonでは、次のように型を書くこともできます。
num: int = 100
この: intは型ヒントと呼ばれるもので、この変数には整数が入る想定であることを分かりやすくするための記述です。
Pythonでは型を書かなくても動作しますが、コードを読みやすくするために型ヒントが使われることがあります。
文末に「;」がいらない
末尾にも違いがあります。
例えばC#では、
int num = 100;
のように、文末に;を付けます。
ですがPythonでは、
num = 100
のように、基本的には文末の;は必要ありません。
条件分岐
プログラムでは、条件によって処理を変えたいことがあります。
そのときに使用するのがifです。
例えば、
price = 100
if price > 0:
print("価格が設定されています")
というように記述します。
price > 0という条件が正しい場合に、その下にインデントされている処理が実行されます。
ここでもPythonでは{}を使用せず、インデントによってifの中にある処理を表していることが分かります。
繰り返し処理
複数の値を順番に処理したい場合にはforを使用します。
まずPythonでは、複数の値をまとめて扱うものとしてリストがあります。
products = ["りんご", "みかん", "バナナ"]
このリストを順番に処理する場合は、
for product in products:
print(product)
と記述できます。
この場合、productsの中にある値が1つずつproductに入り、処理されます。
C#を経験している方であれば、foreachに近いものと考えると分かりやすいでしょう。
関数
Pythonの関数はこのようになっています。
def show_products(inventory: Inventory) -> None:
if not inventory.products:
print("商品はありません")
return
for product in inventory.products:
print(create_product_message(product))
順を追って見ていきましょう。
まず、関数であることを表すにはdefというキーワードを使用します。
例えば、
def greet(name: str) -> None:
print(f"こんにちは、{name}さん")
というように記述します。
そして、この関数を実際に使用するときは、
greet("田中")
と呼び出します。
これを実行すると、
こんにちは、田中さん
と表示されます。
こちらは余談ですが "" が文字列化に必要な記述ですが今回は f"" となっていますね。
これは変数を文字列の中に埋め込める書き方です。
今回の事例の場合 name という変数内の情報をprint内の文字列に埋め込んでいます。
そのため こんにちは、田中さん となるわけですね。
関数はクラスの外にも書ける
Pythonでは、関数を必ずクラスの中に書く必要はありません。
@dataclass
class Product:
id: int
name: str
price: int
def create_product_message(product: Product) -> str:
return f"{product.name}は{product.price:,}円です"
このように、特定のクラスに所属させる必要がない処理であれば、クラスの外に関数として記述できます。
引数の書き方
引数というのは、関数に対して必要な値を呼び出し元から受け取るためのものです。
例としてC#の関数を見てみましょう。
public int Function(int num)
{
return num;
}
C#では、
int num
という順番で型と引数名を書きます。
それに対してPythonでは、
def function(num: int) -> int:
return num
というように、
引数名: 型
の順番で記述します。
例えば、
product: Product
であれば、productという名前の引数にProduct型の値が渡される想定であることを表しています。
他の言語を触っていると違和感を感じやすい部分なので、書式の違いとして覚えておくとよいでしょう。
戻り値
戻り値というのは、その関数を実行した結果として返される値のことです。
Pythonでは、
def add(a: int, b: int) -> int:
return a + b
というように記述します。
この中の、
-> int
は、この関数がint型の値を返す想定であることを表す型ヒントです。
そして、
return a + b
が実際に値を返している処理です。
値を返さない関数では、
def show_message() -> None:
print("こんにちは")
のように-> Noneと記述することがあります。
Noneは「意味のある値を返さない」ということを表しています。
クラス
Pythonでもクラスを作成することができます。
例えば、
class Product:
def __init__(self, id: int, name: str, price: int) -> None:
self.id = id
self.name = name
self.price = price
というように記述します。
__init__は、そのクラスからオブジェクトを作成するときに呼び出される処理です。
例えば、
product = Product(1, "りんご", 100)
とすると、Productのオブジェクトが作成されます。
また、ここで登場しているselfは、そのクラスから作成されたオブジェクト自身を表します。
C#でいうthisに近いものと考えると分かりやすいでしょう。
Pythonには、データを保持するクラスを簡単に記述するためのdataclassという機能もあります。
from dataclasses import dataclass
@dataclass
class Product:
id: int
name: str
price: int
このように記述することで、先ほど__init__に書いていたような初期化処理を簡潔に記述できます。
エントリポイント
プログラムが動くうえで必要なものとして「エントリポイント」というものがあります。
エントリポイントとは、そのプログラムが動き始めるときの発火点となる場所です。
Pythonでは、よく次のように記述します。
if __name__ == "__main__":
main()
Pythonはファイルのコードを基本的に上から順番に実行していきます。
そのため、関数やクラスを先に定義し、最後に、
if __name__ == "__main__":
main()
と記述することで、それまでに定義した処理を利用してmain()を実行できます。
また、この記述には、そのファイルが直接実行された場合だけmain()を呼び出すという役割もあります。
別のファイルから読み込まれた場合には、この中の処理は実行されません。
まとめ
いかがだったでしょうか?
今回は、ある程度他の言語を経験してきた自分の目線も交えながら、Pythonの入門についてお話ししていきました。
Pythonには今回紹介した内容以外にも、より深い機能や書き方がありますが、そちらについては今回は割愛させていただきます。
今回はまだPythonの入門編になりますので、もっと知りたい方はぜひ自身でも深掘りしてみてください。