Pythonドリル 問題

変数

演算

文字列

条件分岐

リスト

繰り返し

引数

エラー処理

乱数

辞書

日時

関数

ファイル

その他

変数

変数に整数を代入する

変数 n に整数 42 を代入し,変数 n の値を画面に表示せよ. また,関数type()を用いて変数 n の型を画面に表示せよ.

実装例

n = 42
print(n)
print(type(n))

実行結果

42
<class 'int'>

42は整数(int型)です. int型が代入されたので,変数nの型はint型になります.

変数の型を調べる

変数 x に整数42を代入し,変数 x の型を画面に表示せよ. 続いて,変数 x に3.14を代入し,変数 x の型を画面に表示せよ.

実装例

x = 42
print(type(x))
x = 3.14
print(type(x))

実行結果

<class 'int'>
<class 'float'>

変数の型は代入される値によって決まります. 関数 type() を使うことで,変数の型を調べることができます.

浮動小数点数の誤差

3 を 0.1 倍した値と, 3 を 10 で割った値を,Pythonで計算して結果を表示せよ.

実装例

print(3 * 0.1)
print(3 / 10)

実行結果

0.30000000000000004
0.3

10進数での計算では同じ値になるはずですが,コンピュータは小数を有限桁数の2進数で扱うため,2つの結果は異なる値になります.

変数に文字列を代入する

変数sに文字列ABCを代入し,変数sの値を画面に表示せよ. また,関数type()を用いて変数sの型を画面に表示せよ.

実装例

s = 'ABC'
print(s)

実行結果

ABC

シングルクオーテーション,あるいはダブルクオーテーションで挟まれた部分は文字列(str型)です. str型が代入されたので,変数sの型はstr型になります.

文字列を記述する2種類の方法

変数sに文字列 McDONALDS'S を代入し,変数sの値を画面に表示せよ.

実装例

s = "McDONALDS'S"
print(s)

実行結果

McDONALDS'S

シングルクオーテーションを含む文字列は,ダブルクオーテーションで挟むと容易に記述できます. どうしてもシングルクオーテーションで挟みたい場合は,\'を使って 'McDONALDS\'S' とします.

変数と文字列の違い

変数 animal に文字列 dog を代入せよ.その後,文字列 animal および変数 animal の値を画面にそれぞれ表示せよ.

実装例

animal = 'dog'
print('animal')
print(animal)

実行結果

animal
dog

変数名も文字列も,任意の文字の並びであることから,プログラミング初心者にとっては混乱の元のようです.文字列はシングルクオーテーションあるいはダブルクオーテーションで囲まれており,明確に区別可能です.

型の変換

まず変数 pi に数値 3.1415 を代入し,pi の値を整数型に変換して変数 pi_int に格納した後,pi_int の値を表示せよ. 次に変数 t に数値 -273.15 を代入し,t の値を整数型に変換して変数 t_int に格納した後,t_int の値を表示せよ.

実装例

pi = 3.1415
pi_int = int(pi)
print(pi_int)
t = -273.15
t_int = int(t)
print(t_int)

実行結果

3
-273

変数の型の変換は,型と同名の関数(正確には,型のコンストラクタ)を呼ぶことで行えます.

負の浮動小数点数を整数に変換した際は,値は0に近い方に丸め込まれます.

演算

四則演算

変数 a, b に好きな整数を代入し,a と b の和・差・積・商を計算して画面に表示せよ.

実装例

a = 12
b = 7
print(a + b)
print(a - b)
print(a * b)
print(a / b)

実行結果

19
5
84
1.7142857142857142

和は演算子+,差は演算子-,積は演算子*,商は演算子/で計算します.

演算子/で整数を整数で割った場合,商が整数になる言語もありますが,Pythonでは小数点以下まで計算されます.

除算の商と余り

変数 a, b に好きな整数を代入し,a を b で除した商と剰余を計算して画面に表示せよ.

実装例

