[ 授業トップに戻る ]

2016年度 : Q & A / プログラミング1

第1回目

Q: ミニテストの内容がとても気になります
A: 基本的には予習指定した内容か、復習(前回の講義)について、選択式or記述式のテストをオンラインでやります。
Q: なんで教科書全部英語なんですか?
A: (1)英語に触れる機会を増やしたい。世の中の最新技術は英語で書かれます。
 (2)検索する際に専門用語を知ってるのと知らないのとで、適切な情報を見つけられるか否かが大きく変わります。
Q: python以外は授業では扱わないんですか?
A: プログラミング1では「Python」を集中的にやります。
 プログラミング2では「Java」を集中的にやります。
 プログラミング1,2どちらかで、少し「C言語」をやる予定です。
 C言語をやる主な理由は次のとおりです。
 (1)組み込み機器等の一部の状況下ではC言語しか使えない場合がある。
 (2)ポインタ(メモリ)も意識して勉強して欲しい。
 (3)速度重視な場合にはC言語が有力な選択肢。
 (4)2年次の必修講義でも使います。

第2回目

ミニテストについての補足
ミニテストは主に前回の授業や、指定した予習について数分程度で終わるクイズをやります。 1回目の授業は「15回かけてやるプログラミングの全体像」を話しましたので、初めて聞く内容だらけだったと思います。これら全てを理解する必要はありません。1回目については主要なキーワードをいくつか列挙でき、関数やKISS原則といったことを「なんとなくイメージを掴む」ことができてたら十分です。
教科書予習についての補足
教科書予習についても、内容を100%理解することは求めていません。「予習=まだならっていないところを前もって学習練習しておくこと。」なので、こんな感じのことを次回やるんだなということを前もって一度読んでおく、動かしてみる、ぐらいで十分です。一度やって全て理解できる必要はなく、一度通してね、ということを要求してます。
英文の読み方についての補足
あと、Macには標準で辞書アプリが入っています。「アプリケーション」の中に「辞書.app」があります。
(1) 起動して、左上の「辞書」メニューから「環境設定」を選び、
(2) New Oxford American Dictionary、Oxford American Writer's Thesaurus あたりの英英辞書にチェックを入れると良いでしょう。(英和・和英辞典も入ってますが、訳して読むというよりは英語で読むということに慣れる勉強をしたほうが有益です)

第3回目

演習4.2について
プログラミングの「演習4.2」について。こちらで用意したレポートには、誤って違う内容が書かれているようです。問題文が正しいので、レポートを編集(書きなおして)対応ください。
文字化けについて
print()出力が文字化けするケースがあったようですが、python3で実行するようにしてください。(Pythonのバージョンが2.xだとエンコード指定が必要ですが、Python 3.xだとデフォルトでUTF-8解釈するため、文字化けしないはずです)
Q: 一コマあたりの時間が足りません!
A: 演習問題が多すぎて終わらないという意味だと思いますが、今後も演習時間を多めに取れるようにします。手を動かさないと気づけないことが多々あるため、演習問題を減らすことはなるべく避ける予定です。
Q: 先生達が自分のprint(x+'なんたらた\n'+x+'なんたらた')というプログラムに微妙な反応でしたが、先生が一番綺麗だと思うプログラムがあれば教えてください。あと、綺麗なプログラムの書き方も教えていただけると嬉しいです。宜しくお願いします。
A: ごめんなさい、微妙な反応をしたのは「どうやってそれに気づいたのか」を聞きたかったけど、時間がなかったから聞けずに残念だっただけです。改行コードを使う方法で全く問題ありません! 別解: 1行が長すぎると読みづらくなることが多いです。そのため、読みやすさという点では複数のprint()に分けたくなります。インタプリタ上では「1個目のprint文->その結果->2個眼のprint文->その結果」という形で見た目が綺麗ではありませんが、スクリプトファイルとして保存・実行すると、出力結果だけが連続して見れますので、printを複数回実行しても綺麗さは失われません。
Q: レポート1

(1) 0という値を入れた場合でもFizzBuzzを返すんですか?

(2) シェル上でスクリプトとして実行した場合ですが、

関数名(0)
FizzBuzz
関数名(1)
1
:
:

と、15まで続ける場合と

FizzBuzz
1
:
:
のようにそのまま実行結果だけ載せるのではどちらがいいのですか?

(3) あとインタプリタ上では入力してからの実行結果で、スクリプトのは入力せず、1~15までの実行結果だけ帰っていますが、入力してからの値を返すのがいいですか?それともそのまま実行結果だけ返していいですか?

(1) 題意的には返せるとベターですね!

