【Python/第3回】

Python

前回はPythonのインストールから実行までを取り扱いました。今回は様々なデータ型と制御構文を学んでいきます。

変数とデータ型

変数

プログラムでは、データを扱うために「変数」を使います。Pythonでは変数を宣言する際に型を明示的に指定する必要はなく、値を代入すると自動的に型が決まります。

x = 10          # 整数型 (int)
y = 3.14        # 浮動小数点型 (float)
text = "Hello"  # 文字列型 (str)
is_valid = True # 真偽値型 (bool)

型の確認

変数の型を知りたい場合は、type() 関数を使います。

print(type(x))     # <class 'int'>
print(type(text))  # <class 'str'>

型変換

異なる型のデータを変換するには、int(), float(), str() などの関数を使います。

num_str = "123"     # 文字列で宣言
num = int(num_str)  # 文字列を整数に変換
print(num + 10)     # 133

Pythonでは、異なる型同士の演算ができない場合があります。その場合は適切な型変換が必要となります。

データ構造

Pythonにはリスト・タプル・辞書・集合などのデータ構造があります。最初はこのデータ構造の違いやout of rangeエラーに悩まされることになると思います。

リスト(list)

データ構造の中でも基本形になります。使用頻度も高いです。

fruits = ["りんご", "バナナ", "みかん"]
print(fruits[0])  # りんご

タプル(tuple)

更新しない決められた定数を入れておくのに便利です。

tuple_example = (1, 2, 3)
print(tuple_example[1])  # 2

辞書(dict)

例にもあるような人物や書籍のデータなど、ひとまとめにしておきたいデータを取り扱うことができます。

dict_example = {"name": "太郎", "age": 20}
print(dict_example["name"])  # 太郎

集合(set)

重複する値を無視するので、リストやタプルから重複を取り除いたり、和集合・積集合の演算に便利です。

set_example = {1, 2, 3, 3}
print(set_example)  # {1, 2, 3}

データ構造の比較

わずかな違いしかないように見えますが、この違いが結構効いてきます。

データ構造特徴変更可否
リスト (list)順序あり、重複可、要素の変更可変更可
タプル (tuple)順序あり、重複可、要素の変更不可変更不可
辞書 (dict)キーと値のペア、キーは重複不可変更可
集合 (set)順序なし、重複不可変更可

ここから試しに実行していきながら確認していきましょう。任意のディレクトリを作成し、その中にmain.pyを作成しましょう。

実行は”python main.py”になります。

条件分岐 (if / elif / else)

条件分岐を使うことで、異なる状況に応じた処理を行うことができます。

x = 10
if x > 0:
    print("x は正の数です")
elif x == 0:
    print("x は 0 です")
else:
    print("x は負の数です")

if の後に続く条件が True の場合、そのブロック内の処理が実行されます。

elif は if が False の場合に追加の条件を評価します。他言語ではelse ifと記述されるケースが多いですが、Pythonではelifと記述されている点には注意が必要です。

else は上記の条件がすべて False だった場合に実行されます。

Pythonにはswitch文はありません。Pythonの設計哲学の一つに、「明示性」と「可読性」を重視するというものがあるためです。また、辞書を活用することで疑似的にswitch文を再現できます。

繰り返し

繰り返し構文です。Pythonではリストと併用することが多いです。

for文

# listを使う方法
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    print(num)

# rangeを使う方法
for num in range(1, 6):
    print(num)

どちらも1から5までを出力する方法です。inの後に記述する内容次第で結果が変わります。

while文

# 0から4までを出力
x = 0
while x < 5:
    print(x)
    x += 1

よくあるwhile分の使い方として、以下のようなものがあります。

x = 0
while True:
    print(x)
    x += 1

条件を記述する部分にTrueと記述することで、無限ループにすることができます。

リストを宣言する際にfor文を使用することができます。

演算子

計算処理に欠かせないので、覚えていきましょう。

算術演算子

+a            # 正数
-a            # 負数
a + b         # 加算
a - b         # 減算
a * b         # 乗算
a / b         # 除算
a % b         # a を b で割った余り
a ** b        # a の b 乗
a // b        # 切り捨て除算

代入演算子

a = b         # a に b を代入する
a += b        # a = a + b に同じ
a -= b        # a = a - b に同じ
a *= b        # a = a * b に同じ
a /= b        # a = a / b に同じ
a %= b        # a = a % b に同じ
a **= b       # a = a ** b に同じ
a //= b       # a = a // b に同じ

比較演算子

a == b           # a が b と等しい
a != b           # a が b と異なる
a < b            # a が b よりも小さい
a > b            # a が b よりも大きい
a <= b           # a が b 以下である
a >= b           # a が b 以上である
a is b           # a が b と等しい
a is not b       # a が b と異なる
a in b           # a が b に含まれる (a, b は共に文字列、または、b はリストやタプル)
a not in b       # a が b に含まれない (a, b は共に文字列、または、b はリストやタプル)