a = 12
b = 7
print(a // b)
print(a % b)

実行結果

1
5

整数の商は演算子//で計算します.また剰余は演算子%で計算します.

整数の商を求める演算子//はPythonに特有の演算子です.

ベキ乗

2の64乗を計算して表示せよ.

実装例

print(2 ** 64)

実行結果

18446744073709551616

ベキ乗は演算子**で計算します.

文字列

f文字列を使った変数の値の出力

変数 price に 100 を代入し,f文字列を使わない場合と,f文字列を使う場合,両方の方法で表示せよ.

実装例

price = 100
print('f文字列を使わない:')
print('合計', price, '円')
print('f文字列を使う:')
print(f'合計 {price} 円')

実行結果

f文字列を使わない:
合計 100 円
f文字列を使う:
合計 100 円

Python 3.6で導入されたf文字列を用いると,変数名を出力する(正確には,文字列に変換する)ことが容易になります. 文字列の前に接頭語 f を付けた文字列内では,変数を波括弧 {} で囲むと変数の値が出力されます.変数だけでなく式や関数呼び出しを記述することもできます.

文字列と文字列の連結

文字列 'disney' と文字列 'land' を連結し,変数 park に代入して表示せよ.

実装例

park = 'disney' + 'land'
print(park)

実行結果

disneyland

演算子 + を用いることで,文字列を連結できます.

文字列型の変数と文字列の連結

変数 gnu に文字列 'is not unix' を代入し,文字列 'gnu' の後ろに半角スペースを挟んで変数 gnu を結合して変数 recursive_acronym に代入し,表示せよ.

実装例

gnu = 'is not unix'
recursive_acronym = 'gnu' + ' ' + gnu
print(recursive_acronym)

実行結果

gnu is not unix

文字列型の変数も連結できます.

数値型の変数を文字列と連結

数値 129.3 を変数 w に,文字列 'kg' を変数 unit に格納し,半角スペースを挟んで連結した結果を変数 weight に代入して表示せよ.

実装例

w = 129.3
unit = 'kg'
weight = str(w) + ' ' + unit
print(weight)

実行結果

129.3 kg

変数と文字列の連結は,変数の値が文字列型であれば可能ですが,整数型などの場合は自動的な型変換はなされません.

文字列のスライス

文字列 'supercalifragilisticexpialidocious' を変数 longword に代入し,(最初の文字を0文字目と数えて)5文字目から10文字目を表示せよ.

実装例

longword = 'supercalifragilisticexpialidocious'
print(longword[5:11])

実行結果

califr

スライスを使うと文字列の一部を取り出すことができます. スライスの終端は,その添字に対応する文字を含まない点に注意してください.

文字列のスライスと繰り返し

文字列 'supercalifragilisticexpialidocious' を変数 longword に代入し,5文字ずつ分割して表示せよ.

実装例

num = 5
longword = 'supercalifragilisticexpialidocious'
for start in range(0, len(longword), num):
    print(longword[start:start + num])

実行結果

super
calif
ragil
istic
expia
lidoc
ious

文字列に対して範囲外のインデックスはエラーになりますが,スライスの場合は範囲外を指定してもエラーになりません.

参照: 共通のシーケンス演算

文字列の分割

文字列 'veni, vidi, vici' を変数 caesar に代入し,文字 ',' で単語に分割した後,単語の先頭および末尾の空白を除去してリスト words に格納し,リスト words を表示せよ.

実装例

caesar = 'veni, vidi, vici'
words = []
for word in caesar.split(','):
    words.append(word.strip())
print(words)

実行結果

['veni', 'vidi', 'vici']

文字列の分割はメソッド split() を,先頭および末尾の空白の除去はメソッド strip() を使います.

文字列の分割

文字列 'veni, vidi, vici' を変数 caesar に代入し,文字 ',' で単語に分割した後,単語の先頭および末尾の空白を除去してリスト words に格納し,リスト words を表示せよ.リスト内包表記を用いること.

実装例

caesar = 'veni, vidi, vici'
words = [word.strip() for word in caesar.split(',')]
print(words)

実行結果

['veni', 'vidi', 'vici']

文字列の分割はメソッド split() を,先頭および末尾の空白の除去はメソッド strip() を使います.リスト内包表記を用いると,リストの要素に対する処理を簡潔に記述できます.

文字列の分割と整数値への変換

文字列 '3,1,4,1' を変数 pi_str に代入し,文字 ',' で分割した後,各要素を整数型に変換したリスト pi_int を作成せよ.pi_str と pi_int をそれぞれ表示せよ.

実装例

pi_str = '3,1,4,1'
pi_int = []
for s in pi_str.split(','):
    pi_int.append(int(s))
print(pi_str)
print(pi_int)

実行結果

3,1,4,1
[3, 1, 4, 1]

文字列の分割はメソッド split() を使い,for で各要素を整数に変換してリストに追加する処理を行います.

リストの要素に対して一括処理を施す方法としては,関数 map() を用いる方法や,リスト内包表記を用いる方法があります. リスト内包表記がおすすめです.

文字列の繰り返し

キーボードから入力された文字列を変数 s1 に代入し,s1 を10回繰り返した文字列を変数 s10 に代入し,s1 と s10 を表示せよ.

実装例

s1 = input('文字列 = ')
s10 = s1 * 10
print(s1)
print(s10)

キーボードからの入力

Hi!

実行結果 (実行結果にはキーボードから入力された文字列と改行が表示されていません)

文字列 = Hi!
Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!

文字列に対して乗算の演算子 * を用いて整数を乗じると,指定された回数だけ文字列が反復されます.

条件分岐

条件分岐

1から6の整数 n をランダムに生成し,偶数か奇数かを判定して表示せよ.

実装例

import random

n = random.randint(1, 6)
if n % 2 == 0:
    print(f'{n}は偶数です.')
else:
    print(f'{n}は奇数です.')

実行結果

2は偶数です.

奇数か偶数かは,2で割った余りで判定します.

重複のない複数の条件

1から6の整数 n をランダムに生成し,3か,3より小さいか,3より大きいかを判定して表示せよ.

実装例

import random

n = random.randint(1, 6)
if n == 3:
    print('3です.')
elif n > 3:
    print(f'{n}は3より大きい数です.')
else:
    print(f'{n}は3より小さい数です.')

実行結果

1は3より小さい数です.

elif は else if を意味しています. 3つの条件は重複していないため,2つの条件が不一致であれば,自動的に最後の条件を満たします.

重複のある複数の条件

1から6の整数 n をランダムに生成し,値を表示した後,2の倍数であるか,3の倍数であるかをそれぞれ調べて表示せよ.

実装例

import random

n = random.randint(1, 6)
print(n)
if n % 2 == 0:
    print(f'{n}は2の倍数です.')
if n % 3 == 0:
    print(f'{n}は3の倍数です.')

実行結果

6
6は2の倍数です.
6は3の倍数です.

2つの条件は重複して満たす可能性もあるため,if文を複数並べます. elifを使うと,複数の条件を満たす場合に正しい結果が得られません.

複数の条件を共に満たす

0から99の整数 n をランダムに生成し,n の値を表示した後,50以上の偶数の場合のみ,「あたり」と表示せよ.

実装例

import random

n = random.randrange(100)
print(n)
if n >= 50 and n % 2 == 0:
    print('あたり')

実行結果

45

複数の条件を and で併記すると,両方の条件が満たされたときのみ真になります. 条件は前から評価され,偽になった時点で残りの条件は評価されません.

ある範囲内の値かどうか調べる

0から99の整数 n をランダムに生成し,n の値を表示した後,50以上,70以下の場合のみ,「あたり」と表示せよ.

実装例

import random

n = random.randrange(100)
print(n)
if 50 <= n <= 70:
    print('あたり')

実行結果

84

二つの条件を and で結ぶことでも題意を達成できますが,Python では変数の両側に不等号を記述する数学と類似した記法を使用することができます.

形式的には,連鎖する比較演算子は,個々の比較に分解して and で結ばれます.詳しくはこちらを確認してください.

複数の条件のいずれかを満たす

0から99の整数 n をランダムに生成し,n の値を表示した後,30以下あるいは70以上の場合のみ,「あたり」と表示せよ.

実装例

import random

n = random.randrange(100)
print(n)
if n <= 30 or n >= 70:
    print('あたり')

実行結果

32

二つの条件を or で結ぶと,片方の条件が成立していれば,真になります. 条件は前から評価され,真になった時点で,残りの条件は評価されません.

リスト

リストの生成

整数 2 3 5 7 11 13 を要素に持つリスト primes を生成し,変数 primes を画面に表示せよ.

実装例

primes = [2, 3, 5, 7, 11, 13]
print(primes)

実行結果

[2, 3, 5, 7, 11, 13]

リストは [] で生成します. 要素を , で区切って並べます.

同じ値を複数個持つリストの生成

25個の0を要素に持つリスト nums を生成し,変数 nums を画面に表示せよ.

実装例

nums = [0] * 25
print(nums)

実行結果

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

リストに対して乗算の演算子 * を用いて整数を乗じると,指定された回数だけ要素が反復されたリストが生成されます.

リストの要素数

整数 2 3 5 7 11 13 を要素に持つリスト primes を生成し,要素数を画面に表示せよ.

実装例

primes = [2, 3, 5, 7, 11, 13]
print(len(primes))

実行結果

6

リストの要素数は関数 len() で取得できます.

リストへの要素の追加

空リスト happies を作成し,整数 1 7 10 を1つずつ要素に追加せよ.1つ追加するごとにリスト happies の内容と要素数を画面に表示せよ.

実装例

happies = []
happies.append(1)
print(happies)
print(len(happies))
happies.append(7)
print(happies)
print(len(happies))
happies.append(10)
print(happies)
print(len(happies))

実行結果

[1]
1
[1, 7]
2
[1, 7, 10]
3

リストへの要素の追加はメソッド append() で行います. この例はメソッド append() の機能を説明するためのものであり,実践的には happies = [1, 7, 10] でよい.

リストの要素の参照

リスト order = [1, 2, 3, 4] を作成し,最初の要素と最後の要素の値を表示せよ.

実装例

order = [1, 2, 3, 4]
print(order[0])
print(order[-1])

実行結果

1
4

リストの要素は添字で区別します.リストの要素数がNのとき,添字は0からN-1までのため,注意が必要です. マイナスの添字を使うと,後ろからアクセスできます.

リストの要素の変更

リスト order = [1, 2, 3, 4] を作成し,前から2番目(最初の要素を1番目とする)の要素の値を20とした後,order を表示せよ.

実装例

order = [1, 2, 3, 4]
order[1] = 20
print(order)

実行結果

[1, 20, 3, 4]

リストの要素は参照だけでなく変更することができます.

リストの要素の末尾への追加

リスト primes = [2, 3, 5, 7, 11, 13] を作成し,リストの末尾に整数 17 を追加して,primesを表示せよ.

実装例

primes = [2, 3, 5, 7, 11, 13]
primes.append(17)
print(primes)

実行結果

[2, 3, 5, 7, 11, 13, 17]

リストの末尾への要素の追加はメソッド append() で行うことができます.

リストへの要素の挿入

リスト order = [1, 2, 3, 4] を作成し,前から3番目(最初の要素を1番目とする)に整数20を挿入し,orderを表示せよ.

実装例

order = [1, 2, 3, 4]
order.insert(2, 20)
print(order)

実行結果

[1, 2, 20, 3, 4]

リストへの要素の挿入はメソッド insert() で行うことができます. 位置の指定方法に注意してください.

リストの要素の削除(添字で指定)

リスト primes = [2, 3, 5, 7, 11, 13] を作成し,前から3番目(最初の要素を1番目とする)の要素を削除した後,primes を表示せよ.

実装例

primes = [2, 3, 5, 7, 11, 13]
primes.pop(2)
print(primes)

実行結果

[2, 3, 7, 11, 13]

添字で要素を指定して削除する場合は,メソッド pop() を使います.

リストの要素の削除(値を指定)

リスト primes = [2, 3, 5, 7, 11, 13] を作成し,リストから整数2を削除した後,primes を表示せよ.

実装例

primes = [2, 3, 5, 7, 11, 13]
primes.remove(2)
print(primes)

実行結果

[3, 5, 7, 11, 13]

値を指定して削除する場合は,メソッド remove() を使います. 同じ値が複数ある場合は,添字の最も小さい要素が削除されます.

リストの連結

リスト primes = [2, 3, 5] と more_primes = [7, 11, 13] を作成し,結合した結果をリスト all_primes として,その内容を表示せよ.

実装例

primes = [2, 3, 5]
more_primes = [7, 11, 13]
all_primes = primes + more_primes
print(all_primes)

実行結果

[2, 3, 5, 7, 11, 13]

リストは演算子 + で連結できます. 連結した結果,新しいリストが返されます.

リストの拡張

リスト primes = [2, 3, 5] の後ろに more_primes = [7, 11, 13] を追加し,primes を表示せよ.

実装例

primes = [2, 3, 5]
more_primes = [7, 11, 13]
primes.extend(more_primes)
print(primes)

実行結果

[2, 3, 5, 7, 11, 13]

リストにリストを加える場合は,メソッド extend() を使用します. リストの内容が更新されます. メソッド append() ではないので注意が必要です.

リストのソート

リスト numbers = [12, 3, 5, 2] の要素を昇順に並べ替えよ.

実装例

numbers = [12, 3, 5, 2]
numbers.sort()
print(numbers)

実行結果

[2, 3, 5, 12]

list型のメソッド sort() は呼び出した対象のリストの内容を直接(in-place)並べ替えます.

リストのソート

リスト numbers = [12, 3, 5, 2] の要素を昇順に並べ替えたリスト ordered_numbers を作成せよ.ordered_numbers を表示し,次にリスト numbers を表示せよ.

実装例

numbers = [12, 3, 5, 2]
ordered_numbers = sorted(numbers)
print(ordered_numbers)
print(numbers)

実行結果

[2, 3, 5, 12]
[12, 3, 5, 2]

組み込み関数 sorted() は呼び出した対象のリストを並べ替えたリストを返します.元のリストの内容は変更しません.

リスト内のある要素の出現回数を数える

リスト choices = ['D', 'B', 'C', 'D', 'B', 'D', 'A', 'A', 'C', 'A'] 内の要素 'A' の出現回数を数えよ.

実装例

choices = ['D', 'B', 'C', 'D', 'B', 'D', 'A', 'A', 'C', 'A']

num = 0
for c in choices:
    if c == 'A':
        num += 1
print(num)

print(choices.count('A'))

実行結果

3
3

個数を数える基本的な方法は,個数を保持する変数の値を0に初期化したうえで,対象の要素が条件に該当するかを確認し,該当していれば個数を1増やすというものです.

別の方法として,リスト型のメソッド count() を使うと,リスト内の要素の出現回数を数えることができます. 簡単ですが,1回実行するとリストの全要素を確認するため,複数の種類を数える場合には時間がかかる可能性があります.

メソッドを使わない方法を理解しておき,適切に使い分けましょう.

リスト内の要素の最大値を求める

リスト prices = [520, 400, 800, 820, 875, 980, 300] 内の要素の最大値を求めよ.

実装例

prices = [520, 400, 800, 820, 875, 980, 300]

max_price = 0
for price in prices:
    if price > max_price:
        max_price = price
print(f'最大値 = {max_price}')

実行結果

最大値 = 980

最大値(より一般化すればある基準で要素を比較した際に最も優れた要素)を求める方法は,最大値を保持する変数の値を要素が取り得ない小さな値(もしくはリストの最初の要素の値)に初期化したうえで,対象の要素と順に比較し,保持している値よりも大きければ変数を更新するというものです.

組み込み関数 max() を使うと,上記の処理を行ってくれますが,応用範囲の広い順番に確認していく方法を理解しておきましょう.

繰り返し

for文による繰り返し

整数 6, 28, 496, 8128 を要素に持つリスト numbers を作成し,for文を用いて要素を1行ずつ表示せよ.

実装例

numbers = [6, 28, 496, 8128]
for n in numbers:
    print(n)

実行結果

6
28
496
8128

for文は,リスト(※)の要素を1つずつ取り出し,要素に対する繰り返し処理を行う.

(※) シーケンス(文字列,タプル,リスト)や,他の反復(イテレート; iterate)可能なオブジェクトに対して使用できます.

for文による繰り返し

文字列 12:34:56 を文字 : で分割してリスト hms に格納し,for文を用いて要素を1行ずつ表示せよ.

実装例

hms = '12:34:56'.split(':')
for s in hms:
    print(s)

実行結果

12
34
56

二重ループ

リスト a = [2, 3, 5] と,リスト b = [7, 11, 13] について,各リストから1つずつ整数を選んで乗算する.全ての場合の積の値を出力せよ.

実装例

a = [2, 3, 5]
b = [7, 11, 13]
for n in a:
    for m in b:
        print(n * m)

実行結果

14
22
26
21
33
39
35
55
65

カウンタを用いた for 文の使用

range() を用いて,0 から 10 までの整数を1行ずつ表示せよ.

実装例

for n in range(11):
    print(n)

実行結果

0
1
2
3
4
5
6
7
8
9
10

range() を引数1つで実行すると,0から(引数-1)の整数が順次得られます.

※なお range() は組み込み関数として紹介されますが,実際は range 型のインスタンスを生成するコンストラクタです.

range() の活用 - 0でない値から開始

range() を用いて,2 から 8 までの整数を1行ずつ表示せよ.

実装例

for n in range(2, 9):
    print(n)

実行結果

2
3
4
5
6
7
8

range() を引数2つで実行すると,第1引数から(第2引数-1)の整数が順次得られます.

range() の活用 - 1でない間隔

range() を用いて,2 から 8 までの偶数を1行ずつ表示せよ.

実装例

for n in range(2, 10, 2):
    print(n)

実行結果

2
4
6
8

range() を引数3つで実行すると,第1引数から(第2引数-1)までの第3引数間隔の整数が順次得られます. 終値は第2引数未満の整数です. 第2引数のそのものの値は出力されないため,第2引数は9でも10でも結果は同じになります.

range() の活用 - 降順

range() を用いて,5 から 1 までの整数を1行ずつ表示せよ.

実装例

for n in range(5, 0, -1):
    print(n)

実行結果

5
4
3
2
1

range() の第3引数は負の整数にもできます. 負の場合の終値は第2引数よりも大きい整数になります.第2引数が出力されない点は,昇順の場合と同じです.

range() の活用 - 非整数のステップ

0.0, 0.1, 0.2, ..., 1.0 の平方根を表示せよ.

実装例

import math

for n in range(11):
    x = n / 10
    print(x, math.sqrt(x))

実行結果

0.0 0.0
0.1 0.31622776601683794
0.2 0.4472135954999579
0.3 0.5477225575051661
0.4 0.6324555320336759
0.5 0.7071067811865476
0.6 0.7745966692414834
0.7 0.8366600265340756
0.8 0.8944271909999159
0.9 0.9486832980505138
1.0 1.0

range() の引数は整数である必要があります. 浮動小数点数が使えない理由は,浮動小数点を使用した場合には演算の誤差により予期せぬ挙動をする可能性があるためと思われます.

for で繰り返すブロック内でカウンタが不要な場合

文字列 hello を10回表示せよ.

実装例

for _ in range(10):
    print('hello')

実行結果

hello
hello
hello
hello
hello
hello
hello
hello
hello
hello

range() を使って繰り返し回数を指定するがカウンタの値自体は不要な場合は,Pythonの通例として変数 _ を使います. 強制ではありませんが,値を使用しないことが変数名により示される点が有用です.

条件が満たされている間繰り返す

100から7を引いた値を表示する処理を,表示する値が0以上の間だけ行え.

実装例

n = 100
while n >= 0:
    print(n)
    n -= 7

実行結果

100
93
86
79
72
65
58
51
44
37
30
23
16
9
2

条件が満たされている間繰り返し処理を行いたい場合は,while 文を使います.

繰り返しの中断

キーボードから入力された英文字列を大文字に変換して表示する処理を,無限に繰り返すプログラムを,while 文を用いて作成せよ.ただし,文字列として q が入力された場合は,大文字変換後の文字列を表示した後に終了するようにせよ.

実装例

while True:
    s = input()
    print(s.upper())
    if s == 'q':
        break

キーボードからの入力

hello
How are you?
q

実行結果 (実行結果にはキーボードから入力された文字列と改行が表示されていません)

HELLO
HOW ARE YOU?
Q

条件部に真偽値の True を与えると,条件が常に成り立つため,処理が無限に繰り返されます.繰り返しを終了するためには,break 文を使います.

繰り返しの先頭に戻る

1から順に整数を加算する処理を,加える整数とその時点での合計を表示しながら,合計が100以上になるまで続けよ.ただし,5の倍数の整数は加算しないようにせよ.

実装例

n = 0
s = 0
while s < 100:
    n += 1
    if n % 5 == 0:
        continue
    s += n
    print(n, s)

実行結果

1 1
2 3
3 6
4 10
6 16
7 23
8 31
9 40
11 51
12 63
13 76
14 90
16 106

continue文を用いると,繰り返しブロックの残りの処理を実行せずに,繰り返しの再訴に戻ります.

引数

コマンドライン引数

コマンドライン引数を全て表示せよ.

実装例

import sys

for s in sys.argv:
    print(s)

コマンドライン引数

a b c

実行結果

m0540.py
a
b
c

コマンドライン引数を得るためには,モジュール sys を import し,リスト sys.argv を参照します. リスト sys.argv の先頭には,実行されるPythonスクリプトのファイル名自身が入ります.

コマンドライン引数

コマンドライン引数について,それぞれが何番目の引数であるかと共に,全て表示せよ.

実装例

import sys

for i, v in enumerate(sys.argv):
    print(f'sys.argv[{i}] = {v}')

コマンドライン引数

a b c

実行結果

sys.argv[0] = m0541.py
sys.argv[1] = a
sys.argv[2] = b
sys.argv[3] = c

enumerate() は,カウントと値のタプルを返します.リストの何番目を処理しているかを知りたい場合に利用します.

コマンドライン引数

コマンドライン引数から2つの整数を得て,その和を求めよ.

実装例

import sys

a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)

