1 連絡・準備
1.1 課題03の作品共有
1.2 コンテストやセミナーの案内
これらのコンテストやセミナーへの参加履歴は、就職活動やインターンシップの書類選考で評価される大切なポイントです。必要最低限の経験や実績 (=学校の授業) では、競争倍率が高い選考を突破するのは難しいです。
1.3 小テスト
次回の講義で小テストを実施します。本日の講義内容からの出題です。
1.4 前期中間の成績評価について
シラバス記載 (下記参照) に基づいて前期中間成績をつけています。
各達成目標に対する到達度を、課題70%、小テスト30%の割合で総合して評価する。
- 課題01の評価 (10点満点) を1倍、課題02の評価 (10点満点) を2倍、課題03の評価 (10点満点) を2倍した合計50点を、70点換算 (小数以下は四捨五入)。各課題の評価はTeamsでフィードバック済み。
- 小テスト❶ (10点満点) と小テスト❷ (10点満点) を合計した20点を、30点換算 (小数以下は四捨五入)。各小テストは採点して返却済み。解答例はTeamsに掲載済み。
- 上記2項目を合算した100点満点を評価としています。
注意
学校における「課題の未提出 (=できない状態のまま連絡や相談をせずに期限を過ぎること)」は、 社会でいえば「上司から指示された業務や、顧客から依頼された仕事を放棄すること、着手せずに放置すること」に等しいです。
学校としては当然ながら「任された仕事を自己判断で放棄するような人材を企業に送り出すわけにはいかない」ので、不合格となるような成績評価をすることになります。
ここまでの範囲で未提出課題がある学生は、今後の課題提出で挽回してください。特に 「できない状態のまま、連絡や相談をせずに提出期限を過ぎる」 ということが無いように努めてください。
1.4.1 参考
- 前期中間の平均点:64.5 点
(90点以上「秀」評価は10名、最高点99点)
- 全課題提出の学生 (31名) の前期中間の平均点:75.9 点
- 未提出課題ありの学生 (10名) の前期中間の平均点:29.2 点
1.5 本日の授業準備
- GoogleColab.
にログインしておいてください。
PG1-第08回講義.ipynbという名前でノートブックを作成しておいてください。- 本日の演習の解答例はこちらを参照してください。
1.6 補足
他高専の「情報系学科」のプログラミング教育の動向も把握しておきましょう。特に「2年生」で、どのようなプログラミング学習をしているのか確認してみてください。
- 情報工学科@木更津高専
教育課程表
- プログラミング基礎Ⅰ2年前期 C言語、Linux
- プログラミング演習ⅠA2年前期
- プログラミング基礎Ⅱ2年後期 C言語 (ポインタ、動的配列確保、ソートアルゴリズム) 、Processing
- プログラミング演習ⅠB2年後期
- 情報工学科@奈良高専 教育課程表
- 情報工学科@松江高専 教育課程表
- 情報工学科@東京高専
教育課程表
- プログラミング言語Ⅰ2年前期 C言語
- プログラミング言語Ⅱ2年後期 C言語
- 情報工学分野@釧路高専
教育課程表
- プログラミング言語Ⅰ2年通年 Scheme (再帰関数・各種アルゴリズム)
皆さんは、3年次の前期に学修単位の「プログラミング2」で C言語 を学習します。
また、3年次の後期に学修単位の「プログラミング3」で ウェブ開発 (HTML/CSS/TypeScript, React/Next.js)を学習します。また、3年の「データ構造とアルゴリズム1」と、4年の「データ構造とアルゴリズム2」でも C/C++言語 を扱います。
2 課題04
この「課題04」は、今回の講義内容を把握したうえで 最後に取り組んでもらう演習 です。以下、この演習に取り組むために必要な要素 (リスト関連の処理) を扱っていきます。それらを効果的に学ぶためにも、はじめに「課題04」の内容を把握しておいてください。
FC版DQ3 (ファミコン版のドラゴンクエスト3)
の武器を扱った「100連ガチャ」のシミュレータを作成してください。ガチャにより排出される武器は
item_names_str で「カンマ ,
区切り」で与えられる全33種の武器となっています。また、その排出比は
item_p_str
でカンマ区切りで与えた数値となっています。
ここでの排出比とは・・・例えば「ひのきのぼう」「こんぼう」「どうのつるぎ」の全3種を仮定し、その排出比が「\(10\)」「\(5\)」「\(2\)」であれば、「ひのきのぼう」が排出される確率は \(10/(10+5+2)\)、「こんぼう」が排出される確率は \(5/(10+5+2)\)、「どうのつるぎ」が排出される確率は \(2/(10+5+2)\) のように考えてください。
%reset -f
# カンマ区切りの「文字列」でデータが与えられているものとします。
# ▼▼▼ ここから(変更不可) ▼▼▼
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_p_str = '50,50,50,40,40,35,30,30,25,20,20,20,10,10,10,10,10,10,10,10,5,5,5,4,3,3,2,2,2,2,2,2,1'
# ▲▲▲ ここまで(変更不可)▲▲▲上記につづけて100連ガチャの「シミュレーション」を実行し、次のような出力を得たい。
- 獲得個数が0個のものは「出力しない」ようにしてください。
100連ガチャの結果、以下のアイテムを獲得しました。
ひのきのぼう ... 8個
こんぼう ... 8個
どうのつるぎ ... 9個
せいなるナイフ ... 8個
くさりがま ... 11個
とげのむち ... 7個
まどうしのつえ ... 5個
てつのやり ... 7個
どくばり ... 6個
てつのつめ ... 5個
はがねのつるぎ ... 4個
てつのオノ ... 3個
あまぐものつえ ... 2個
いかづちのつえ ... 1個
さざなみのつえ ... 6個
さばきのつえ ... 2個
ゆうわくのけん ... 3個
りりょくのつえ ... 2個
おおかなづち ... 1個
ゾンビキラー ... 1個
まじんのオノ ... 1個
この要求を満たすPythonプログラムを設計、実装してください。
上記に準ずる結果が得られれば「各種演出・装飾を追加したもの」や「Colabのフォーム機能や、ipywidgets などを利用したもの」などでもよいです (加点します)。
(プロンプト例)
GoogleColab で「ボタン」などGUIを使いたいです。
ipywidgetsというライブラリがあると聞いたのですが、それはどのようなものですか。簡単なサンプルプログラムを示してください。
3 確認:print関数の引数
以前に紹介済みですが、今回の演習で利用する可能性があるため、print
関数に 複数の引数
を与えた場合の動作と、sep
引数を与えた場合の動作について改めて確認しておきます。いまさらですが「引数」の読み方は
「ひきすう」 です
(「いんすう」ではないので注意してください )
。
print 関数には、カンマ区切りで
2個以上の引数
を与えることが可能で、その場合、次のように半角スペース1文字で区切られた文字列出力を得ることができます。
上記プログラムの実行結果は次のようになります。
AAA BBB CCC DDD
半角スペース1文字で区切られた出力となっていることを確認してください。
また、最後の引数に sep= を与えると( 半角スペースではなく)
任意の区切り文字を使用することができました。sep
は「Separator (セパレータ)」の略になります。
次のプログラムを実行して結果を確認してください。
なお、print(a, b, c, sep='-', end='' ) における
sep= や end= のような引数を
キーワード引数 や
名前付き引数
といいます。これらの引数は、通常の引数 (これらを 位置引数 といいます)
のあとに与える必要があります。
キーワード引数 を 位置引数 よりも前に記述すると「どうなるか?」を実際に確認してください。
4 Pythonにおける「リスト」とは
C言語 (≒Arduino言語) における配列 (Array: アレイ) に相当する機能を、Python では リスト (List: リスト)と言います。
例えば、次の array.c
のようなC言語プログラムと、同じ出力を得る Pythonプログラムは
list.py のように書くことができます。2つの言語における
記号の違いなど に注意して比較してください。
#include <stdio.h>
#define N 4
#define M 20 // 1アイテム(英数字であれば)最大20文字まで
int main(void){
char items[N][M]={"どうのつるぎ","やくそう","どくけしそう","ぬののふく"};
for(int i=0;i<N;i++){
printf("%s\n",items[i]);
}
}いずれのプログラムも実行結果は次のようになります。なお、上記の
range や ループ変数 i については第07講義で学習済みです。
どうのつるぎ
やくそう
どくけしそう
ぬののふく
「Pythonのリスト」は「C言語の配列」よりも 非常に柔軟で強力な機能 を提供してくれます(C++言語におけるVectorに近い機能を提供してくれます)。その結果、C言語の配列では「できないこと」「極めて面倒なこと」を、Pythonのリストでは比較的簡単に行なうこと (短いコードで記述すること) ができます。
ここからリストの使い方や、リストが持つ機能について詳しく学んでいきます。
4.1 演習1 ( 目標時間: 3分)
上記の list.py の 第03行目
以降を変更して次のような結果が得られるようにしてください。なお、「f文字列」を利用するようにしてください。
もちもの「どうのつるぎ」
もちもの「やくそう」
もちもの「どくけしそう」
もちもの「ぬののふく」
5 リスト初期化と要素の参照
リストでは、list.py
の例のように文字列のほか、数値 や
各種オブジェクト
を格納することができます。なお、「オブジェクト」については、第23回講義で学んでいくので現時点では気にしないでください)。
リストの初期化 (リテラルを使った初期値の設定)
は次のように記述します。リストを構成する「要素」の参照
(=読み取り) は C言語と同じように
[] の 角括弧 /
大括弧 を使用します。
%reset -f
a = [10,20,30,40] # 初期化(数値)
b = a[0] * a[1] # a[0]で0番目の要素(=10)、a[1]で1番目の要素(=20)を参照
print(f'b = {b}') # b = 200%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく'] # 初期化(文字列)
item_prices = [100,8,10,10] # 初期化(数値)
i=1
print(f'{item_names[i]}は{item_prices[i]}Gで売られている。')角括弧のなかに与える数値を
インデックス や
添え字 と言います。インデックス
(添え字)は ゼロオリジン になります(
リストの先頭は 0 となる点に注意してください )。
注意: 変数に「list」という名前を付けないこと
Pythonにおいて list は、if や
for と同様に
変数名などに使用してはいけない予約語
になっています。list
という変数を作成しても、即座にエラーになるわけではありませんが、以降のプログラムのどこかで問題を引き起こす可能性があります。
5.1 演習2 ( 目標時間: 4分)
上記の dq3-items.py プログラムの
第04行目以降
を修正して、実行結果として次のような文字列が得られるように変更してください。なお、売価は価格の3/4で設定されているものとします。小数以下は「切り捨て」とします。
「どうのつるぎ」は、100G で購入し、75G で売却できる。
「やくそう」は、8G で購入し、6G で売却できる。
「どくけしそう」は、10G で購入し、7G で売却できる。
「ぬののふく」は、10G で購入し、7G で売却できる。
ヒント
for文を利用してください。- 「小数以下は切り捨て」とは「7.2」を「7」、「7.9」も「7」にするような処理を指します。
- f文字列の書式指定子は、小数の「切り捨て」には対応していません。数値の切り捨て処理の方法は「Python 数値 切り捨て」などで検索してください。
5.2 文字列を使ったリストの初期化
実践的な場面では、リストを構成する要素が 1つの文字列として与えられること (あるいはテキストファイルから入力されること) があります。
例えば、次のように「カンマ区切りの文字列」として配列情報が与えられることがあります。
このようなとき、手作業で
['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
のように書き換えるべきではありません。
次のように、文字列の split メソッドを利用して
任意文字で文字列を分解してリスト化
することができます。
%reset -f
item_names_str='どうのつるぎ,やくそう,どくけしそう,ぬののふく' # 文字列
# item_names_str -> item_names
item_names = item_names_str.split(',') # ★文字列をカンマで分解してリスト化
for i in range(len(item_names)):
print(item_names[i])また、分解した文字列をさらに 数値に変換したい という場合もあります。
このような場合は、次のように組み込み関数の map と
float を利用します。float については 第04回講義で学習済みです。
%reset -f
item_p_str='0.65 0.30 0.05' # スペース(SP)区切りの文字列
item_p1 = item_p_str.split(' ') # 文字列をSPで分解してリスト化
# 現状で item_p1 の要素は【文字列】 ※計算処理に利用できない
for i in range(len(item_p1)):
print(item_p1[i]*100)
print('---')
# item_p1 の要素を【数値】に変換
item_p2 = list(map(float,item_p1)) # ★ここがポイント!
for i in range(len(item_p2)):
print(item_p2[i]*100)このプログラムで使われている map
については、以降の授業で 詳しく解説します。現状では
第12行目
のように処理を書くことで「リストの要素を文字列から数値
(実数値 float) に変換できる」と知っておいてください。
なお、要素を文字列から整数値 (int)
に変換したい場合は、map の第1引数に
int を与えてください。
5.3 演習3 ( 目標時間: 3分)
次のようにカンマ区切りで「アイテム名称」と、そのアイテムに関する「数値
(パラメータ)」が与えられているものとします。item_names_str
から item_names というリスト
(要素は文字列)
を作成してください。また、item_p_str から
item_p というリスト (要素は整数値)
を作成してください。
%reset -f
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_p_str = '50,50,50,40,40,35,30,30,25,20,20,20,10,10,10,10,10,10,10,10,5,5,5,4,3,3,2,2,2,2,2,1,1'
item_names = 0 # 書き換える
item_p = 0 # 書き換える(複数行でも可)
print(item_names)
print(item_p)正しく処理ができれば、実行結果として次のような値を得るはずです。
['ひのきのぼう', 'こんぼう', 'どうのつるぎ', …略…, 'おうじゃのけん']
[50, 50, 50, …略…, 1]
なお、item_p の出力が…
['50', '50', '50', …略…, '1'] # リストの要素が【文字列】
[50., 50.0, 50.0, …略…, 1.0] # リストの要素が【実数値】
…のようにシングルクォーテーション付きになっている場合、要素を正しく「整数値」に変換できていません(リストの要素が 実数値や文字列 になっています)
6 リストのインデックス範囲
リストは ゼロオリジン であり、角括弧内には 整数値でインデックスを与える必要 があります。
上記のプログラムの 第03行目 を書き換えて、
- リストに対して「範囲外のインデックス」を与えた場合、例えば、要素数を超えた
item_names[9]を指定したときなど、どのようになるか確認してください。もし、エラーとなる場合は、何というエラーが発生する? までを確認してください。 - リストに対して「小数値のインデックス」を与えた場合、どのようになるか確認してください。
item_names[0.5]item_names[1.00]
- リストに対して「負数のインデックス」を与えた場合、どのようになるか確認してください。
item_names[-1]item_names[-2]
7 リストの要素数
リストが内部に「いくつの要素を持っているか」は、次のように
組み込み関数の len
を使って取得することができます。len は Length (長さ・レングス)
の意味を意味します。
次のプログラムを実行して結果を確認してください。
%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
print(f'現在、{len(item_names)}個のアイテムを所持しています。')これを利用すれば、for
は次のようにスマートに記述することができます。
%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(item_names)): # ★rangeの引数に注目
print(item_names[i])len(item_names)
は整数値を返すので、range
以外にも、次のように計算式などに利用することができます。実際に実行して結果を確認してみてください。
%reset -f
max_item_num = 99
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
x = max_item_num - len(items) # ★lenを計算式に組み込む
print(f'あと {x}個 のアイテムを持つことができます。')7.1 リストの初期化2
[0,0,0,0,0] や ['乙','乙','乙']
のように全て同じ値を持ったリストは、次のように初期化できます。
7.2 演習4 ( 目標時間: 3分)
item_names と同じ長さ (=同じ要素数)
で、その要素がすべて 0(整数値) となるリスト
item_counts を作成してください。
%reset -f
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_names = item_names_str.split(',')
item_counts = 0 # ここを書き換える。33という数値の直接記述は禁止。lenを利用すること。
print(f'item_namesの長さ = {len(item_names)}')
print(f'item_countsの長さ= {len(item_counts)}')
print(item_counts)実行結果の例
item_namesの長さ = 33
item_countsの長さ= 33
[0, 0, 0, 0, 0, ... , 0]
8 リストと組み合わせ可能な組み込み関数
len のほかにも、様々な 組み込み関数
とリストを組み合わせることができます。max や
min は第07回講義で既に学習済みです。
%reset -f
a = [60,20,40,-30,90]
print(f'sum(a)= {sum(a)}')
print(f'max(a)= {max(a)}')
print(f'min(a)= {min(a)}')上記のプログラムについて、リストの要素が文字列であった場合にどのようになるか確認してください。例えば
a=['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
である場合にどのようになるか確認してください。
sum、max、min 以外の 組み込み関数
もリストを引数にとることができます。
9 リストとprint関数
print関数の引数に、直接、リストを与えることができます。次のプログラムを実行して、どのような結果が得られるかを確認してください。
中級者向け: リストのアンパック
リストを関数の引数として与える場合、先頭に「アスタリスク」をつけて アンパック (展開) という処理を施すことができます。これにより、次のようなことができます。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
print(*items, sep='\n') # itemsの頭に「*」を付けた。また sep 引数を設定このとき、第03行目 は次のような文と同じ意味を持ちます。
つまり、リストをアンパックすると「リスト内の要素を個別の引数として関数に与えること」が可能になります。
10 リストにおける要素の書き換えと追加
リストに含まれる要素は、次のようにインデックスで指定して書き換えることができます。実際に実行して確認してみてください。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items[0] = 'はがねのつるぎ'
items[2] = 'まんげつそう' # マヒの回復
for i in range(len(items)):
print(items[i])また、(要素の変更だけではなく)
要素の追加も可能で、それにはリストの
append メソッドを使用します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items.append('かわのたて') # 末尾に追加
for i in range(len(items)):
print(items[i])
print(f'※ 現在、所持しているアイテムは以上の {len(items)}個 です。')このように リストの要素数が変化する状況では
len(items)
は非常に便利です。リストの要素数は、変数を使って保持するのではなく、常に
len を使って参照するようにしてください。
また、リストの末尾以外に要素を追加したい場合は、リストの
intsert メソッドを使用します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items.insert(0,'かわのたて') # items[0]に「かわのたて」を挿入
for i in range(len(items)):
print(items[i])無論、「要素を削除するメソッド」も存在します (検索すればすぐに見つけることができます)。
(プロンプト例)
Pythonのリストから、インデックスを指定して要素を削除したいです。
Pythonのリストから、要素の内容を指定して要素を削除したいです。いま、リストには 秀・優・良・可・不可 のいずれかが入っているのですが、このうち「不可」だけを削除したいです。
メソッドとは何か
オブジェクトが所有する関数を メソッド
といいます。「オブジェクトとはなにか」は、まだ扱っていませんが、リストはオブジェクトです。そして、メソッドとは
オブジェクトが持っている関数
を指します。オブジェクトが持っているメソッドは
.(ドット) を使ってアクセスすることができます。
GoogleColabでは、プログラムを記述する際、メソッドの
入力補完 が受けられます。例えば、Google
Colab.に次のプログラムを貼り付け、それに続けて03行目に
items.
まで入力してみてください。2秒ほどするとメソッドの一覧が表示されると思います。
表示された候補は、上下キーで選択して、Tabキーで決定します。
10.1 要素を持たない空のリスト
プログラムの実行中に append や insert
を使って、逐次、要素を追加していく場合、最初は要素を持たないリストで初期化したい場合
があります。これは、次のように記述できます。
%reset -f
items = [] # 要素を持たない空のリスト
items.append('どうのつるぎ')
items.append('たびびとのふく')
for i in range(len(items)):
print(items[i])また、第02行目は items = list()
のように記述することもできます。
10.2 演習5 ( 目標時間: 5分)
次のプログラムの 第04行目以降 を書き換えて、期待する出力が得られるようにしてください。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
# ここから下を書き換える (リストに要素を追加する処理を追加する)
for i in range(len(items)):
print(items[i])期待する出力 (アイテムの並び順も同じにすること)
ひかりのたて
おうじゃのつるぎ
どうのつるぎ
やくそう
てっかめん
どくけしそう
ぬののふく
なお、ここでは、第04行目に
items=['ひかりのたて','おうじゃのつるぎ','どうのつるぎ','やくそう','てっかめん','どくけしそう','ぬののふく']
のような記述をすることは意図していません。append や
insert を利用して演習に取り組んでください。
11 要素の検索
リストのなかに 指定の要素が存在するか
を調べたい場合には in を使った if文を構成します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
if target in items : # in を使った条件分岐
print(f'勇者ヨシヒコは {target} を使用した')
else :
print(f'勇者ヨシヒコは {target} を持っていない')上記の 第03行目 を
target = 'キメラのつばさ'
に変更して動作を確認してください。
11.1 要素が含まれて「いない」ことを判定するには
items というリストのなかに target
という要素が存在するとき target in items
は「真」となります。では、存在しないとき
に「真」となる条件式はどのように書けるのか、自分自身で調べてみてください
(ChatGPTなどを利用する方法もあります)。
11.2 当該要素のインデックスの検索
指定の要素が「リストの何番目に存在するか」を調べたい場合は、リストの
index メソッドを使用します。なお、変数名の
idx は、indexの略表記です。
次のプログラムを実行して、その結果を確認してください
(単に実行するだけではなく target
を書き換えて、それに応じて動作がどのように変化するか、予測して、確認してください。)
。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
if target in items :
idx = items.index(target) # ★ 要素を検索して、発見したインデックスを返す
print(f'勇者ヨシヒコの {idx}番目 のポケットに {target} が入っている')
else :
print(f'勇者ヨシヒコは {target} を持っていない')以下のプログラムを利用し、次のパターンにおいて変数
idx にどのような値が格納されるか
(あるいは実行時エラーが生じるのか) を確認してください。
itemsに存在しないものをtargetに指定した場合 (たとえば、target = 'まんげつそう'を指定した場合)itemsのなかにtargetと同じ要素が2個以上存在する場合
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
idx = items.index(target)
print(f'idx={idx}')11.3 演習6 ( 目標時間: 10分)
いま、所持しているアイテムの名前を item_names
というリストで管理し、また、その所持数を item_counts
というリストで管理しているものとします。
つまり、下記プログラムの第02行目と第03行目の情報の組み合わせによって「やくそう」を4個、「どくけしそう」を2個、「まんげつそう」を0個、「せかいじゅのは」を1個所持している状態を管理・表現しているものとします。
宝箱を開けたときの入手アイテム item
により、それらが適切に更新されるようにプログラムを書き換えてください。
- はじめに、
itemが「やくそう」「どくけしそう」「まんげつそう」「せかいじゅのは」のいずれかであるパターンに対応させること。 - つづいて、
itemに「きえさりそう」などの 未所持アイテムが与えられるパターン にも対応させること。 - おまけ:DQ3では「せかいじゅのは」は最大で1個までしか所持できない制約がある。これを反映させること。
%reset -f
item_names = ['やくそう','どくけしそう','まんげつそう','せかいじゅのは']
item_counts = [4,2,0,1] # アイテムの所持数
item = 'やくそう'
print('勇者ヨシヒコは宝箱を開けた、',end='')
print(f'なんと「{item}」を手に入れた。')
# ここに item に応じて item_counts などを更新する処理を記載
print('\n---所持品の確認---')
for i in range(len(item_names)):
print(f'{item_names[i]}...{item_counts[i]}個')12 Pythonicなリストとfor文の組み合わせ
ここまでは、C言語のスタイルに寄せてリストとfor文を組み合わせる方法を紹介してきました。一方で、Pythonicに (Pythonらしいスタイルで) リストの要素を列挙する場合、次のようにコードを記述します。
(プロンプト例)
Pythonプログラミングの文脈で「Pythonicな…」とはどういう意味ですか?具体的かつ分かりやすく教えてください。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(items)): # ★この行に注目
print(items[i])いずれも実行結果は次のようになります。py-style1.py
では、itemsの要素数だけループが繰り返され
(つまり、このケースでは要素数が4個なので、4回のループとなり)、変数
t には1回目のループでは 'どうのつるぎ'
が格納され、2回目のループでは 'やくそう'
が格納され・・・という動作になります。
どうのつるぎ
やくそう
どくけしそう
ぬののふく
また、forブロックのなかで
インデックス番号を参照したい場合 は、次のように
enumerate を使って記述します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i,t in enumerate(items): # ★この行に注目
print(f'{i+1}. {t}')%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(items)):
print(f'{i+1}. {items[i]}')いずれも実行結果は次のようになります。
1. どうのつるぎ
2. やくそう
3. どくけしそう
4. ぬののふく
py-style2.py では、変数 i
にはゼロオリジンのインデックス番号、変数
c には要素が格納されます。
13 ランダム処理とリストの組み合わせ
第02回講義
で既に登場していますが、randomモジュールの choice
関数とリストを組み合わせることで「リストのなかからランダムに要素を取得する処理」を簡単に書くことができます。
%reset -f
import random as r
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
c = r.choice(items)
print(f'勇者ヨシヒコはパルプンテを唱えた。なんと「{c}」が粉々に砕け散った。')また choice 関数ではなく、choices
関数 (末尾の s がポイント)
を使用すると「均等確率」ではなく「重み付きの確率」による要素のランダム取得ができます。次のプログラムを実行して確認してみてください。
%reset -f
import random as r
rank = ['LR','UR','SSR','SR','R']
p = [1,3,10,20,50]
c = r.choices(rank,weights=p)
print(c) # choicesの戻値はリストになるので
print(c[0]) # [0]で先頭要素を取得するchoices 関数に k=
のキーワード引数を設定すると、一度に \(k\)
個の要素を取得することができます。
%reset -f
import random as r
rank = ['LR','UR','SSR','SR','R']
p = [1,3,10,20,50]
c = r.choices(rank,weights=p,k=10) # ★k=10を設定
print(c)上記のプログラムを実行すると、変数 c
には、以下のように \(10\)
個の要素を持ったリストが格納されます。
['R', 'SSR', 'R', 'R', 'R', 'SR', 'LR', 'R', 'SR', 'SR']
14 課題04 (宿題)
冒頭で示した課題04について、今回の講義で作成したノートブック
PG1-第08 回講義.ipynb のなかで取組み、Teams
の指定位置に提出してください。.ipynb
ファイルを提出するわけではないので注意してください。
- Colabノートブックの共有設定は第03回講義で解説済みです。既に4回目なので、適切な共有設定ができていないものは「0点」とします (注意ください)。
提出に際しては、必ず、ノートブックの
先頭
に以下の内容のテキストセルを作成し、それにつづけて「課題04」のコードセルを配置してください。コードセルの先頭には
%reset -f を配置してください。
▼ テキストセルに記述する内容 (例)
# **プログラミング1 課題04**
- 氏名: 高専太郎
- 出席番号: 99
- この課題の取り組み時間: **50分**
▼ 作成例
- 評価 : 標準
(=指示した最低限のことができている)
を「8点」として 10点満点
で評価します。
- 0点~8点の範囲は絶対評価で点数をつけます。
- 8点~10点の範囲はクラスのなかでの相対評価で点数をつけます。
- 取組み時間の記載がない、ノートブックの先頭に配置されていない、出席番号が誤っている
(昨年度のものになっている)、コードセルの先頭に
%reset -fが書かれていないなどの不備は減点するので注意してください。
- 取組み時間の記載がない、ノートブックの先頭に配置されていない、出席番号が誤っている
(昨年度のものになっている)、コードセルの先頭に
- 取り組み時間の目安 : 40分以上
- 期限 : 2025年6月25日(水) 23:00
- 上記以降に採点します。
- 課題の採点後は、修正版の再提出・追提出があっても原則として再評価はしません (採点がフィードバックされるまではノートブックの内容を変更して問題ありません)。