変数とデータ型(数値、文字列、真偽値)

2025-10-17

はじめに

この内容では、プログラミングの基礎となる「変数」と「データ型」について学びます。
これらはプログラミングのABCとも言える重要な概念です。
しっかり理解することで、より複雑なプログラムを作成できるようになります。

変数とは

変数は、データを格納する「箱」のようなものです。

例えば、本棚に本を整理するように、プログラムではデータを変数に格納して管理します。

変数の基本

Pythonで変数を使用するには、変数名と代入演算子=を使います。

# 変数の例
name = "山田太郎"
age = 25
is_student = True

ここでは、nameageis_studentという3つの変数を作成し、それぞれにデータを格納しています。

変数名のルール

変数名をつけるときには以下のルールに従います。

  1. 英数字とアンダースコア(_)が使用できます
  2. 数字で始めることはできません
  3. 大文字と小文字は区別されます
  4. Pythonの予約語(ifforなど)は使用できません

良い例

user_name に文字列「太郎」、count1 に数値10、_total に数値100をそれぞれ代入しています。

user_name = "太郎"
count1 = 10
_total = 100

悪い例

1st_place は数字で始まっているため、user-name はハイフンを含むため、if は予約語のため、いずれも変数名として使用できません。

1st_place = "優勝"  # 数字で始まっている
user-name = "花子"  # ハイフンは使用不可
if = 10  # 予約語は使用不可

データ型の基本

Pythonには様々なデータ型がありますが、ここでは基本的な3つのデータ型を学びます。

数値型(Numeric Types)

数値型は、数字を扱うためのデータ型です。主に以下の種類があります:

整数(int)

整数を扱います。正の数、負の数、ゼロすべてを含みます。

# 整数の例
age = 30
temperature = -5
count = 0
population = 1000000

# 計算例
result = 10 + 5  # 足し算
difference = 20 - 8  # 引き算
product = 6 * 7  # 掛け算
quotient = 15 / 3  # 割り算(結果は浮動小数点数)
floor_division = 15 // 4  # 切り捨て除算(結果は3)
remainder = 15 % 4  # 剰余(余り、結果は3)
power = 2 ** 3  # べき乗(2の3乗、結果は8)

浮動小数点数(float)

小数点以下の数値を扱います。

# 浮動小数点数の例
height = 175.5
weight = 68.2
pi = 3.14159
temperature = 36.6

# 計算例
result = 10.5 + 3.2  # 13.7
result = 5.0 / 2.0   # 2.5

複素数(complex)

実数部と虚数部からなる数値です。科学技術計算などで使用されます。
complex_number に実部が3、虚部が4の複素数 3 + 4j を代入しています。

# 複素数の例
complex_number = 3 + 4j

文字列型(String)

文字列型は、文字の並びを扱うデータ型です。
シングルクォート'またはダブルクォート"で囲んで表現します。

# 文字列の例
name = "山田花子"
message = 'こんにちは、世界!'
empty_string = ""

文字列の操作

文字列に対して様々な操作を行うことができます。

# 文字列の連結
greeting = "こんにちは" + "、" + "世界!"
print(greeting)  # こんにちは、世界!

# 文字列の繰り返し
stars = "*" * 10
print(stars)  # **********

# 文字列の長さ
text = "Python"
length = len(text)
print(length)  # 6

# 文字列の一部取り出し(スライス)
text = "プログラミング"
print(text[0])     # プ(最初の文字)
print(text[0:3])   # プログラ(0番目から2番目まで)
print(text[-1])    # グ(最後の文字)

# 文字列のメソッド
message = " Hello, World! "
print(message.lower())      # " hello, world! "(小文字に変換)
print(message.upper())      # " HELLO, WORLD! "(大文字に変換)
print(message.strip())      # "Hello, World!"(前後の空白除去)
print(message.replace("Hello", "Hi"))  # " Hi, World! "

f-string(フォーマット文字列)

Python 3.6以降では、f-stringを使って変数の値を文字列に簡単に埋め込むことができます。

name = "太郎"
age = 20
message = f"{name}さんは{age}歳です。"
print(message)  # 太郎さんは20歳です。

# 計算も可能
a = 5
b = 3
result = f"{a} + {b} = {a + b}"
print(result)  # 5 + 3 = 8

真偽型(Boolean)

ブーリアン型は、真(True)または偽(False)の2つの値のみを取るデータ型です。
条件分岐やループ処理などでよく使用されます。