コマンドライン引数

2 3

実行結果

5

コマンドライン引数は文字列型として得られるため,数値として使用するためには,関数 int() や float() を用いて適切な型変換を行う必要があります.

エラー処理

不適切なコマンドライン引数

コマンドライン引数から2つの整数を得て,その和を求めるプログラムを作成し,数値として小数を入力した場合の挙動を調べよ.

実装例

import sys

a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)

コマンドライン引数

0.1 0.2

実行結果

Traceback (most recent call last):
  File "z:\lecture\PROG1\quiz\060エラー処理\m0550.py", line 17, in <module>
    a = int(sys.argv[1])
ValueError: invalid literal for int() with base 10: '0.1'

文字列を整数に変換する場合に,変換不可能な入力が与えられる可能性があります.

不適切なコマンドライン引数への対応

コマンドライン引数から2つの整数を得て,その和を求めるプログラムを作成し,整数以外の値が入力された際には,「入力が不適切です」というメッセージを出力するようにせよ.

実装例

import sys

try:
    a = int(sys.argv[1])
    b = int(sys.argv[2])
except ValueError:
    print('整数を入力してください.')
    sys.exit()
print(a + b)

コマンドライン引数

0.1 0.2

実行結果

整数を入力してください.

変換不可能な入力のように,通常の条件分岐では対応が難しい場合には,例外処理を用います.

