クリックで問題と解答が表示されます。
次のうち、Pythonの説明として正しいものを1つ選びましょう。分からない語句は、Google検索を活用しても構いません。 1. Pythonは生産性が低く、読みづらい言語だ 2. Pythonはオブジェクト指向をサポートしていない 3. Pythonは可読性、生産性、汎用性に優れた静的言語だ 4. Pythonは可読性、生産性、汎用性に優れたスクリプト言語だ
答え:4 可読性、生産性、汎用性(汎用的)というキーワードは抑えておきましょう。 特に可読性は、「実行可能な疑似コード」と呼ばれるほどです。また、人気のある言語ということも覚えておきましょう。
次のうち、ZeroDivisionErrorとなるものを1つ選びましょう。 1. >>> 5 - 0 2. >>> 5 * 0 3. >>> 5 / 0 4. >>> 6 ** 0
答え:3 0で割る行為は許されません。それをした場合のエラーが「ZeroDivisionError」です。 Divisionは分割といった意味で、0で割る、ということがエラー名に表されています。 このように、エラー名はそのエラーの原因や種類がわかるようにつけられているので、覚えておいてください。
「+」「-」「*」「/」記号を1つずつ使い、括弧の中を埋めましょう。 >>> 10 + 5 15 >>> -10 - 10 -20 >>> 10 * 3 / 5 6.0
/ の結果、必ず浮動小数点数になることを抑えてください。
「%」「//」「**」記号を1つずつ使い、括弧の中を埋めましょう。 >>> 10 // 3 3 >>> 10 % 3 1 >>> 5 ** 2 25
// の結果、小数点部分が切り捨てられます。
次のうち、変数名として利用できないものを1つ選びましょう。 1. my_name 2. _name 3. __name 4. __init__ 5. name2 6. False
答え:6 Falseは、予約後なので使えません。 _nameや__nameのような先頭にアンダースコアを含む名前は、今は不思議に思うかもしれませんが使います。 __init__のような、アンダースコア2つを両端につけた名前は少し特殊な意味を持つのですが、こちらも使います。
前後の処理を見ながら、括弧の中に入る数値を考えましょう。 >>> price_a = 10 >>> price_b = 5 >>> price_c = price_a + price_b >>> price_c 15
前後の処理を見ながら、括弧の中に入る記号を考えましょう。 実行結果 3.4.1と表3.4.1が参考になります。 >>> price_a = 10 >>> price_b = 5 >>> price_a += price_b >>> price_a 15
ただの+だと、price_aの値が変化されません。+=を使います。
実行結果4.2.3を参考に、5行目に表示される内容を考えましょう。 >>> name = '' >>> name += '佐藤' >>> name += '太郎' >>> name '佐藤太郎'
「4.3 組み込み関数」を参考に、括弧の中に入る数値、文字列を考えましょう。 >>> int(1.1421356) 1 >>> str(100) '100' >>> len('こんにちは') 5
int関数では小数点部分が無視され、切り捨てによく使います。 str件数の結果は、'100'とシングルクォートがつきます。
表5.1.1を参考にして、次のうち「こんにちは、佐藤さん」と表示されないものを1つ選びましょう。 1. >>> 'こんにちは、{}さん'.format('佐藤') 2. >>> 'こんにちは、{0}さん'.format('佐藤') 3. >>> 'こんにちは、{name}さん'.format(name='佐藤') 4. >>> 'こんにちは、{0}さん'.replace('佐藤')
答え:4 replaceメソッドは、文字列の置換を行います。replace('置換前', '置換後')のように指定する必要があるメソッドなので、4はエラーです。 1, 2, 3はformatメソッドのサンプルとして覚えてください。
実行結果5.2.1を参考にして、括弧の中に入る文字を考えましょう。 >>> text = 'Python' >>> text[0] 'P' >>> text[5] 'n' >>> text[-1] 'n'
0番目から数えることをおさてください。
実行結果5.2.4を参考にして、次のうち「'日雨降'」と表示されるものを1つ選びましょう。 1. >>> '明日は雨が降ります。'[1:3:2] 2. >>> '明日は雨が降ります。'[1:6:2] 3. >>> '明日は雨が降ります。'[:8:2] 4. >>> '明日は雨が降ります。'[:6:2]
解答:2 '明日は雨が降ります。'の1番目にあたる、「日」が最初に表示されれるものとして1と2に絞れます。 [1:3:2]だと、'日'までの文字しか入りません。
リスト6.1.2を参考に、括弧の中に入るリスト、又は文字列を考えましょう。 >>> foods = ['米', 'パン', 'パスタ'] >>> foods[-1] 'パスタ' >>> foods[1] 'パン' >>> foods[1:] ['パン', 'パスタ'] >>> foods[::-1] ['パスタ', 'パン', '米']
実行結果6.1.3を参考に、括弧の中に入るリスト、又は文字列を考えましょう。 >>> languages = [] >>> languages.append('Python') >>> languages.append('Ruby') >>> languages ['Python', 'Ruby'] >>> languages.pop() 'Ruby' >>> languages.remove('Python') >>> languages []
popメソッドは、引数なしだと最後の要素が返され、削除されます。 removeメソッドは、値を返す動作はありません。)
# ではじまるヒントを見ながら、それぞれのnumbersの結果を考えましょう。 >>> numbers = [6, 3, 5, 4, 1, 2] >>> numbers.sort() # 小さいものから並びます。 >>> numbers [1, 2, 3, 4, 5, 6] >>> numbers.sort(reverse=True) # 大きいものから並びます。 >>> numbers [6, 5, 4, 3, 2, 1]
実行結果7.3.1を参考に、namesが['taro', 'siro', 'saburo']となるように括弧の中を埋めましょう。 >>> names = ['taro', 'jiro', 'saburo'] >>> names[1] = 'siro' >>> names ['taro', 'siro', 'saburo']
リストにおける、途中要素への代入の復習です。
# で始まるヒントと実行結果7.4.1を参考にしながら、5行目に表示される内容を考えましょう。 >>> names1 = ['taro', 'jiro', 'saburo'] >>> names2 = names1 >>> names1.clear() # リストの中を空([])にします >>> names2 []
names2 = names1としたので、この2つは実際は同じリストを指し、片方のリストに変更を加えるともう片方にも影響が出ます。 そのため、names1をclear()メソッドで空にするとnames2も空になります。
# で始まるヒントと実行結果7.4.2を参考にしながら、5行目に表示される内容を考えましょう。 >>> names1 = ['taro', 'jiro', 'saburo'] >>> names2 = names1.copy() # リストのコピーを作成します >>> names1.clear() # リストの中を空([])にします >>> names2 ['taro', 'jiro', 'saburo']
names2 = names1.copy()とすることで、中身が同じな、新しい、別のリストが代入されます。
次のうち、タプルの説明として正しいものを1つ選びましょう。 1. タプルはミュータブルで、シーケンス型である 2. タプルはミュータブルで、シーケンス型ではない 3. タプルはイミュータブルで、シーケンス型である 4. タプルはイミュータブルで、シーケンス型ではない
解答:3 変更ができない(イミュータブル)で、[0]のような属性アクセスを許可している(シーケンス型の特権)
次のうちエラーとならないものを1つ選びましょう。 「8.2 リストとの違い」が参考になります。 1. >>> numbers = 10, 5, 4, 1, 3 >>> numbersa.append(100) 2. >>> numbers = (10, 5, 4, 1, 3) >>> numbers.pop() 3. >>> numbers = 10, 5, 4, 1, 3 >>> numbers[4] = 100 4. >>> numbers = (10, 5, 4, 1, 3) >>> numbers[4]
解答:4 appendやpopはリストが持つメソッドですが、タプルにはありません。 3は代入を行いますが、タプルは要素への代入を禁じています。要素へのアクセスだけを行う4が正解です。
「8.3 アンパック」を参考に、それぞれのa, b, c, d, eの結果を考えましょう。 >>> numbers = 10, 5, 4, 1, 3 >>> a, b, c, d, e = numbers >>> a, b, c, d, e (10, 5, 4, 1, 3) >>> a, b, c, d, e = b, c, d, e, a >>> a, b, c, d, e (5, 4, 1, 3, 10)
上手く理解できない場合は、 2行目をa, b, c, d, e = 10, 5, 4, 1, 3 5行目をa, b, c, d, e = 5, 4, 1, 3, 10 と読み替えましょう。 結果は丸括弧がついていなくても、正解としてください。対話モードでは便宜上タプルが丸括弧で表示されますが、プログラム的には間違いではありません。
実行結果9.1.1、実行結果9.1.3を参考に、括弧の中の処理を考えましょう。 >>> report = {'math': 80, 'science': 100} >>> report['japanese'] = 30 >>> report {'math': 80, 'science': 100, 'japanese': 30} >>> report['science'] 100 >>> report['pc'] = 100 >>> report {'math': 80, 'science': 100, 'japanese': 70, 'pc': 100}
表9.2.1のgetメソッドを見ながら、それぞれの結果を考えましょう。 >>> profile = {'age': 18, 'name': 'taro', 'phone': '000-0000-0000'} >>> profile.get('age') 18 >>> profile.get('name') 'taro' >>> profile.get('address', '沖縄') '沖縄'
表9.2.1のupdateメソッドとヒント(#で始まるコメント)を見ながら、括弧の中に入る処理を考えましょう。 >>> profile = {'name': 'sato', 'age': 27, 'phone': '000-0000-0000', 'address': '北海道'} >>> new_profile = {'name': 'yosida', 'age': 28, 'address': '東京'} # ここで新しい辞書を定義... >>> profile.update(new_profile) # updateメソッドで一括変更しましょう。 >>> profile {'name': 'yosida', 'age': 28, 'phone': '000-0000-0000', 'address': '東京'}
ベースとなる辞書.update(他の辞書)という書き方で、2つの辞書を結合できます。 profile = {'name': 'yosida', 'age': 28, 'phone': '000-0000-0000', 'address': '東京'} のようなズルをすることもできますが、これは正解ではありません。
6行目で表示される内容を考えましょう。 >>> numbers = set() >>> numbers.add(1) >>> numbers.add(1) >>> numbers.add(1) >>> numbers {1}
4行目で表示される内容を考えましょう。 >>> numbers = [1, 1, 1, 1, 1] >>> numbers = set(numbers) >>> numbers {1}
集合が同じ値の重複を許さない、という原則を覚えておきましょう。
次のうち、シーケンス型の説明として誤っているものを1つ選びましょう。 1. シーケンス型は、sequence[0] のようにして位置に対応する値を取り出せる。 2. シーケンス型は、sequence[:10]のようにして範囲の値を取り出せる。 3. シーケンス型はリスト、タプル、文字列等が該当し、集合はシーケンス型ではない。 4. シーケンス型は全て、sequence[0] = 100 のような代入をサポートする。
答え:4 1、2、3は正しいです。 イミュータブルなタブルでは途中要素への代入ができません。4が誤りです。
次のうち、ミュータブル型、・イミュータブル型の説明として誤っているものを1つ選びましょう。 1. イミュータブル型は、自身を変更する操作がない。 2. ミュータブル型は、リスト、辞書、集合等が該当する。 3. イミュータブル型は、整数、浮動小数点数、文字列、タプル等が該当する。 4. ミュータブル型のデータは全て、mutable[0] = 'hello'のような代入をサポートする。
答え:4 集合はミュータブルですが、mutable[0] = 'hello'のような代入はできません。
次のうち、Pythonのインデントとして推奨されているものを1つ選びましょう。 1. インデントには半角スペースを2つ使う 2. インデントにはタブを使う 3. インデントには半角スペースを4つ使う 4. インデントには半角スペースとタブを混ぜて使う
答え:3 これは是非覚えてください。Pythonが公式的に推奨しているスタイルで、最も多くのPythonプログラマーが採用しているスタイルです。
以下のプログラムの実行結果を考えましょう。 name = '田中 太郎' if name.endswith('太郎'): print('こんにちは、太郎') else: print('はじめまして') 実行結果 こんにちは、太郎
以下のプログラムの実行結果を考えましょう。 name = '田中 太郎' if name.startswith('田中'): print('こんにちは、田中') else: print('はじめまして') if name.endswith('太郎'): print('こんにちは、太郎') 実行結果 こんにちは、田中 こんにちは、太郎
最初のif〜elseのどちらかにまず入り、ここで「こんにちは、田中」が出力されます。 次に、if name.endswith('太郎'): にも該当するので、ここで「こんにちは、太郎」と出力されます。 if〜elif, if〜elseは1つのまとまりとして考えましょう。
実行結果のとおりになるように、current_time変数の値を考えましょう。 current_time = 13 if current_time < 12: print('おはようございます') elif current_time < 14: print('こんにちは') else: print('こんばんは') 実行結果 こんにちは
12以上で、14未満の値ならば問題なし。
表13.2.1、表13.3.1を参考にして、実行結果のとおりになるように、name変数とage変数の値を考えましょう。 name = 0 age = 0 if name and age: print('ok') elif name: print('年齢が不正です') elif age: print('名前が不正です') else: print('名前と年齢が不正です') 実行結果 名前と年齢が不正です
0が暗黙のうちにFalseと評価されることに注意してください。 nameとageの値をFalseやNone等にしても同様の動作はします。
リスト14.1.1を参考に、numbers変数の中身を考えましょう。 numbers = [1, 2, 3, 4, 5] for num in numbers: print(num) 実行結果 1 2 3 4 5
リスト14.1.1を参考に、以下のfor文を使ったプログラムの実行結果を考えましょう。 menu = ['チャーハン', 'ラーメン', '餃子'] for food in menu: print(food) 実行結果 チャーハン ラーメン 餃子
括弧の中を埋めて、実行結果のとおりになるようにしましょう。 リスト14.1.2、又はリスト14.1.3が参考になります。 (正解1) menu = {'チャーハン': 680, 'ラーメン': 700} for key, value in menu.items(): print(key, value) 実行結果 チャーハン 680 ラーメン 700
(正解2) menu = [('チャーハン', 680), ('ラーメン', 700)] for key, value in menu.items(): print(key, value)
2行目でnumbers変数に何らかの処理を加えて、実行結果のとおりになるプログラムにしましょう。 Step6-7に出てきたsortメソッド、又はスライスでの逆順を思い出しましょう。 (正解1 スライスバージョン) numbers = [1, 2, 3, 4, 5] numbers = numbers[::-1] for num in numbers: print(num) 実行結果 5 4 3 2 1
(正解2 リストのsortメソッドバージョン) numbers = [1, 2, 3, 4, 5] numbers.sort(reverse=True) for num in numbers: print(num)
「15.1 指定回数の繰り返し」を参考に、次のfor文の実行結果を考えましょう。 for i in range(0, 10, 2): print(i, end=',') 実行結果 0,2,4,6,8
end=','なので、カンマ区切りで表示がされます。
2つの括弧の中には、range関数の呼び出しが入ります。 実行結果のとおりになるように、埋めましょう。 for i in range(1, 4): for j in range(1, 4): result = '{0} * {1} = {2}'.format(i, j, i*j) print(result) 実行結果 1 * 1 = 1 2 * 1 = 2 3 * 1 = 3 1 * 2 = 2 2 * 2 = 4 3 * 2 = 6 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
リスト15.3.1、リスト15.3.2を参考に、以下のプログラムを組み込み関数enumerateを使って書き直してください。 heights = [170, 180, 165, 171, 170] for i in range(len(heights)): print(i, heights[i]) 実行結果 0 170 1 180 2 165 3 171 4 170 ↓ heights = [170, 180, 165, 171, 170] for i, h in enumerate(heights): print(i, h)
次のうち、while文で書くべきものを1つ選びましょう。 1. リスト内の値を、順番に出力する。 2. 1から10まで繰り返し、各値を出力する。 3. ループの中でユーザーの入力を受付け、ある入力で終了する。
答え:3 1と2については、for文で書くほうが遥かに簡単です。
次のプログラムは、10から1までを表示するプログラムです。 括弧の中に入る処理を考えましょう。(リスト16.1.1が参考になります) # 10から1まで出力するサンプル now = 10 while now >= 1: # nowが1以上の間はループし続ける print(now, end=' ') now -= 1 # now = now - 1 と書いてもOKです 実行結果 10 9 8 7 6 5 4 3 2 1
次のプログラムを実行すると、途中で入力が求められます。 while文の処理を見ながら、(あなたの入力)に入る文字を考えましょう。 リスト16.1.4が参考になります。 while True: your_name = input('あなたの名前は? (exitで終了)>') if your_name == 'exit': print('処理を終了します。') break else: print(your_name) 実行結果 あなたの名前は? (exitで終了)>taro taro あなたの名前は? (exitで終了)>exit 処理を終了します。
次のsay関数を呼び出しましょう。 def say(): print('こんにちは') say() 実行結果 こんにちは
リスト17.3.2を参考に、create_numbers関数を完成させましょう。 def create_numbers() return [1, 2, 3, 4, 5] # 1から5までのリストを返す numbers = create_numbers() print(numbers) 実行結果 [1, 2, 3, 4, 5]
「17.2 引数」を参考に関数を定義して、実行結果のとおりになるプログラムを作成しましょう。 def hello(name, greet): message = '{0}、{1}'.format(greet, name) print(message) hello(name='太郎', greet='こんにちは') 実行結果 こんにちは、太郎
関数を定義する際、以下の中でエラーとなる関数定義を1つ選びましょう(処理部分は考慮しないとします)。 リスト18.1.2が参考になります。 1. def send_mail(to='to@a.com', frm): 2. def send_mail(to, frm): 3. def send_mail(to='to@a.com', frm='from@a.com'): 4. def send_mail(*args, **kwargs):
解答:1 関数定義の際に、(デフォルト引数, デフォルトなし引数) のような定義はできません。
以下の関数を呼び出す際、エラーとなるものを1つ選びましょう。 リスト18.1.3が参考になります。 def send_mail(to, frm): print(to, frm) 1. send_mail('to@a.com', 'from2@a.com') 2. send_mail('to@a.com', frm='from2@a.com') 3. send_mail(to='to@a.com', frm='from2@a.com') 4. send_mail(to='to@a.com', 'from2@a.com')
解答:4 関数呼び出しの際に、(キーワード引数, 位置引数) のような定義はできません。
実行結果のとおりになるように関数を定義しましょう。 引数は2つ、どちらもデフォルト値を持つ引数です。 def say_hello(greet='おはよう', name='名無し'): message = '{0}、{1}'.format(greet, name) say_hello() say_hello('こんにちは') say_hello('こんばんは', '田中') 実行結果 おはよう、名無し こんにちは、名無し こんばんは、田中
以下のプログラムを実行したとき、実行結果として正しいものを1つ選びましょう。 リスト19.1.3が参考になります。 def greet(): message = 'Hello' greet() print(message) 1. NameError: name 'name' is not defined 2. 'Hello' 3. 何も表示されない
答え:1 関数内で定義した変数は、関数の外側からは参照できません。 今回はmessage変数が関数内にしかないため、print(name)はエラーとなります。
以下のプログラムを実行したとき、実行結果として正しいものを1つ選びましょう。 message = 'Hi' def greet(): message = 'Hello' greet() print(message) 1. NameError: name 'name' is not defined 2. 'Hello' 3. 'Hi'
答え:3 関数の外に同名の変数があった場合、外側の変数を書き換えるにはglobal文 を使う必要があります。 global文を使わない場合は、関数の外側では元の値のままです。そのため、print(message)は最初に代入された'Hi'のままです。
リスト19.1.5を参考にして、実行結果のとおりになるよう関数を定義しましょう。 name = 'taro' def change_name(your_name): global name name = your_name change_name('jiro') print(name) 実行結果 jiro
change_name()の後に、関数の外側にあるname変数の値が変わっていることに注意です。 外側のname変数をglobal文で書き換える必要があります。
リスト20.2.1を参考ににして、実行結果のとおりになるようにクラスを定義しましょう。 class Person: def __init__(self, name): self.name = name saburo = Person('saburo') print(saburo.name) 実行結果 saburo
リスト20.2.3を参考にして、実行結果のとおりになるようにクラスを定義しましょう。 class Person: def __init__(self, name): self.name = name def show_profile(self): print(self.name) saburo = Person('saburo') saburo.show_name() 実行結果 saburo
Step18のデフォルト値を持つ関数定義を思い出しながら、実行結果のとおりになるようにクラスを定義しましょう class Person: def __init__(self, name='名無し'): self.name = name def say_hello(self): message = 'おはよう、{0}'.format(self.name) print(message) anonymous = Person() anonymous.say_hello() tanaka = Person('tanaka') tanaka.say_hello() 実行結果 おはよう、名無し おはよう、tanaka
基礎 リスト21.1.2を参考に、実行結果のとおりになるようMaleクラスを定義しましょう。 class Person: def __init__(self, name): self.name = name class Male(Person): pass saburo = Male('saburo') print(saburo.name) 実行結果 saburo
「21.2 オーバーライド」を参考に、実行結果のとおりになるよう、show_profileメソッドをオーバーライドしましょう。 class Person: def __init__(self, name): self.name = name def show_profile(self): print('{0} 人です'.format(self.name)) class Male(Person): def show_profile(self): print('{0} 男性です'.format(self.name)) saburo = Male('saburo') saburo.show_profile() 実行結果 saburo 男性です
リスト21.3.2を参考に、実行結果のとおりになるよう、Maleクラスの__init__メソッドを作成しましょう。 その際、super()を使って親のメソッドを呼んでください。 class Person: def __init__(self, name): self.name = name def show_profile(self): print('{0} 人です'.format(self.name)) class Male(Person): def __init__(self, name, age): super().__init__(name) self.age = age def show_profile(self): print('{0} {1}歳 男性です'.format(self.name, self.age)) saburo = Male('saburo', 20) saburo.show_profile() 実行結果 saburo 20歳 男性です
リスト22.1.2、リスト22.2.1を参考にして、実行結果を考えましょう。 class Person: count = 0 def __init__(self, name, age): self.name = name self.age = age self.count = 1 taro = Person('taro', 20) print(Person.count) print(taro.count) 実行結果 0 1
Step21で学んだ継承を思い出しながら、実行結果のとおりになるよう、Charcterクラス内にshow_profileメソッドを定義しましょう。 ヒントとして、show_profileメソッド内では、「self.race」としてクラス属性にアクセスします。 class Charcter: race = '基本クラス' def __init__(self, name): self.name = name def show_profile(self): message = '名前:{0} 種族:{1}'.format(self.name, self.race) print(message) # このようなクラス属性だけを上書きする継承はよく使います。 class Fighter(Charcter): race = '戦士' class Fencor(Charcter): race = '剣士' taro = Fighter('taro') taro.show_profile() jiro = Fencor('jiro') jiro.show_profile() 実行結果 名前:taro 種族:戦士 名前:jiro 種族:剣士
基礎 add関数を参考にして、calcモジュールに掛け算を行う「mul」関数を新しく定義し、mainモジュールから呼び出してみましょう。 (calc.py) def mul(a, b): return a * b (main.pyの例) import calc result = calc.mul(2, 2)
リスト23.2.2を参考にしてif __name__ == '__main__':ブロックを作成し、その中でadd関数を呼び出すように作成しましょう。 その際、2つの引数と結果をprint関数で表示するようにし、add関数が動作するか確認できるようにしてください。 (calc.pyの例) if __name__ == '__main__': a = 2 b = 3 result = add(a, b) log = '{0} + {1} = {2}'.format(a, b, result) print(log)
mainモジュールからyahooモジュールのimportとして、エラーとなるものを1つ選びましょう。 「24.1 パッケージとは」が参考になります。 1. from news import yahoo 2. import news 3. from news import yahoo as yh 4. import yahoo
「24.2 __init__.py」を参考にして、main.py内に「yahoo」という文字列を登場させることなく、read関数をimportしましょう。
from news import read
前後のプログラムの流れを見ながら、実行結果のとおりになるように括弧の中を埋めましょう。 リスト25.1.2、リスト25.2.1が参考になります。 text = 'やっほー' with open('hello.txt', 'w', encoding='utf-8') as file: file.write(text) with open('hello.txt', 'r', encoding='utf-8') as file: print(file.read()) 実行結果 やっほー
可能な限りencoding引数も付けてください。
「'w'」「'a'」「'r'」を1つずつ使い、括弧の中を埋めて実行結果のとおりになるよう埋めましょう。 with open('hello.txt', 'w', encoding='utf-8') as file: file.write('ハロー') with open('hello.txt', 'a', encoding='utf-8') as file: file.write('ワールド') with open('hello.txt', 'r', encoding='utf-8') as file: print(file.read()) 実行結果 ハローワールド
try〜exceptの中身を見ながら、変数bに入る値を考えましょう。 a = 10 b = 0 try: result = a / b except ZeroDivisionError: result = '0で割ってはいけません。' print(result) 実行結果 0で割ってはいけません。
Step18のデフォルト値を持つ関数定義を思い出しながら、実行結果のとおりになるように関数を定義しましょう。 また、関数内部では、except KeyErrorを使います。 def get(report, kind, default=None): try: return report[kind] except KeyError: return default report = {'math': 80} point = get(report, 'math') print(point) point = get(report, 'english') print(point) point = get(report, 'english', default=0) print(point) 実行結果 80 None 0
例外のステップなので、上のような関数を定義してくれることが理想ですが、以下のような関数でも正解です。 def get(target, key, default=None): return target.get(key, default)