# ブーリアン型の例
is_raining = True
is_sunny = False
is_adult = age >= 20  # 条件式の結果を格納

ブーリアン演算

ブーリアン値に対して論理演算を行うことができます。ブーリアン演算(Boolean演算)とは、真(True)か偽(False)の2つの値を使って行う論理演算のことです。

# 論理演算の例
is_weekend = True
is_holiday = False

# and(論理積):両方がTrueの場合のみTrue
can_rest = is_weekend and is_holiday  # False

# or(論理和):少なくとも一方がTrueの場合True
can_rest = is_weekend or is_holiday   # True

# not(否定):TrueとFalseを反転
is_weekday = not is_weekend  # False

比較演算子

ブーリアン値は、比較演算子を使用して生成されることが多いです。

# 比較演算子の例
x = 10
y = 5

print(x == y)   # False(等しい)
print(x != y)   # True(等しくない)
print(x > y)    # True(より大きい)
print(x < y)    # False(より小さい)
print(x >= y)   # True(以上)
print(x <= y)   # False(以下)

型の確認と変換

型の確認

type()関数を使用して、変数のデータ型を確認できます。

# 型の確認
name = "山田太郎"
age = 25
is_student = True
height = 170.5

print(type(name))      # 
print(type(age))       # 
print(type(is_student)) # 
print(type(height))    # 

型の変換

データ型を変換するための関数があります。

# 型変換の例
number_str = "100"
number_int = int(number_str)  # 文字列を整数に変換
print(number_int)  # 100

float_str = "3.14"
float_num = float(float_str)  # 文字列を浮動小数点数に変換
print(float_num)  # 3.14

number = 50
number_str = str(number)  # 数値を文字列に変換
print(number_str)  # "50"

bool_str = "True"
bool_value = bool(bool_str)  # 文字列をブーリアンに変換
print(bool_value)  # True

# 注意:空文字列や0はFalseと評価される
print(bool(""))    # False
print(bool(0))     # False
print(bool("0"))   # True(文字列の"0"は空ではない)

変数の再代入と動的型付け

Pythonは動的型付け言語です。
これは、変数の型を宣言する必要がなく、同じ変数に異なる型の値を代入できることを意味します。

# 動的型付けの例
variable = 10
print(variable)  # 10
print(type(variable))  # 

variable = "文字列"
print(variable)  # 文字列
print(type(variable))  # 

variable = True
print(variable)  # True
print(type(variable))  # 

定数の概念

Pythonには厳密な定数の概念はありませんが、大文字の変数名を使用して定数であることを示す慣習があります。

# 定数の例(慣習的に大文字を使用)
PI = 3.14159
MAX_USERS = 100
DEFAULT_TIMEOUT = 30

変数のスコープ

変数が参照できる範囲のことをスコープと言います。
詳細は関数の学習時に詳しく学びますが、基本的には変数が定義された場所によって参照できる範囲が決まります。

# グローバルスコープの変数
global_variable = "グローバル"

def my_function():
    # ローカルスコープの変数
    local_variable = "ローカル"
    print(global_variable)  # グローバル変数は参照可能
    print(local_variable)   # ローカル変数も参照可能

my_function()
print(global_variable)  # グローバル変数は参照可能
# print(local_variable)  # エラー:ローカル変数は参照できない

まとめ

この講義ではPythonの基本的な変数とデータ型について学びました。
変数はデータを格納する箱のような役割を果たします。

主なデータ型には、整数(int)・浮動小数点数(float)・複素数(complex)といった数値型、テキストを扱う文字列型(str)、TrueまたはFalseの値を取るブーリアン型(bool)があります。

データ型はtype()関数で確認可能です。Pythonは動的型付け言語であるため、変数の型を明示的に宣言する必要がない点が特徴です。

これらの基礎概念は、これから学ぶ条件分岐、ループ処理、関数など、すべてのプログラミング概念の土台となります。しっかり理解して次のステップに進みましょう。


演習問題

初級問題(3問)

問題1
以下のコードを実行したとき、変数abのデータ型は何になりますか?
また、実行結果はどうなりますか?

a = 10 + 5
b = "10" + "5"
print(a)
print(b)

問題2
半径が5cmの円の面積を計算するプログラムを作成してください。
円周率は3.14とします。結果は「円の面積は○○平方cmです」と表示してください。