不適切なコマンドライン引数の個数への対応

1つめのコマンドライン引数として与えられた文字列を,2つめのコマンドライン引数として与えられた回数,繰り返し表示せよ.コマンドライン引数の個数のチェックと,回数として使用できない不適切な入力に対して適切に処理せよ.

実装例

import sys

if len(sys.argv) != 3:
    print('1番目の引数として文字列,2番目の引数として整数を与えてください.')
    sys.exit()
s = sys.argv[1]
try:
    n = int(sys.argv[2])
except ValueError:
    print('2番目の引数は整数である必要があります.')
    sys.exit()
for _ in range(n):
    print(s)

コマンドライン引数

hello

実行結果

1番目の引数として文字列,2番目の引数として整数を与えてください.

コマンドライン引数の個数が不適切な場合は,引数の個数を調べることで対応できるため,例外処理は使用しません. コマンドライン引数の個数をチェックする際には,sys.argv[0] にはスクリプトファイルそのものが入ることに留意してください.

乱数

乱数

-10から10までのランダムな整数を表示せよ.

実装例

import random

print(random.randint(-10, 10))

実行結果

-2

乱数を使う場合は random モジュールを import します. random.randint() は両端の値を含みます. random.randrange() は range() と同じ挙動になり,終端を含みません.

