動画
課題
課題(チャプター6:関数)
【基本問題】関数のイメージとビルトイン関数(5問)
問題1
文字列"Python"の文字数をlen関数で求め、その結果をprintで表示するプログラムを作成してください。
期待される出力:
6
ヒント: len(...)は「長さ」を返す関数です。print(len("Python"))の形でも、一度変数に入れてからでも構いません。
問題2
整数100をstr関数で文字列に変換し、その結果の型をtype関数で調べてprintで表示するプログラムを作成してください。
期待される出力:
<class 'str'>
ヒント: type(str(100))のように入れ子にして渡してもよいです。
問題3
range(5)をlist関数でリストに変換し、そのリストをprintで表示するプログラムを作成してください。
期待される出力:
[0, 1, 2, 3, 4]
ヒント: rangeそのものは「連番を作る関数」で、一覧表示にはlist(...)が便利です。
問題4
print関数に"A"と"B"と"C"をカンマ区切りで渡し、1回のprintで表示するプログラムを作成してください(スペース区切りで1行に出ます)。
期待される出力:
A B C
ヒント: print("A", "B", "C")のように複数の引数を渡せます。
問題5
max関数を使って、7・42・15のうち最大値だけを表示するプログラムを作成してください。
期待される出力:
42
ヒント: max(7, 42, 15)のように渡します。
【基本問題】関数の定義と呼び出し(10問)
問題6
引数のない関数say_hiを定義し、本体でprint("こんにちは!")を実行するようにしてください。定義のあとでその関数を1回呼び出すプログラム全体を書いてください。
期待される出力:
こんにちは!
ヒント: def say_hi():の次の行からインデントして本体を書きます。
問題7
問題6と同じsay_hi関数を定義し、2回連続で呼び出すプログラムを作成してください。
期待される出力:
こんにちは!
こんにちは!
ヒント: say_hi()を2行書けば、同じ処理を2回実行できます。
問題8
関数show_twoを定義し、本体でprint(10)とprint(20)をこの順に実行するようにしてください。定義のあとでshow_two()を1回呼び出すプログラムを作成してください。
期待される出力:
10
20
ヒント: 関数の中は上から順に実行されます。
問題9
関数lineを定義し、本体でprint("-----")を実行するようにしてください。line()を3回呼び出すプログラムを作成してください。
期待される出力:
-----
-----
-----
ヒント: 同じ処理を何度も書かず、呼び出しを繰り返すのが関数の利点です。
問題10
関数count_threeを定義し、本体でfor i in range(3):を使い、ループ内でprint(i)を実行するようにしてください。定義のあとでcount_three()を1回呼び出すプログラムを作成してください。
期待される出力:
0
1
2
ヒント: for文も関数本体の中ではインデントが一段深くなります。
問題11
関数call_innerを定義し、その本体のなかで別の関数innerを呼び出すようにしてください。innerはprint("IN")だけを行う関数として定義し、最後にcall_inner()を1回呼び出すプログラムを作成してください(innerの定義はcall_innerより前に書いてください)。
期待される出力:
IN
ヒント: 関数の中から、通常どおり関数名()で別の関数を呼べます。
問題12
関数firstでprint("1st")、関数secondでprint("2nd")をそれぞれ実行するように定義し、プログラムの実行が上から進むようにfirst()のあとsecond()を呼び出すプログラムを作成してください。
期待される出力:
1st
2nd
ヒント: 呼び出しの順序が、そのまま表示の順序になります。
問題13
次のコードには、関数を定義しただけで呼び出していないため、期待する出力が得られません。greet()の呼び出しを追加して、実行するとHelloと表示されるように修正してください。
def greet():
print("Hello")
# ここに呼び出しを追加する
期待される出力:
Hello
ヒント: defしただけでは本体は実行されません。呼び出し行が必要です。
問題14
次のコードのインデントが壊れています。関数okの本体が正しくブロックになるように直し、ok()を呼び出したときにOKと表示されるプログラムに修正してください。
def ok():
print("OK")
ok()
期待される出力:
OK
ヒント: defの直後の行は、ifやforと同様にインデントが必要です。
問題15
関数bannerを定義し、本体でprint("===")、print("START")、print("===")をこの順に実行するようにしてください。banner()を1回呼び出すプログラムを作成してください。
期待される出力:
===
START
===
ヒント: 複数行の処理を1つの名前にまとめる例です。
【基本問題】引数(仮引数・実引数・位置・キーワード)(10問)
問題16
仮引数nameを1つ取る関数greetを定義し、print(f"{name}さん、こんにちは!")を実行するようにしてください。greet("田中")を呼び出すプログラムを作成してください。
期待される出力:
田中さん、こんにちは!
ヒント: 定義はdef greet(name):の形です。
問題17
問題16と同じgreet関数を定義し、greet("佐藤")とgreet("鈴木")の順に呼び出すプログラムを作成してください。
期待される出力:
佐藤さん、こんにちは!
鈴木さん、こんにちは!
ヒント: 同じ処理で、渡す値だけ変えるのが引数の役割です。
問題18
仮引数aとbを取る関数show_sumを定義し、print(a + b)を実行するようにしてください。位置引数でshow_sum(3, 7)を呼び出すプログラムを作成してください。
期待される出力:
10
ヒント: 左から順にa、bに対応づきます。
問題19
仮引数itemとpriceを取る関数show_priceを定義し、print(f"{item}: {price}円")を実行するようにしてください。キーワード引数でshow_price(price=120, item="りんご")を呼び出すプログラムを作成してください。
期待される出力:
りんご: 120円
ヒント: キーワード引数なら、定義の並びと違う順でも渡せます。
問題20
仮引数nameとageを取る関数introduceを定義し、print(f"{name}、{age}歳です")を実行するようにしてください。まず位置引数でintroduce("山田", 20)を呼び、続けてキーワード引数でintroduce(age=18, name="高橋")を呼ぶプログラムを作成してください。
期待される出力:
山田、20歳です
高橋、18歳です
ヒント: 台本のintroduce例と同じ考え方です。
問題21
仮引数x、y、zを取る関数tripleを定義し、print(x, y, z)を実行するようにしてください。呼び出しは、最初の1つだけ位置引数、残りはキーワード引数でtriple(1, z=30, y=20)とするプログラムを作成してください。
期待される出力:
1 20 30
ヒント: 位置引数を先に、キーワード引数を後に書くのが基本ルールです。
問題22
仮引数textとcountを取る関数repeat_printを定義し、for文でcount回、print(text)を繰り返すようにしてください。repeat_print("Hi", 2)を呼び出すプログラムを作成してください。
期待される出力:
Hi
Hi
ヒント: for _ in range(count):のように回数だけ使う書き方でも構いません。
問題23
仮引数nを取る関数square_starを定義し、print("*" * n)を実行するようにしてください。square_star(5)を呼び出すプログラムを作成してください。
期待される出力:
*****
ヒント: 文字列の*演算で繰り返し表示できます。
問題24
変数user = "花子"を用意し、仮引数nameを取る関数helloを定義してprint(name)を実行するようにしてください。呼び出しはhello(user)とし、実引数に変数を渡す例にしてください。
期待される出力:
花子
ヒント: 実引数にはリテラルだけでなく変数や式の結果も渡せます。
問題25
仮引数aとbを取る関数show_productを定義し、print(a * b)を実行するようにしてください。show_product(6, 7)を呼び出すプログラムを作成してください。
期待される出力:
42
ヒント: 引数の個数と定義の仮引数の個数は一致させます。
【基本問題】戻り値とreturn(10問)
問題26
仮引数aとbを取る関数addを定義し、a + bをreturnするようにしてください。total = add(10, 5)としたうえでprint("合計:", total)を実行するプログラムを作成してください。
期待される出力:
合計: 15
ヒント: 台本のadd例と同じです。returnされた値が呼び出し部分に置き換わるイメージです。
問題27
仮引数xを取る関数doubleを定義し、x * 2をreturnするようにしてください。print(double(21))だけで結果を表示するプログラムを作成してください。
期待される出力:
42
ヒント: print(...)の括弧の内側で関数を呼ぶと、戻り値が表示されます。
問題28
仮引数a、b、cを取る関数add_threeを定義し、a + b + cをreturnするようにしてください。print(add_three(1, 2, 3))を実行するプログラムを作成してください。
期待される出力:
6
ヒント: 戻り値は1つの式でもよいです。
問題29
仮引数nを取る関数is_evenを定義し、nが偶数ならTrue、そうでなければFalseをreturnするようにしてください(n % 2 == 0で判定)。print(is_even(4))とprint(is_even(5))をこの順に実行するプログラムを作成してください。
期待される出力:
True
False
ヒント: 判定結果を呼び出し側で使えるのが戻り値の強みです。
問題30
仮引数nを取る関数clamp_zeroを定義し、nが0未満なら0を、そうでなければnをreturnするようにしてください。print(clamp_zero(-5))とprint(clamp_zero(7))をこの順に実行するプログラムを作成してください。
期待される出力:
0
7
ヒント: ifのどちらかで必ずreturnする形にします。
問題31
仮引数nを取る関数earlyを定義し、nが0ならprint("zero")のあとreturnし、そうでなければprint("other")だけを実行するようにしてください(後半にreturnは書かない)。early(0)とearly(1)をこの順に呼び出すプログラムを作成してください。
期待される出力:
zero
other
ヒント: returnが実行された時点で関数はそこで終わります。
問題32
returnのない関数only_printを定義し、本体でprint("done")だけを実行するようにしてください。result = only_print()のあとでprint(result)を実行するプログラムを作成してください。
期待される出力:
done
None
ヒント: returnがない関数はNoneが返ります。
問題33
仮引数aとbを取る関数subを定義し、result = a - bを計算してreturn resultするようにしてください(台本のaddと同じ形)。print(sub(10, 4))を実行するプログラムを作成してください。
期待される出力:
6
ヒント: 一度変数に入れてからreturnしてもよいです。
問題34
仮引数textを取る関数with_prefixを定義し、return "PREFIX:" + textするようにしてください。msg = with_prefix("test")としてからprint(msg)するプログラムを作成してください。
期待される出力:
PREFIX:test
ヒント: 文字列の加工結果を戻り値で渡す例です。
問題35
仮引数xとyを取る関数max_twoを定義し、大きい方の数をreturnするようにしてください(同じ値ならその値を返す)。print(max_two(3, 8))とprint(max_two(10, 2))をこの順に実行するプログラムを作成してください。
期待される出力:
8
10
ヒント: if x >= y: のように比較して、大きい方(同値ならどちらか)をreturnします。
【基本問題】スコープ(グローバル・ローカル・global)(10問)
問題36
次の期待される出力になるようにコードを書いてください。グローバル変数g = 1を定義し、関数fの中でg = 2としてからprint(g)し、関数の外でprint(g)を実行する構成にしてください。
期待される出力:
2
1
ヒント: 関数内のgはローカルになり、外のgとは別物です(台本のxの例)。
問題37
グローバル変数value = 100を定義し、引数のない関数show_globalを定義して、本体でprint(value)だけを実行するようにしてください(関数内でvalueに代入はしない)。show_global()を呼び出すプログラムを作成してください。
期待される出力:
100
ヒント: 代入しない限り、関数内からグローバル変数を読めることがあります。
問題38
関数local_onlyを定義し、本体でt = 99とprint(t)を実行するようにしてください。local_only()を呼び出したあと、関数の外でprint(t)を実行するとエラーになることを説明用に確認する、という流れのコードは書かず、代わりに「関数内だけで使う」ことを示すため、local_only()の呼び出しだけで99が1行表示されるプログラムを作成してください。
期待される出力:
99
ヒント: tはローカル変数です。外から触らないのが基本です。
問題39
グローバル変数counter = 0を定義し、引数のない関数incを定義して、関数の先頭でglobal counterと書いたうえでcounter = counter + 1を実行するようにしてください。inc()を2回呼び出したあとprint(counter)するプログラムを作成してください。
期待される出力:
2
ヒント: 台本のincrement例です。globalは例外的な手段として使う、と教材でも触れられています。
問題40
グローバル変数name = "外"を定義し、仮引数nameを取る関数showを定義して、本体でprint(name)を実行するようにしてください。show("中")を呼び出したあと、関数の外でprint(name)を実行するプログラムを作成してください。
期待される出力:
中
外
ヒント: 仮引数nameは関数内ではローカルの名前として優先されます。
問題41
グローバル変数a = 10を定義し、仮引数aを取る関数add_tenを定義してreturn a + 10するようにしてください。print(add_ten(5))のあとprint(a)を実行するプログラムを作成してください。
期待される出力:
15
10
ヒント: 関数内のaは渡された実引数の値です。グローバルのaは別です。
問題42
関数shadowを定義し、本体でx = 1、print(x)を実行するようにしてください。グローバルでx = 100を定義し、shadow()を呼び出したあとprint(x)を実行するプログラムを作成してください。
期待される出力:
1
100
ヒント: 関数内のxはローカルで、外のxを上書きしません。
問題43
グローバル変数score = 0を定義し、仮引数pointを取る関数add_scoreを定義します。関数内でglobal scoreを宣言し、score = score + pointを実行するようにしてください。add_score(5)とadd_score(3)を呼び出したあとprint(score)するプログラムを作成してください。
期待される出力:
8
ヒント: 引数で増分を渡し、蓄積先をグローバルで更新する例です。
問題44
関数make_localを定義し、本体でy = 7とprint(y)を実行するようにしてください。グローバルではy = 200を定義し、make_local()を呼び出したあとprint(y)を実行するプログラムを作成してください。
期待される出力:
7
200
ヒント: 関数内のyとグローバルのyは別の変数です。
問題45
グローバル変数msg = "A"を定義し、引数のない関数set_msgを定義して、global msgのあとmsg = "B"を実行するようにしてください。set_msg()を呼び出したあとprint(msg)するプログラムを作成してください。
期待される出力:
B
ヒント: globalにより、関数内の代入がグローバル変数に向きます。
【発展問題】組み合わせ(5問)
問題46
仮引数priceとtax_rate(例: 0.1で10%)を取る関数with_taxを定義し、税込み金額を整数に切り捨ててreturn int(price * (1 + tax_rate))するようにしてください。print(with_tax(1000, 0.1))を実行するプログラムを作成してください。
期待される出力:
1100
ヒント: 引数で「元価格」と「税率」を渡し、戻り値で結果を返します。
問題47
仮引数nを取る関数digit_sumを定義し、0以上999以下の整数nについて、各桁の和をreturnするようにしてください(例: n=123なら6)。文字列に変換せず、割り算と余り(//と%)だけで求めてください。print(digit_sum(123))とprint(digit_sum(5))をこの順に実行するプログラムを作成してください。
期待される出力:
6
5
ヒント: n % 10で一の位を足し、n // 10で次の桁へ進む、を繰り返します。
問題48
仮引数textとtimesを取る関数repeatを定義し、textをtimes回連結した文字列をreturnするようにしてください(return text * timesでよい)。print(repeat("ab", 3))を実行するプログラムを作成してください。
期待される出力:
ababab
ヒント: 戻り値をそのまま表示する小さな合成例です。
問題49
仮引数nを取る関数starsを定義し、1からnまでの各行で、星*を行番号の個数だけ並べた文字列を、1行に1つずつprintするようにしてください(例: n=3なら*、**、***)。stars(3)を呼び出すプログラムを作成してください。
期待される出力:
*
**
***
ヒント: 関数の中にfor i in range(1, n + 1):とprint("*" * i)を書きます。
問題50
仮引数aとbを取る関数gcdを、ユークリッドの互除法で最大公約数をreturnするように定義してください(aとbは正の整数とします。b == 0ならaを返し、そうでなければgcd(b, a % b)を返す再帰で実装しても、ループで実装しても構いません)。print(gcd(48, 18))を実行するプログラムを作成してください。
期待される出力:
6
ヒント: 関数の戻り値を再び関数に渡す「分割して考える」練習です。入門の範囲を少し広げる発展問題です。