問題3
以下の条件を満たすプログラムを作成してください。

  • 変数ageに自分の年齢を数値で代入
  • 変数nameに自分の名前を文字列で代入
  • これらの変数を使って「私は○○です。××歳です。」という文章をf-stringで表示

中級問題(6問)

問題4
2つの数値変数xyがあります。これらの値の和、差、積、商を計算し、以下の形式で表示するプログラムを作成してください。

x + y = 結果
x - y = 結果
x * y = 結果
x / y = 結果

問題5
文字列"Python Programming"に対して以下の操作を行うプログラムを作成してください。

  1. 文字列をすべて大文字に変換
  2. 文字列をすべて小文字に変換
  3. 文字列中の"Python"を"Java"に置換
  4. 文字列の長さを表示

問題6
ユーザーから入力された2つの数値の大小関係を比較するプログラムを作成してください。
2つの数値が等しいか、どちらが大きいかを表示してください。

問題7
以下の条件を判断するプログラムを作成してください。

  • 変数temperatureに気温(数値)を代入
  • 気温が25度以上なら「暑い」
  • 気温が10度以上25度未満なら「快適」
  • 気温が10度未満なら「寒い」
  • と表示するプログラムを作成

問題8
与えられた文字列が回文(前から読んでも後ろから読んでも同じ)かどうかを判定するプログラムを作成してください。

回文の例:「たけやぶやけた」

問題9
3つのブーリアン変数abcがあります。
これらの値の組み合わせに対して、(a AND b) OR (NOT c)の真理値表を表示するプログラムを作成してください。

上級問題(3問)

問題10
与えられた秒数を「時間:分:秒」の形式に変換するプログラムを作成してください。
例えば、3665秒は「1:1:5」と表示します。

問題11
西暦年を入力すると、その年がうるう年かどうかを判定するプログラムを作成してください。
うるう年の条件:

  1. 4で割り切れる年はうるう年
  2. ただし、100で割り切れる年はうるう年ではない
  3. ただし、400で割り切れる年はうるう年

問題12
与えられた10進数の数値を2進数(文字列)に変換するプログラムを作成してください。
組込み関数bin()は使用せず、アルゴリズムを自分で実装してください。

解答例

初級問題 解答

問題1

a = 10 + 5
b = "10" + "5"
print(a)
print(b)

実行結果:

15
105

解説:

  • 変数aは整数型(int)で、数値の足し算の結果15が格納されます
  • 変数bは文字列型(str)で、文字列の連結の結果"105"が格納されます
  • +演算子は数値では加算、文字列では連結として機能します

問題2 解答

# 半径と円周率の設定
radius = 5
pi = 3.14

# 円の面積を計算
area = pi * radius * radius

# 結果を表示
print(f"円の面積は{area}平方cmです")

別解:

radius = 5
pi = 3.14
area = pi * radius ** 2
print("円の面積は" + str(area) + "平方cmです")

実行結果:

円の面積は78.5平方cmです

問題3 解答

# 変数に値を代入
age = 25
name = "山田太郎"

# f-stringを使って表示
print(f"私は{name}です。{age}歳です。")

実行結果:

私は山田太郎です。25歳です。

中級問題 解答

問題4 解答

# 2つの数値を設定
x = 15
y = 3

# 計算結果を表示
print(f"{x} + {y} = {x + y}")
print(f"{x} - {y} = {x - y}")
print(f"{x} * {y} = {x * y}")
print(f"{x} / {y} = {x / y}")

実行結果:

15 + 3 = 18
15 - 3 = 12
15 * 3 = 45
15 / 3 = 5.0

問題5 解答

text = "Python Programming"

# 各種文字列操作
upper_text = text.upper()
lower_text = text.lower()
replaced_text = text.replace("Python", "Java")
text_length = len(text)

# 結果を表示
print(f"大文字: {upper_text}")
print(f"小文字: {lower_text}")
print(f"置換後: {replaced_text}")
print(f"文字列の長さ: {text_length}")

実行結果:

大文字: PYTHON PROGRAMMING
小文字: python programming
置換後: Java Programming
文字列の長さ: 18

問題6 解答

# ユーザーからの入力を受け取る
num1 = float(input("1つ目の数値を入力してください: "))
num2 = float(input("2つ目の数値を入力してください: "))

# 大小関係を比較
if num1 == num2:
    print("2つの数値は等しいです")