同じ値が連続しない乱数

1から6までのランダムな整数10個からなる乱数列を生成せよ. ただし,同じ値が連続しないようにせよ.

実装例

import random

rand_nums = []
while len(rand_nums) < 10:
    r = random.randint(1, 6)
    if len(rand_nums) > 0 and rand_nums[-1] == r:
        continue
    rand_nums.append(r)
print(rand_nums)

実行結果

[4, 6, 3, 2, 6, 1, 4, 6, 4, 3]

リストに乱数を追加していく際に,末尾の要素と等しくないか確認します. 末尾の要素を調べる際に,空リストでないかをまず確認しています.

出現回数が等しい乱数列

0から4までの数字が2回ずつ入った乱数列を発生させて表示せよ.

実装例

import random

rand_list = list(range(5)) * 2
random.shuffle(rand_list)
print(rand_list)

実行結果

[0, 2, 2, 4, 3, 4, 1, 0, 3, 1]

まず0から4までの連番を list(range(5)) で発生させ,そのリストを2回繰り返した後,シャッフルします.

リストの要素のシャッフルは random.shuffle() で行うことができます. random.shuffle() は引数として与えられたリストの内容を直接シャッフルします. シャッフルされた結果が返値として得られるのではないため,注意が必要です.

ランダムな数字のペア