ブール演算子

a and b         # a も b も真であれば真
a or b          # a または b が真であれば真
not a           # a が偽であれば真

関数とスコープ

Pythonの関数やスコープも他の言語と似ている部分が多いので覚えやすいかと思います。

関数の定義と呼び出し

def greet(name):
    print(f"こんにちは、{name}さん!")

greet("太郎")

引数と戻り値

def add(a, b):
    return a + b

result = add(3, 5)
print(result)

変数のスコープ

global_var = "グローバル変数"

def my_function():
    local_var = "ローカル変数"
    print(local_var)

my_function()
print(global_var)

例外処理

Pythonはインタプリタ言語かつ動的型付けなので、エラーが出がちです。エラーを例外処理で丸めるのも1つの手になります。

try:
    # 例外が発生する可能性のある処理
except ZeroDivisionError:
    # ZeroDivisionError が発生した場合に実行される処理
    print("ゼロで割ることはできません。")
except (ValueError, TypeError):
    print("値の変換に失敗しました、または不正な型が指定されました。")
except FileNotFoundError as e:
    print(f"ファイルが見つかりません: {e}")
except IndexError:
    print("リストの範囲外のインデックスが指定されました。")
except Exception as e:
    # 上記以外のあらゆる例外が発生した場合に実行される処理
    print(f"予期しないエラーが発生しました: {e}")
except:
    print("何らかのエラーが発生しました。")
finally:
    # 例外の発生有無に関わらず必ず実行される処理
    print("処理が終了しました。")

リスト内包表記

このような記法があります。書くことができると、行数を大幅に削ることができるほか、実行速度にも良い影響が出てきます。

リストとfor文の組み合わせ

JavaScriptでいうmapメソッド的なことができます。

squares = [x**2 for x in range(5)]
print(squares)  # [0, 1, 4, 9, 16]

リストとfor文とif文の組み合わせ

ここまで習った内容をフルで使う構文です。特定のテキストが含まれるリストを再構成したい場合などに有効です。

original_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 偶数であるという条件で抽出
filtered_list = [item for item in original_list if item % 2 == 0]

print(f"元のリスト: {original_list}")
print(f"条件に合う要素のリスト (リスト内包表記): {filtered_list}")

課題

###の部分を補完するか、新たに自分で追記していく形式です。

  1. 変数の型を確認し、異なる型のデータを適切に変換せよ。
num = 10
print(type(num))  # <class 'int'>
num_str = ###
print(type(num_str))  # <class 'str'>

型変換はそこそこ使います。特に外部ライブラリを扱いだすと、型エラーが頻発するので有効です。

num = 10
print(type(num))  # <class 'int'>
num_str = str(num)
print(type(num_str))  # <class 'str'>
  1. if文を使い、入力された数値が正の数・負の数・ゼロのどれかを判定するプログラムを記述せよ。
x = int(input("数値を入力してください: "))

構文は他の言語とほぼ変わりません。コロン忘れには注意。

x = int(input("数値を入力してください: "))
if x > 0:
    print("正の数です")
elif x < 0:
    print("負の数です")
else:
    print("ゼロです")
  1. for文を使い、1から10までの合計を計算するプログラムを記述せよ。
total = 0
###
print("合計:", total)

rangeの範囲設定には注意。

total = 0
for i in range(1, 11):
    total += i
print("合計:", total)
  1. 2つの数値a,bを受け取り、abを返す関数addを作成せよ。
###

print(add(3, 7))
def add(a, b):
    return a ** b

print(add(3, 7))
  1. fruitsをprintしたときに、[‘りんご’, ‘バナナ’]と出力されるようにせよ。
fruits = ["りんご", "バナナ", "みかん"]

print()

こちらは回答方法が2つありますが、本質はそれぞれ違います。

上はリストから削除してしまう方法です。ちなみにappend()でリストに追加ができます。

fruits = ["りんご", "バナナ", "みかん"]
fruits.remove("みかん")  # 削除
print(fruits)

下はスライスという方法を取っています。こちらはリストからは削除せず、以下の記法で取得するリストの内容を選びます。

リスト[開始インデックス:終了インデックス:ステップ]

fruits = ["りんご", "バナナ", "みかん"]
print(fruits[:2])  # スライス
  1. 例外処理を使い、リストの範囲外の要素を参照したときにエラーメッセージを出力するコードを記述せよ。
numbers = [1, 2, 3]
print(numbers[5])
numbers = [1, 2, 3]
try:
    print(numbers[5])
except IndexError:
    print("リストの範囲外です")

まとめ

お疲れ様でした。これで基本的な構文は書けるようになったと思います。とは言っても、まだまだ取り扱っていない構文やテクニックは多いです。人が書いたコードを見ることで学ぶことも多いので、ぜひgithubなどを覗きに行きましょう。

次回は標準ライブラリと外部ライブラリの利用を取り扱っていきます。

それでは