(2),(3) どちらでも構いません。できるだけ、どのように実行したかが分かるようにレポートに書いてみてください!

Q: pythonの参考書を買おうと思っています。初心者でも分かりやすいものはなんでしょうか?
A: 例題を動かしながら学びたいなら、「Pythonチュートリアル 第3版」がオススメです。
文法等の書き方をしっかり学びたいなら、「入門 Python 3」がオススメです。
ちなみに、教科書ではありませんが「独習サイト (主にPython)」として掲載しているページでも勉強できます。特に、paizadotinstall公式ドキュメント(例えばチュートリアル)は、日本語でかつ入門編です!

第4回目

Q: 講義のレポートのdemoで使用していたAtomに関しての質問なのですが、スライドの左側で文字を打ち込むと、スライドの右側に連動して文字が入っていく機能は、packageか何かなのでしょうか? packageであればその名前、元々備わっている機能であれば、その方法を教えてください。
右側に連動してたやつは標準で入っていたと思います! 標準でいろんな機能が入っていて私自身一部の機能しか使っていませんが、デモでやってたのは次の通りです。
  • 1. demo-fizzbuzz.md を開く。もしくは新規作成(Cmd+N)で拡張子を .md (markdownの略) にして適当に書いて保存する。
  • 2. .md ファイルを編集してる画面で「Cmd+Shif+P」を押すと、コマンド入力する欄が表示されます。コマンドキーとシフトキーを押しながらPです。
  • 3. コマンド入力欄に「mark」ぐらいを入力すると、markから始まるコマンド一覧が出てきます。一覧をカーソルキー上下で移動して、「Markdown: Preview」を選択(return)します。
すると、元のファイル .md を開いてるタブと、それをプレビューしたタブが並ぶはずです。不要になったらタブを閉じればOK!

第6回目

Q: 正直今日の授業何言ってるかわからなかった。
A: 例えばスライドのどの部分ですか? 具体的に質問してもらえればできるだけ対応します!
 ちなみにチューリング完全の方はフワッとした触りしか説明していないため、分からなくても当然です。そこがメインではなかったので「これまでに習った道具で全てのプログラムは書ける」ぐらいの理解で十分です。
Q: int型のオブジェクトのユーザ入力ってpython上での実行ができるんですか?そこらへんよくわかりません…
A: 演習5.2の話だと思いますが、実現したいことを直接コードとして書けない場合には、問題を分割できないか考えてみよう。今回の例だと下記2つの機能を組み合わせることで実現できます。
 (1)ユーザ入力は、教科書2.3.1節 Input の「~ can be used to get input directly from a user, input」が道具です。
 (2)input()はstr型オブジェクトとして読み込むため、これをint型オブジェクトに変換する必要があります。これが2.3.1節の後半に出てくるtype converions (type casts) です。

第7回目

Q: 課題レポート2の課題詳細5が何を言ってるのか分からない。
A: 例えば「じゃんけん」を実装することを想像してみよう。グー、チョキー、パーというデータはPythonは知らないし、強弱についても分からない。何とかして、「じゃんけんのルールを、Pythonで処理できる形で記述する」必要がある。このように「Pythonで処理できる形で記述する」ことを、課題詳細5では「リスト型オブジェクトにより盤面情報を表現している」と述べている。

「じゃんけん」の話に戻ると、例えばグーチョキパーといった「取りうる手」を次のように表現することができそうだ。
  • グーを「str型オブジェクト ‘rock' 」で表現。
  • チョキを「str型オブジェクト ‘scissors’」で表現。
  • パーを「str型オブジェクト ‘paper’」で表現。
こう決めると、、、

例えば「コンピュータにランダムに手を選ばせる」という処理は、「’rock’, ‘scissors’, ‘paper’ の3つの str型オブジェクトから、ランダムにどれか一つを選択する」処理として記述できそうだ。

他にも「グーはチョキより強い」という処理を「コンピュータの手が ‘rock’ の時、対戦相手の手が ‘scissors’ ならコンピュータが勝つ」処理として記述できそうだ。


といったように、じゃんけんのルールを実装するためには、「(1) Pythonが知ってるデータ型に定義し直し、(2) そのデータ型を利用してルールを記述する」といった流れでコードを書くことができそうです。
上記はじゃんけんでの例ですが、課題レポート2の5では、3目並べの盤面情報をどう表現するか(Pythonが知ってるデータ型でどう定義し直すか)を考え、それを実際に実装してもらう事を意図しています。

第11回目