0から3までの数字のペア(ただし,同じ値は除く)の全ての組をシャッフルして表示せよ.

実装例

import random

pairs = []
for i in range(5):
    for j in range(i + 1, 5):
        pairs.append((i, j))
random.shuffle(pairs)
print(pairs)

実行結果

[(0, 2), (2, 4), (2, 3), (1, 2), (1, 4), (0, 1), (3, 4), (1, 3), (0, 3), (0, 4)]

2つの数字の組をタプルとして表すものとし,重複のない全ての組み合わせを発生させます.random.shuffle() を使ってシャッフルします.

一対比較法による評価を行う際の試行順序の決定を想定しています.

辞書

辞書の生成と内容の表示

キーと値の組として,キー: mouse - 値: ねずみ,キー: cow - 値: 牛,キー: tiger - 値: 虎 を持つ辞書 d を生成し,辞書 d の内容を「キー = 値」の形式で1行ずつ表示せよ.

実装例

d = {'mouse': 'ねずみ', 'cow': '牛', 'tiger': '虎'}
for k in d:
    print(f'{k} = {d[k]}')

実行結果

mouse = ねずみ
cow = 牛
tiger = 虎

辞書は {} で生成します. 要素へのアクセスは [] で行います.

辞書の要素数

キーと値の組として,キー: mouse - 値: ねずみ,キー: cow - 値: 牛,キー: tiger - 値: 虎 を持つ辞書 d を生成し,辞書 d の内容を「キー = 値 (?個中?個目)」の形式で1行ずつ表示せよ.

実装例

d = {'mouse': 'ねずみ', 'cow': '牛', 'tiger': '虎'}
for i, k in enumerate(d):
    print(f'{k} = {d[k]} ({len(d)}個中{i + 1}個目)')

実行結果

mouse = ねずみ (3個中1個目)
cow = 牛 (3個中2個目)
tiger = 虎 (3個中3個目)

辞書の要素数は関数 len() で得ることができます.

辞書のキーの存在

辞書 d = {'mouse': 'ねずみ', 'cow': '牛', 'tiger': '虎'} について,リスト animals = ['mouse', 'tiger', 'dragon'] の各要素がキーとして存在しているかを調べ,存在している場合はキーの値を,存在していない場合は「登録されていません」と表示せよ.

実装例

d = {'mouse': 'ねずみ', 'cow': '牛', 'tiger': '虎'}
animals = ['mouse', 'tiger', 'dragon']
for animal in animals:
    if animal in d:
        print(f'キー {animal} の値は {d[animal]} です.')
    else:
        print(f'キー {animal} は登録されていません.')

実行結果

キー mouse の値は ねずみ です.
キー tiger の値は 虎 です.
キー dragon は登録されていません.

辞書にキーが登録されているかどうかは,演算子 in で調べることができます.

演算子 in はリストや文字列などでも使うことができます.

辞書の値の更新

辞書 prices = {'hamburger': 150, 'cheeseburger': 180, 'double cheeseburger': 370} について,値を10%加えよ.ただし.結果は整数とすること.

実装例

prices = {'hamburger': 150, 'cheeseburger': 180, 'double cheeseburger': 370}
for key in prices:
    prices[key] = int(prices[key] * 1.1)
print(prices)

実行結果

{'hamburger': 165, 'cheeseburger': 198, 'double cheeseburger': 407}

辞書の要素に代入すると値が更新されます.

辞書の要素の削除

辞書 prices = {'hamburger': 150, 'cheeseburger': 180, 'double cheeseburger': 370} から,キー 'hamburger' を削除せよ.

実装例

prices = {'hamburger': 150, 'cheeseburger': 180, 'double cheeseburger': 370}
del prices['hamburger']
print(prices)

実行結果

{'cheeseburger': 180, 'double cheeseburger': 370}

辞書の要素を削除するには,del 文あるいは辞書型のメソッド pop() を使います.

辞書の要素の削除とfor文

辞書 prices = {'hamburger': 150, 'cheeseburger': 180, 'double cheeseburger': 370} から,値が 200 以下の要素を削除せよ.

実装例

prices = {'hamburger': 150, 'cheeseburger': 180, 'double cheeseburger': 370}
for key in list(prices):
    if prices[key] <= 200:
        del prices[key]
print(prices)

実行結果

{'double cheeseburger': 370}

for文で繰り返しながら辞書の要素を削除すると,繰り返し対象となる辞書が途中で変更されるため,正しく動作しません.実行すると,繰り返し途中で辞書のサイズが変更されました,というエラーが出て停止します.

辞書のキーを一旦リストに変換して,繰り返しの対象を辞書自体でなくすることで,繰り返し途中での辞書の要素の削除を実現できます.

辞書の要素の値に基づく削除

辞書 mice = {'ハツカネズミ': 'mouse', 'ハリネズミ': 'hedgehog', 'ジャコウネズミ': 'musquash', ' アカネズミ': 'wood mouse'} から,値の文字列に 'mouse' を含む要素を削除せよ.

実装例

mice = {'ハツカネズミ': 'mouse', 'ハリネズミ': 'hedgehog', 'ジャコウネズミ': 'musquash', '   アカネズミ': 'wood mouse'}
for key in list(mice):
    if 'mouse' in mice[key]:
        del mice[key]
print(mice)

実行結果

{'ハリネズミ': 'hedgehog', 'ジャコウネズミ': 'musquash'}

辞書のサイズが変わる処理は,繰り返しの中で行えないため,まずキーのリストを作ります.キーから値を得て,値の文字列中に当該文字列があるかをチェックします.

辞書のビューの利用

辞書 prices = {'hamburger': 150, 'cheeseburger': 180, 'double cheeseburger': 370} について,キーを1つずつ,値を1つずつ,キーと値の組を1つずつ,それぞれ表示せよ.

実装例

prices = {'hamburger': 150, 'cheeseburger': 180, 'double cheeseburger': 370}
for k in prices.keys():
    print(k)
for v in prices.values():
    print(v)
for k, v in prices.items():
    print(k, v)

