21 3月 2025

Pythonの基礎:初心者のためのコーディングガイド

Pythonは、その明確な構文と読みやすさで知られる、汎用性が高く広く使われているプログラミング言語です。Web開発からデータサイエンスまで、あらゆる分野で使用されているため、初心者に最適な選択肢であり、多くのキャリアパスを開きます。この記事では、シンプルで理解しやすいコード例を用いて、Pythonの基本的な概念を説明します。

はじめてのPythonプログラム: “Hello, World!”

まずは伝統的な “Hello, World!” プログラムから始めましょう。Pythonでは、これは非常に簡単です。

print("Hello, Beginner!")

この1行は、以下のことを行います。

  1. print(): これは組み込みの関数です。関数は、特定のタスクを実行する再利用可能なコードのブロックです。print() はユーザーに出力を表示します。
  2. ("Hello, Beginner!"): 括弧の中は文字列リテラルです。文字列は文字の連なりで、シングルクォート ('...') またはダブルクォート ("...") で囲みます。

これを実行すると、Pythonインタープリタは print() を実行し、“Hello, Beginner!” を画面に表示します。

Pythonの変数

変数はデータを格納するために不可欠です。ラベル付きのコンテナと考えてください。 説明的な名前を使用し、小文字で始め、単語を区切るためにアンダースコアを使用する (my_variableuser_age など) のが良い習慣です。以下に例を示します。

# 変数に値を代入
message = "Welcome to Python!"
number = 10
pi = 3.14159

# 変数の値を出力
print(message)
print(number)
print(pi)

説明:

  1. message = "Welcome to Python!": message という名前の変数が作成され、文字列 “Welcome to Python!” が格納されます。
  2. number = 10: number という名前の変数が整数 10 を格納します。
  3. pi = 3.14159: pi という名前の変数が浮動小数点数 3.14159 を格納します。

print() はこれらの値を表示します。Pythonは動的型付けです。変数の型 (文字列、整数、浮動小数点数) を明示的に宣言する必要はありません。Pythonは代入された値から型を推測します。

Pythonでのユーザーインタラクション

対話型プログラムは、しばしばユーザー入力を必要とします。以下に入力取得方法を示します。

# ユーザー入力を取得
name = input("Please enter your name: ")

# パーソナライズされた挨拶を出力
print("Hello, " + name + "!")  # 文字列の結合

説明:

  1. name = input("Please enter your name: "): input() はプログラムを一時停止し、ユーザーが何かを入力してEnterキーを押すのを待ち、それを文字列として name に格納します。
  2. print("Hello, " + name + "!"): これは挨拶を出力します。+ 演算子は、文字列とともに使用すると、文字列結合 を実行し、それらを結合します。読みやすくするため、結合する際は + の前後にスペースを追加するのが良い習慣です。

条件ロジック: if, else, elif

条件文は、プログラムが意思決定を行うことを可能にし、条件が真か偽かに基づいて実行されるコードブロックを制御します。

age = int(input("Enter your age: "))

if age >= 18:
    print("You are eligible to vote.")
elif age < 0:
    print("That is an incorrect age.")
else:
    print("You are not eligible to vote yet.")

内訳:

  1. age = int(input("Enter your age: ")): 年齢のユーザー入力を受け取ります。int() は入力 (デフォルトでは文字列) を整数に変換します。
  2. if age >= 18:: age が18以上かどうかをチェックします。真の場合、インデントされた print 文が実行されます。
  3. elif age < 0:: 前の if 条件が偽の場合、この条件がチェックされます。真の場合、対応するブロックが実行されます。elif は “else if” の略で、複数の条件を順番にチェックできます。
  4. else:: if または elif の条件がどれも真でない場合、else の下のインデントされたコードが実行されます。インデントはPythonで非常に重要ですifelifelse に関連付けられたコードブロックを定義します。Pythonコードが正しく動作するためには、一貫したインデント (通常は4つのスペース) が不可欠です。

ループ: for を使ったコードの繰り返し

ループはコードブロックを繰り返します。for ループは、シーケンス (リストや数値の範囲など) を反復処理します。

# 0-4の数字を出力
for i in range(5):
    print(i)

# リストの要素を出力
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

説明:

  1. for i in range(5):: range(5) は、0から5まで (ただし5は含まない) の数値を生成します。ループはこのシーケンスを反復処理します。各反復で、現在の数値が i に代入されます。
  2. for fruit in fruits:: このループは fruits リストを反復処理します。各反復で、現在のリスト要素が fruit に代入されます。

ループ: while を使ったコードの繰り返し

while ループは、条件が真である限り継続します。

count = 0
while count < 5:
    print(count)
    count += 1  # countをインクリメント

説明:

  1. count = 0: count を0に初期化します。
  2. while count < 5:: ループは count が5未満である限り継続します。
  3. count += 1: ループ内で、count は各反復で1ずつ増加します。これにより、無限ループ (条件が常に真のままになる) を防ぎます。

