動画

課題

課題(チャプター6:関数)

【基本問題】関数のイメージとビルトイン関数(5問)

問題1

文字列"Python"の文字数をlen関数で求め、その結果をprintで表示するプログラムを作成してください。

期待される出力:

6

ヒント: len(...)は「長さ」を返す関数です。print(len("Python"))の形でも、一度変数に入れてからでも構いません。

問題2

整数100str関数で文字列に変換し、その結果の型を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関数を使って、74215のうち最大値だけを表示するプログラムを作成してください。

期待される出力:

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を呼び出すようにしてください。innerprint("IN")だけを行う関数として定義し、最後にcall_inner()を1回呼び出すプログラムを作成してください(innerの定義はcall_innerよりに書いてください)。

期待される出力:

IN

ヒント: 関数の中から、通常どおり関数名()で別の関数を呼べます。

問題12

関数firstprint("1st")、関数secondprint("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の直後の行は、ifforと同様にインデントが必要です。

問題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

仮引数abを取る関数show_sumを定義し、print(a + b)を実行するようにしてください。位置引数show_sum(3, 7)を呼び出すプログラムを作成してください。

期待される出力:

10

ヒント: 左から順にabに対応づきます。

問題19

仮引数itempriceを取る関数show_priceを定義し、print(f"{item}: {price}円")を実行するようにしてください。キーワード引数show_price(price=120, item="りんご")を呼び出すプログラムを作成してください。

期待される出力:

りんご: 120円

ヒント: キーワード引数なら、定義の並びと違う順でも渡せます。

問題20

仮引数nameageを取る関数introduceを定義し、print(f"{name}、{age}歳です")を実行するようにしてください。まず位置引数introduce("山田", 20)を呼び、続けてキーワード引数introduce(age=18, name="高橋")を呼ぶプログラムを作成してください。

期待される出力:

山田、20歳です
高橋、18歳です

ヒント: 台本のintroduce例と同じ考え方です。

問題21

仮引数xyzを取る関数tripleを定義し、print(x, y, z)を実行するようにしてください。呼び出しは、最初の1つだけ位置引数、残りはキーワード引数でtriple(1, z=30, y=20)とするプログラムを作成してください。

期待される出力:

1 20 30

ヒント: 位置引数を先に、キーワード引数を後に書くのが基本ルールです。

問題22

仮引数textcountを取る関数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

仮引数abを取る関数show_productを定義し、print(a * b)を実行するようにしてください。show_product(6, 7)を呼び出すプログラムを作成してください。

期待される出力:

42

ヒント: 引数の個数と定義の仮引数の個数は一致させます。

【基本問題】戻り値とreturn(10問)

問題26

仮引数abを取る関数addを定義し、a + breturnするようにしてください。total = add(10, 5)としたうえでprint("合計:", total)を実行するプログラムを作成してください。

期待される出力:

合計: 15

ヒント: 台本のadd例と同じです。returnされた値が呼び出し部分に置き換わるイメージです。

問題27

仮引数xを取る関数doubleを定義し、x * 2returnするようにしてください。print(double(21))だけで結果を表示するプログラムを作成してください。

期待される出力:

42

ヒント: print(...)の括弧の内側で関数を呼ぶと、戻り値が表示されます。

問題28

仮引数abcを取る関数add_threeを定義し、a + b + creturnするようにしてください。print(add_three(1, 2, 3))を実行するプログラムを作成してください。

期待される出力:

6

ヒント: 戻り値は1つの式でもよいです。

問題29

仮引数nを取る関数is_evenを定義し、nが偶数ならTrue、そうでなければFalsereturnするようにしてください(n % 2 == 0で判定)。print(is_even(4))print(is_even(5))をこの順に実行するプログラムを作成してください。

期待される出力:

True
False

ヒント: 判定結果を呼び出し側で使えるのが戻り値の強みです。

問題30

仮引数nを取る関数clamp_zeroを定義し、n0未満なら0を、そうでなければnreturnするようにしてください。print(clamp_zero(-5))print(clamp_zero(7))をこの順に実行するプログラムを作成してください。

期待される出力:

0
7

ヒント: ifのどちらかで必ずreturnする形にします。

問題31

仮引数nを取る関数earlyを定義し、n0なら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

仮引数abを取る関数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

仮引数xyを取る関数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 = 99print(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 = 1print(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 = 7print(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

仮引数pricetax_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

仮引数texttimesを取る関数repeatを定義し、texttimes回連結した文字列を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

仮引数abを取る関数gcdを、ユークリッドの互除法で最大公約数returnするように定義してください(abは正の整数とします。b == 0ならaを返し、そうでなければgcd(b, a % b)を返す再帰で実装しても、ループで実装しても構いません)。print(gcd(48, 18))を実行するプログラムを作成してください。

期待される出力:

6

ヒント: 関数の戻り値を再び関数に渡す「分割して考える」練習です。入門の範囲を少し広げる発展問題です。

お気軽に無料相談を

オンラインで気軽にご相談ができます。入校お申込みもこちらから。