実行結果

hamburger
cheeseburger
double cheeseburger
150
180
370
hamburger 150
cheeseburger 180
double cheeseburger 370

辞書型のメソッド keys(),values(),items() を使います. items() はキーと値の組をタプルで返すため,2つの変数で受けています.

日時

曜日を調べる

1600年10月21日が何曜日であったかを調べよ.

実装例

import datetime

day = datetime.date(1600, 10, 21)
print(day)
print(day.weekday())

実行結果

1600-10-21
5

date型のインスタンスdayを初期化メソッドdatetime.date()を用いて生成し,メソッドweekday()で曜日を取得します. メソッドweekday()は0から6の値を返します. 0が月曜,1が火曜,6が日曜です.

今日の日付を調べる

今日が何年何月何日であるかを表示せよ.

実装例

import datetime

day = datetime.date.today()
print(day)

実行結果

2023-10-02

date型のインスタンスdayをメソッドdatetime.date.today()を用いて生成します. このメソッドは実体がなくても使えるメソッドです.

datetime型のインスタンスの作成

1969年7月21日5時17分40秒を表すdatetime型のインスタンスapollo_11を作成し,中身を表示せよ.

実装例

import datetime

apollo_11 = datetime.datetime(1969, 7, 21, 5, 17, 40)
print(apollo_11)

実行結果

1969-07-21 05:17:40

初期化メソッドdatetime.datetime()を用いて生成します. datetime.datetimeとdatetimeが続けて登場しますが,前はモジュール名,後ろはデータ型名です.

今の日時を調べる

今が何年何月何日何時何分何秒であるかを表示せよ.

実装例

import datetime

now = datetime.datetime.now()
print(now)

実行結果

2023-10-02 14:27:16.172229

現在の日時を表すdatetime型のインスタンスを得るためには,datetime型のメソッドnow()を使います.

経過時間の計算

2022年が何日であるかを表示せよ.

実装例

import datetime

first_day_2022 = datetime.date(2022, 1, 1)
first_day_2023 = datetime.date(2023, 1, 1)
days_2022 = first_day_2023 - first_day_2022
print(days_2022)

実行結果

365 days, 0:00:00

date型間で減算を行うと,経過日数が計算できます. 減算の演算子 - がdate型に適用可能なのは,date型が演算子をオーバーロード(operator overloading; 上書き定義)しているためです.

関数

関数の定義

引数の値を2倍した値を返す関数 double() を作成せよ.適当な引数を与えて関数 double() を呼び出し,返値を表示せよ.

実装例

def double(x):
    return x * 2

y = double(10)
print(y)

実行結果

20

関数は def 文で定義します. 自作した関数の呼び出しは組み込み関数と同じように行えます. 関数からの返値は return 文で返します.

例では関数の返値を変数に一度代入していますが,print(double(10)) のように返値をそのまま利用することもできます. 関数呼び出しがまるごと返値に置き換わると考えるとわかりやすいかもしれません.

引数の無い関数の定義

呼び出すと1から6までの整数のいずれかをランダムに返す関数 dice() を作成せよ. 関数 dice() を用いて,2個の6面体サイコロを振り出た目の和を返せ.

実装例

import random

def dice():
    return random.randint(1, 6)

print(dice() + dice())

実行結果

2

数学の関数と異なり,プログラミング言語における関数は引数が無い場合や返値が無い場合があります. 関数 = function = 機能,と考えるとよいでしょう.

返値の無い関数の定義

引数に与えられた文字列を,まずそのまま表示し,次に逆順にして表示する関数 forward_back() を作成せよ. 関数 forward_back() を適当な引数で呼び出せ.

実装例

def forward_back(s):
    print(s)
    print(s[::-1])

forward_back('あいうえお')

実行結果

あいうえお
おえういあ

返値が無い関数は意味がないように思うかもしれませんが,画面に何かを表示するなど,ひとまとまりの機能を実行することに使われる一般的な形態です.

文字列の反転は,スライスを使う方法の他に,組み込み関数reversed()を使った後に文字列型のメソッド join() を使う方法 ''.join(reversed(s))) もありますが,面倒なのでスライスを使う方法を知っておきましょう.

複数の引数を取る関数

引数を3個とり,第1引数として与えられた数値を,第2引数未満であれば第2引数に,第3引数より大きければ第3引数に,そうでなければそのままにして返す関数 constrain() を作成せよ. -4から4までの整数について,3乗を計算し,-10以上10未満の範囲に値を制限して表示せよ.

実装例

def constrain(x, min_value, max_value):
    if x < min_value:
        return min_value
    elif x > max_value:
        return max_value
    else:
        return x

for n in range(-4, 5):
    print(constrain(n ** 3, -10, 10))

実行結果

-10
-10
-8
-1
0
1
8
10
10

関数は引数を複数個取ることができます.

複数の返値を返す関数

引数を2個とり,和と積を返す関数 add_mul() を作成せよ. 適当な引数で関数 add_mul() を呼び出し,結果を表示せよ.

実装例

def add_mul(a, b):
    return a + b, a * b

print(add_mul(2, 3))

実行結果

(5, 6)

返値としてタプルを返すことで,関数の処理結果として複数の値を返すことができます.

タプルは()ではなく,で定義されるため,return 文に()は不要です.

引数や返値が複雑な関数

3次元ベクトル(x, y, zの3成分のタプル)2個を引数とし,内積(スカラー)と外積(ベクトル=3成分のタプル)を返す関数 dot_cross() を作成せよ. 適当な引数で関数 dot_cross() を呼び出し,結果を表示せよ.

実装例

def dot_cross(p, q):
    dot = p[0] * q[0] + p[1] * q[1] + p[2] * q[2]
    x = p[1] * q[2] - p[2] * q[1]
    y = p[2] * q[0] - p[0] * q[2]
    z = p[0] * q[1] - p[1] * q[0]
    cross = (x, y, z)
    return dot, cross

print(dot_cross((1, 2, 3), (-3, -2, -4)))

実行結果

(-19, (-2, -5, 4))

引数には複雑な引数を与えることもできます.