関数: 再利用可能なコードブロック

関数は、コードの再利用、整理、可読性のために不可欠です。同じコードを何度も繰り返す代わりに、関数を一度定義し、その特定の機能が必要なときにいつでも呼び出すことができます。def を使用して独自の関数を定義します。

# 関数を定義
def greet(name):
    print("Hello, " + name + "!")

# 関数を呼び出す
greet("Alice")
greet("Bob")

キーポイント:

  1. def greet(name):: name という1つのパラメータを取る greet という名前の関数を定義します。
  2. print("Hello, " + name + "!"): 関数の本体 — 関数が呼び出されたときに実行されるコード。
  3. greet("Alice"): greet 関数を呼び出し、“Alice” を引数として渡します。

概念の組み合わせ: 簡単な面積計算

概念を組み合わせて、もう少し複雑なプログラムを作成しましょう。

def calculate_area(length, width):
    """Calculates the area of a rectangle."""  # Docstring
    area = length * width
    return area

# Get dimensions
length = float(input("Enter length: "))
width = float(input("Enter width: "))

# Calculate area
rectangle_area = calculate_area(length, width)

# Print result
print("Area:", rectangle_area)

説明:

  1. def calculate_area(length, width):: lengthwidth をパラメータとして取り、長方形の面積を計算する関数を定義します。"""..."""docstring で、関数を説明します。Docstringはドキュメントに使用され、help() 関数でアクセスできます。
  2. return area: 関数は計算された面積を返します。return 文は関数を終了し、関数が呼び出された場所に値を送り返します。
  3. プログラムは、長さと幅のユーザー入力を取得し、float() を使用してそれらを浮動小数点数に変換します。float() を使用すると、小数値を許容し、計算機をより汎用的にします。
  4. calculate_area を呼び出し、寸法を渡し、返された値を rectangle_area に格納します。
  5. 最後に、面積を出力します。

より多くの制御フローツール

Pythonは、プログラムのフローを制御するための他のツールを提供します。

breakcontinue、およびループ内の else

  • break: 最も内側の for または while ループを終了します。
  • continue: ループの次の反復に進みます。
  • ループの else: for では、( break が発生しない限り) ループの終了後に実行されます。while では、( break が発生しない限り) 条件が偽になった後に実行されます。
#breakの例
numbers = [1, 2, 3, 4, 5]
for number in numbers:
    if number == 3:
        break  # numberが3のときにループを終了
    print(number)  # 出力: 1 2

#continueの例
numbers = [1, 2, 3, 4, 5]
for number in numbers:
    if number == 3:
        continue  # numberが3のときに次の反復へスキップ
    print(number)  # 出力: 1 2 4 5

#elseの例
for i in range(5):
    print(i)
else:
    print("Loop finished") #実行されます

for i in range(5):
    if i==3:
        break
    print(i)
else:
    print("Loop finished") #実行されません

match

match は値をパターンと比較します。他の言語のswitch文に似ていますが、より強力なパターンマッチングを備えています。これはPython 3.10から利用可能です。

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 401 | 403 | 404:  # 複数のケース
            return "Not allowed"
        case 418:
            return "I'm a teapot"
        case _:  # デフォルト
            return "Something's wrong"

print(http_error(404))
print(http_error(500))

_ はワイルドカードで、他のケースが一致しない場合にすべてに一致します。

データ構造

Pythonには、データを整理するための組み込みのデータ構造があります。

  • リスト: 順序付けられた、変更可能なシーケンス。
my_list = [1, 2, 3, "apple"]
my_list.append("cherry")  # 末尾に要素を追加
print(my_list[0])       # インデックスで要素にアクセス (0から始まる)
my_list.remove(2)        # 値で要素を削除
print(my_list)
  • タプル: 順序付けられた、変更不可能なシーケンス。
my_tuple = (1, 2, 3, "apple")
# my_tuple[0] = 5  # エラー (変更不可能) - タプルは作成後に変更できません
print(my_tuple[1])
  • セット: ユニークな要素の順序付けられていないコレクション。
my_set = {1, 2, 3, 3, 4, 5}  # 重複は自動的に削除されます
print(my_set)  # 出力: {1, 2, 3, 4, 5}
  • 辞書: キーと値のペア。キーは変更不可能でなければなりません (文字列、数値、タプルなど)。
my_dict = {"name": "Alice", "age": 30}
print(my_dict["name"])  # キーで値にアクセス
my_dict["age"] = 31      # 値を変更
print(my_dict)
  • リスト内包表記: リストを作成するための簡潔な構文。
squares = [x**2 for x in range(10)]      # 平方のリスト
even = [x for x in range(20) if x % 2 == 0]  # 偶数
print(squares)
print(even)

モジュール

