21 3月 2025
Pythonは、その明確な構文と読みやすさで知られる、汎用性が高く広く使われているプログラミング言語です。Web開発からデータサイエンスまで、あらゆる分野で使用されているため、初心者に最適な選択肢であり、多くのキャリアパスを開きます。この記事では、シンプルで理解しやすいコード例を用いて、Pythonの基本的な概念を説明します。
まずは伝統的な “Hello, World!” プログラムから始めましょう。Pythonでは、これは非常に簡単です。
print("Hello, Beginner!")
この1行は、以下のことを行います。
print()
: これは組み込みの関数です。関数は、特定のタスクを実行する再利用可能なコードのブロックです。print()
はユーザーに出力を表示します。("Hello, Beginner!")
: 括弧の中は文字列リテラルです。文字列は文字の連なりで、シングルクォート ('...'
) またはダブルクォート ("..."
) で囲みます。これを実行すると、Pythonインタープリタは print()
を実行し、“Hello, Beginner!” を画面に表示します。
変数はデータを格納するために不可欠です。ラベル付きのコンテナと考えてください。 説明的な名前を使用し、小文字で始め、単語を区切るためにアンダースコアを使用する (my_variable
、user_age
など) のが良い習慣です。以下に例を示します。
# 変数に値を代入
message = "Welcome to Python!"
number = 10
pi = 3.14159
# 変数の値を出力
print(message)
print(number)
print(pi)
説明:
message = "Welcome to Python!"
: message
という名前の変数が作成され、文字列 “Welcome to Python!” が格納されます。number = 10
: number
という名前の変数が整数 10
を格納します。pi = 3.14159
: pi
という名前の変数が浮動小数点数 3.14159
を格納します。print()
はこれらの値を表示します。Pythonは動的型付けです。変数の型 (文字列、整数、浮動小数点数) を明示的に宣言する必要はありません。Pythonは代入された値から型を推測します。
対話型プログラムは、しばしばユーザー入力を必要とします。以下に入力取得方法を示します。
# ユーザー入力を取得
name = input("Please enter your name: ")
# パーソナライズされた挨拶を出力
print("Hello, " + name + "!") # 文字列の結合
説明:
name = input("Please enter your name: ")
: input()
はプログラムを一時停止し、ユーザーが何かを入力してEnterキーを押すのを待ち、それを文字列として name
に格納します。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.")
内訳:
age = int(input("Enter your age: "))
: 年齢のユーザー入力を受け取ります。int()
は入力 (デフォルトでは文字列) を整数に変換します。if age >= 18:
: age
が18以上かどうかをチェックします。真の場合、インデントされた print
文が実行されます。elif age < 0:
: 前の if
条件が偽の場合、この条件がチェックされます。真の場合、対応するブロックが実行されます。elif
は “else if” の略で、複数の条件を順番にチェックできます。else:
: if
または elif
の条件がどれも真でない場合、else
の下のインデントされたコードが実行されます。インデントはPythonで非常に重要です。if
、elif
、else
に関連付けられたコードブロックを定義します。Pythonコードが正しく動作するためには、一貫したインデント (通常は4つのスペース) が不可欠です。for
を使ったコードの繰り返しループはコードブロックを繰り返します。for
ループは、シーケンス (リストや数値の範囲など) を反復処理します。
# 0-4の数字を出力
for i in range(5):
print(i)
# リストの要素を出力
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
説明:
for i in range(5):
: range(5)
は、0から5まで (ただし5は含まない) の数値を生成します。ループはこのシーケンスを反復処理します。各反復で、現在の数値が i
に代入されます。for fruit in fruits:
: このループは fruits
リストを反復処理します。各反復で、現在のリスト要素が fruit
に代入されます。while
を使ったコードの繰り返しwhile
ループは、条件が真である限り継続します。
count = 0
while count < 5:
print(count)
count += 1 # countをインクリメント
説明:
count = 0
: count
を0に初期化します。while count < 5:
: ループは count
が5未満である限り継続します。count += 1
: ループ内で、count
は各反復で1ずつ増加します。これにより、無限ループ (条件が常に真のままになる) を防ぎます。関数は、コードの再利用、整理、可読性のために不可欠です。同じコードを何度も繰り返す代わりに、関数を一度定義し、その特定の機能が必要なときにいつでも呼び出すことができます。def
を使用して独自の関数を定義します。
# 関数を定義
def greet(name):
print("Hello, " + name + "!")
# 関数を呼び出す
greet("Alice")
greet("Bob")
キーポイント:
def greet(name):
: name
という1つのパラメータを取る greet
という名前の関数を定義します。print("Hello, " + name + "!")
: 関数の本体 — 関数が呼び出されたときに実行されるコード。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)
説明:
def calculate_area(length, width):
: length
と width
をパラメータとして取り、長方形の面積を計算する関数を定義します。"""..."""
は docstring で、関数を説明します。Docstringはドキュメントに使用され、help()
関数でアクセスできます。return area
: 関数は計算された面積を返します。return
文は関数を終了し、関数が呼び出された場所に値を送り返します。float()
を使用してそれらを浮動小数点数に変換します。float()
を使用すると、小数値を許容し、計算機をより汎用的にします。calculate_area
を呼び出し、寸法を渡し、返された値を rectangle_area
に格納します。Pythonは、プログラムのフローを制御するための他のツールを提供します。
break
、continue
、およびループ内の 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の学習の強固な基盤を提供します。これらの概念を試し、それらを組み合わせることで、ますます洗練されたプログラムを構築できます。プログラミング言語を習得するには、練習と探求が鍵であることを忘れないでください。