Q: emacs で保存したのをpython3のプログラミングの途中で実行する方法ってありますか?
A: あります。教科書のChapter 4.5 Modulesや、授業6回目でモジュールを読み込む例を示しました。この方法で実現できます。

例えば2つのターミナルを開いておき、1つ目はemacsでファイル編集用に使い、2つ目はpython3インタプリタを実行しているとしましょう。emacsで保存したファイルが「hoge.py」ならば、このモジュール名は「hoge」になります。この時、python3インタプリタ上で「import hoge」として読み込むと、インタプリタ上では「hoge.関数名」のように指定することでモジュール内の変数や関数を利用することができます。

7/5追記: [注意点]「import hoge」で読み込んだ後で、hoge.pyを再編集したとしても読み込んだモジュールは古いままになります。再度モジュールを読み込み直す必要があります。読み込み直すには「import hoge」し直すのでは駄目で、次のようにimportlibモジュールを利用する必要があります。
  >>> import hoge
  >>> hoge.関数名
  # (hoge.py を編集)
  >>> import importlib.reload(hoge)
  >>> hoge.関数名
  
整理すると、ファイルを編集しなおしたら「importlib.reload()」を使ってリロードし直す、必要があります。

なお、前述した「読み込み直すには「import hoge」し直すのでは駄目」の理由は、import が実行効率化を再優先するために「一度読み込んだモジュールはロードし直さない」ためです。例えば演習7のdraw_lot()で「import random」を利用しますが、これはどこで読み込んでも構いません。仮に関数の中で読み込む形で実装すると、draw_lot()を実行する度にrandomモジュールを読み込むことになってしまいますが、実際には一度読み込んだモジュールは再読み込みせずに再利用しています。
Q: 演習の7.6はmax(min)関数を使えるでしょうか?
A: 標準関数のmax(), min()のことなら、使うことは可能です。max()やmin()で利用できるように引数を用意してやるといいでしょう。
Q: 実施日はいつの日付ですか?実施日は全ての日付を書きますか?
A: 実施した全ての日付を書くようにして下さい。
Q: 関数が難しい。
A1: 関数の書き方(定義の書式)なら、教科書Chapter 4.1や、授業3回目公式ドキュメントを参照して勉強下さい。演習中の質疑対応からすると print() と return とを区別できていない学生が多いようです。関数の戻り値を利用するなら return が必須です。

A2: 「どのように関数を設計したら良いか?」という点(設計の仕方)については、13回目か14回目あたりに授業で取り扱う予定です。
Q: ドックテストについてあまりよくわからない。
A: 教科書には無いので、授業6回目7回目公式ドキュメントを参照しながら取り組んでみてください。レポート2でも扱いましたので、その際のレポートを振り返るのもいいでしょう。

第15回目

Q: 演習7.3の意味が分からない
A: 便宜上目的のクジを1としましょう。このクジを引き当てるのに何回くじを引けば良いでしょうか? この時に引いた回数をカウントするコードを書け、というのが問題です。
Q: 演習8.3が全然わからないです。
A: (1)について。
演習8.2を終えた次点で、data[0]の中身は「'account,report1_score,report2_score,report3_score'」になっていますか? このデータは、集計には不要な情報であるため、除外してください。実行例を見ると、処理結果を保存した target の0番目には、data[0]ではなく、data[1]を変換した情報が代入されています。このことを「削除」と表現しています。

A: (2)について。
こちらは具体例含めて書いてるので大丈夫かな?
Q: 演習8.3で制作する関数preprocess()の機能(処理)を演習8.2で制作した関数read_csv()の中に実装したらだめですか?
A: 実装は可能ですが、今回のように「関数の仕様」という形で指示されてる場合には、それを踏まえて取り組みましょう。(そうでなければ自由で釜はないのですが)
Q: 毎回隣の人が来なくて,ドライバーが変わったりしている場合は,演習レポートにその時のドライバーの人の名前等書くべきでしょうか。
A: 分かる範囲で記入頂ければと思います。未記入のままでもOKです(進捗確認報告をさせてます)。

レポート4

Q: 「python3 plot_map.py input1.txt」を実行しても何も実行されないように見える。
A: コードを修正してたのを忘れてました。デフォルトでは「画像ファイルを保存して終了する」スクリプトになっています。これを変更して「画像出力して眺める」ようにするには、以下を修正して対応下さい。

plot_map.pyの最後らへん(48,49行目)に、次のような行があるはずです。

==============
#plt.show()
plt.savefig('cities_{0}.pdf'.format(filename))
==============

この plt.savefig() をコメントアウトし、手前の plt.show() のコメントを外すと、画像出力した状態で止まってくれるはずです。