モジュールはコードを再利用可能なファイルに整理します。import を使用して、他のモジュールから機能にアクセスします。

import math

print(math.sqrt(16))  # mathモジュールのsqrt関数にアクセス
print(math.pi)        # pi定数にアクセス

from math import sqrt  # 特定の関数をインポート

print(sqrt(25))

from math import *  # すべてをインポート (一般的に避ける)

print(pi)

これは math モジュール (数学関数を提供) の使用を示しています。特定の関数や定数をインポートすると、コードの可読性が向上し、名前の衝突を回避できます。* で全てをインポートすることは、一般的に大規模なプロジェクトでは推奨されません。

関数定義: 高度なテクニック

デフォルト引数値

関数は引数にデフォルト値を持つことができます。

def greet(name, greeting="Hello"):
    print(greeting + ", " + name + "!")

greet("Bob")           # デフォルトの挨拶を使用
greet("Alice", "Hi")  # デフォルトをオーバーライド

キーワード引数

keyword=value 構文を使用して関数を呼び出します。

def describe_pet(animal_type, pet_name):
    print("I have a " + animal_type + " named " + pet_name + ".")

describe_pet(pet_name="Harry", animal_type="hamster")  # 順序は関係ありません

任意引数リスト

関数は *args を使用して、任意の数の位置引数を受け入れることができます。

def make_pizza(*toppings):
    print("Making a pizza with:")
    for topping in toppings:
        print("- " + topping)

make_pizza("pepperoni")
make_pizza("mushrooms", "cheese", "peppers")

*toppings はすべての位置引数を toppings という名前のタプルに収集します。

任意キーワード引数

関数は **kwargs を使用して、任意の数のキーワード引数を受け入れることができます。

def build_profile(first, last, **kwargs):
    # 固定および任意のキーワード引数を組み合わせてユーザープロファイルを作成します。
    profile = {'first_name': first, 'last_name': last}
    profile.update(kwargs)  # kwargsからのキーと値のペアでプロファイルを更新します。
    return profile

user = build_profile("Albert", "Einstein", location="Princeton", field="physics")
print(user)  # 出力: {'first_name': 'Albert', 'last_name': 'Einstein', 'location': 'Princeton', 'field': 'physics'}

**kwargs は “keyword arguments” の略で、追加の名前付き引数を辞書に収集するための一般的な命名規則です。これにより、関数は柔軟な入力を処理できます。

ラムダ式

lambda で作成された小さな無名関数。

add = lambda x, y: x + y
print(add(5, 3))  # 出力: 8

pairs = [(1, 'one'), (2, 'two'), (3, 'three')]
pairs.sort(key=lambda pair: pair[1]) #タプルの2番目の要素でソート
print(pairs)

ラムダ関数は、この例の sort のように、高階関数 (他の関数を引数として取る関数) の引数としてよく使用されます。

クラス

クラスは、データ (属性) とそのデータを操作する機能 (メソッド) をバンドルする方法を提供します。これは、オブジェクト指向プログラミングの主要な機能の1つであり、オブジェクトの設計図を作成できます。

class Dog:
    def __init__(self, name, age): #コンストラクタ
        self.name = name
        self.age = age

    def bark(self):
        print("Woof!")

my_dog = Dog("Buddy", 3) #クラスのインスタンス
print(my_dog.name)
my_dog.bark()

説明:

  • class Dog:: Dog という名前のクラスを定義します。
  • def __init__(self, name, age):: これはコンストラクタ (またはイニシャライザ) です。新しい Dog オブジェクトを作成すると自動的に呼び出されます。
    • self: クラスのインスタンス (操作している特定の Dog オブジェクト) を参照します。クラス内のすべてのメソッドの最初のパラメータです。
  • def bark(self):: これはメソッドDog クラスに属する関数です。犬のデータ (この単純な例では使用していませんが、self.name など) にアクセスできます。
  • my_dog = Dog("Buddy", 3): my_dog という名前の Dog クラスの インスタンス を作成します。

イテレータ

イテレータは、特定の実装に関係なく、コレクションのすべての要素を走査できるオブジェクトです。

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))

ジェネレータ

ジェネレータは、リストやタプルのような反復可能オブジェクトの一種です。リストとは異なり、キーワード yield を使用して、値をその場で生成し、コンテンツをメモリに格納しません。これにより、大きなシーケンスに対してメモリ効率が向上します。これはまた、リスト全体をメモリ内に作成するリスト内包表記とは異なります。

def my_generator():
  yield 1
  yield 2
  yield 3

for value in my_generator():
  print(value)

#ジェネレータ式
squares = (x*x for x in range(10))
print(list(squares))

これらの基礎は、Pythonの学習の強固な基盤を提供します。これらの概念を試し、それらを組み合わせることで、ますます洗練されたプログラムを構築できます。プログラミング言語を習得するには、練習と探求が鍵であることを忘れないでください。

関連ニュース

関連記事