elif num1 > num2:
    print(f"{num1} は {num2} より大きいです")
else:
    print(f"{num1} は {num2} より小さいです")

実行例:

1つ目の数値を入力してください: 10
2つ目の数値を入力してください: 5
10.0 は 5.0 より大きいです

問題7 解答

# 気温を設定
temperature = 22

# 条件に応じてメッセージを表示
if temperature >= 25:
    print("暑い")
elif temperature >= 10:
    print("快適")
else:
    print("寒い")

別解(ユーザー入力版):

temperature = float(input("気温を入力してください: "))

if temperature >= 25:
    print("暑い")
elif temperature >= 10:
    print("快適")
else:
    print("寒い")

実行結果(temperature = 22の場合):

快適

問題8 解答

def is_palindrome(text):
    # 文字列を反転させて比較
    return text == text[::-1]

# テスト
test_text = "たけやぶやけた"
if is_palindrome(test_text):
    print(f"「{test_text}」は回文です")
else:
    print(f"「{test_text}」は回文ではありません")

別解(関数を使わない版):

text = "たけやぶやけた"
reversed_text = text[::-1]

if text == reversed_text:
    print(f"「{text}」は回文です")
else:
    print(f"「{text}」は回文ではありません")

実行結果:

「たけやぶやけた」は回文です

問題9 解答

print("a\tb\tc\t(a AND b) OR (NOT c)")
print("-" * 40)

# すべての組み合わせを試す
for a in [False, True]:
    for b in [False, True]:
        for c in [False, True]:
            result = (a and b) or (not c)
            print(f"{a}\t{b}\t{c}\t{result}")

実行結果:

a       b       c       (a AND b) OR (NOT c)
----------------------------------------
False False False True
False False True False
False True False True
False True True False
True False False True
True False True False
True True False True
True True True True

上級問題 解答

問題10 解答

def convert_seconds(total_seconds):
    # 時間、分、秒を計算
    hours = total_seconds // 3600
    minutes = (total_seconds % 3600) // 60
    seconds = total_seconds % 60

    return f"{hours}:{minutes}:{seconds}"

# テスト
seconds = 3665
result = convert_seconds(seconds)
print(f"{seconds}秒 = {result}")

別解(ゼロ埋めあり):

def convert_seconds_padded(total_seconds):
    hours = total_seconds // 3600
    minutes = (total_seconds % 3600) // 60
    seconds = total_seconds % 60

    return f"{hours:02d}:{minutes:02d}:{seconds:02d}"

# テスト
seconds = 3665
result = convert_seconds_padded(seconds)
print(f"{seconds}秒 = {result}")

実行結果:

3665秒 = 1:1:5

問題11 解答

def is_leap_year(year):
    # うるう年の条件をチェック
    if year % 400 == 0:
        return True
    elif year % 100 == 0:
        return False
    elif year % 4 == 0:
        return True
    else:
        return False

# ユーザー入力を受け取る
year = int(input("西暦年を入力してください: "))

# 結果を表示
if is_leap_year(year):
    print(f"{year}年はうるう年です")
else:
    print(f"{year}年はうるう年ではありません")

実行例:

西暦年を入力してください: 2024
2024年はうるう年です

問題12 解答

def decimal_to_binary(decimal_num):
    if decimal_num == 0:
        return "0"

    binary_digits = []
    num = decimal_num

    # 2で割り続けて余りを記録
    while num > 0:
        remainder = num % 2
        binary_digits.append(str(remainder))
        num = num // 2

    # 余りを逆順にして結合
    return ''.join(binary_digits[::-1])

# テスト
decimal_number = 25
binary_result = decimal_to_binary(decimal_number)
print(f"10進数 {decimal_number} は 2進数で {binary_result} です")

# 検証(組み込み関数と比較)
print(f"検証: bin({decimal_number}) = {bin(decimal_number)[2:]}")

別解(再帰版):

def decimal_to_binary_recursive(n):
    if n == 0:
        return ""
    return decimal_to_binary_recursive(n // 2) + str(n % 2)

def decimal_to_binary(n):
    if n == 0:
        return "0"
    return decimal_to_binary_recursive(n)

# テスト
decimal_number = 25
binary_result = decimal_to_binary(decimal_number)
print(f"10進数 {decimal_number} は 2進数で {binary_result} です")

実行結果:

10進数 25 は 2進数で 11001 です
検証: bin(25) = 11001