この問題では練習のために内積や外積を計算する関数を作成していますが,実践ではモジュール NumPy を用いることが適切です.

リストを引数にとる関数

与えられたリストの要素を,全て二乗したリストを返す関数 squared() を作成せよ. 適当な引数で関数 squared() を呼び出し,結果を表示せよ.

実装例

def squared(l):
    s = []
    for x in l:
        s.append(x * x)
    return s

l = [1, 3, 5, 3.14]
print(l)
print(squared(l))

実行結果

[1, 3, 5, 3.14]
[1, 9, 25, 9.8596]

関数から関数を呼び出す

呼び出すと1から6までの整数のいずれかをランダムに返す関数 dice() を作成せよ. 次に,引数に与えられた回数だけ dice() を呼び出して,得られた値の和を返す関数 many_dice(n) を作成せよ. 最後に many_dice() を異なる引数で複数回呼び出し,返値を表示せよ.

実装例

import random

def dice():
    return random.randint(1, 6)

def many_dice(n):
    s = 0
    for _ in range(n):
        s += dice()
    return s

print(many_dice(3))
print(many_dice(5))

実行結果

7
19

関数から関数を呼び出して使うこともできます. ソースコードに複数回登場する処理は,関数にする方がよいことが多々あります.

英単語 dice は本来は単数形 die の複数形ですが現在では単数にも使われる場合が多いそうです.

fromを使ったimport

モジュール math で定義されている自然対数を求める関数 log() を,math.log() ではなく log() で使用できるようにし,log(2)+log(3)を計算して表示せよ.

実装例

from math import log

print(log(2) + log(3))


import math

print(math.log(2))

実行結果

1.791759469228055
0.6931471805599453

fromを使ってモジュール名を省略する場合は,使用する関数のみを選んでimportするようにします. from XX import * を使用すると,モジュールで定義されている全ての関数がモジュール名なしで使えるようになり,一見楽そうに感じられますが,プログラマが把握していない関数や変数の定義によって予期せぬ挙動をする可能性があるため,使用しないようにしましょう(これを名前空間の汚染と言う).

ファイル

ファイルを開いて閉じる

任意の内容のテキストファイル sample.txt をテキストエディタで作成した後,ファイル sample.txt を読み込みモードで開き,得られたファイルオブジェクトを関数 print() で表示した後,ファイルを閉じよ.テキストファイルの内容は英数半角文字で書かれているものとする.

実装例

f = open('sample.txt', 'r')
print(f)
f.close()

実行結果

<_io.TextIOWrapper name='sample.txt' mode='r' encoding='cp932'>

ファイルの読み書きを行うためには,まずファイルを開く必要があります.

モードは省略するとデフォルト値であるテキストファイル('t')の読み込み('r')でオープンされます.

本問ではテキストファイルの内容は英数半角文字で書かれているものとしましたが,読み込むファイルがひらがなや漢字を含む場合,文字のエンコーディングを指定する必要があります.関数 open() のキーワード引数 encoding を utf-8 にすると,広く使われている文字符号化形式 UTF-8 のテキストファイルを正しく読み込むことができます.

with構文を使わない場合,メソッド close() でファイルを閉じるようにします.

ファイルを開いて閉じる(with構文)

任意の内容のテキストファイル sample.txt をテキストエディタで作成した後,with構文を用いて,ファイル sample.txt を読み込みモードで開き,得られたファイルオブジェクトを関数 print() で表示せよ.テキストファイルの内容は英数半角文字で書かれているものとする.

実装例

with open('sample.txt', 'r') as f:
    print(f)

実行結果

<_io.TextIOWrapper name='sample.txt' mode='r' encoding='cp932'>

with構文を使った場合は,ファイルを閉じる処理を明示的に行う必要はありません.

ファイルから1行ずつ読み込む

任意の内容のテキストファイル sample.txt をテキストエディタで作成した後,ファイル sample.txt を読み込みモードで開き,ファイルの内容を1行ずつ表示せよ.

実装例

with open('sample.txt', 'rt') as f:
    for line in f:
        print(line.strip())

実行結果

Enter to grow in wisdom
Depart to serve better thy country and thy kind

ファイルオブジェクトを for 文の in の後ろに記述すると,テキストファイルの内容が1行ずつ文字列として読み込まれます.

ファイルに1行ずつ書き出す

1から10までの階乗を一つずつ計算し,ファイルfactorial.txtに1行ずつ出力せよ.

実装例

with open('factorial.txt', 'wt') as f:
    factorial = 1
    for n in range(1, 11):
        factorial *= n
        f.write(f'{factorial}\n')

ファイル {file}

factorial.txt

ファイルに書き込む場合は,関数 open() の第2引数に,書き込みモードを表す文字列 'w' を指定します.

1行書き出しはメソッド write() を使用します.

その他

キーボードからの入力

キーボードから2つの数値を入力し,その和を求めよ.

実装例

a = int(input('値1 = '))
b = int(input('値2 = '))
print(a + b)

キーボードからの入力

2
3

実行結果 (実行結果にはキーボードから入力された文字列と改行が表示されていません)

値1 = 値2 = 5

標準入力(一般的にはキーボード)から入力を得るためには関数 input() を用います. 入力は末尾の改行が除かれた文字列として得られます. 数値として使用するためには,関数 int() や float() を用いて適切な型変換を行う必要があります.

進数の変換

2進数の1101,8進数の755,16進数のFE0Fを,それぞれ10進数で表示せよ. また,10進数の42を,2進数,8進数,16進数でそれぞれ表示せよ.

実装例

b = 0b1101
o = 0o755
h = 0xFE0F
print(b)
print(o)
print(h)
d = 42
print(bin(d))
print(oct(d))
print(hex(d))

実行結果

13
493
65039
0b101010
0o52
0x2a

プレフィックス(接頭辞) 0b,0o,0xに続けて記述した数値(16進数の場合はアルファベットaからfを含む)は,それぞれ2進数,8進数,16進数の整数と解釈されます.

整数を2進数,8進数,16進数で表記した文字列に変換するには,組み込み関数 bin(),oct(),hex() を使います.