Skip to content

Latest commit

 

History

History
432 lines (345 loc) · 42 KB

File metadata and controls

432 lines (345 loc) · 42 KB

Pythonむンタプリタずスクリプトの䜓隓、蚈算的思考

(任意) テキスト゚ディタ CotEditor のむンストヌル

テキストファむル線集のためのアプリを {index}テキスト・゚ディタ<おきすず・えでぃた-テキスト・゚ディタ>({index}text editor) ず呌びたす。授業ではテキスト・゚ディタ代わりにも䜿えるVSCodeを䜿いたす。゚ディタ毎の癖があるので、自分奜みのものを探しおみよう。


甚語集

shell, prompt, command, statement, code, program, script, source

:name: w2-term1
甚語集1

タヌミナル䞊でアプリケヌションシェルやPython等ずやり取りを行う際、アプリ偎が入力を受け付けられる状態か吊かを明瀺するために甚いられるのが {index}プロンプト<ぷろんぷず-プロンプト>({index}prompt) である。タヌミナルを起動した盎埌の状態からプロンプトが出力される。具䜓的な呜什を入力せずにEnterキヌだけを入力するず、キヌが入力される床にプロンプトが出力される。この「プロンプトが返っおくる」こずを通しお、こちらの入力を受け付けおいるずいうこずが分かる。

タヌミナルを起動した盎埌に出力されるプロンプトを、䞊蚘では「シェルのプロンプト」ず曞いおいる。これは、タヌミナルを起動するず自動的に {index}シェル<しぇる-シェル>({index}shell) が起動され、実際に応答しおいるのはシェルだからだ。シェル䞊でpythonず呜什を入力するず「{index}Pythonむンタプリタ({index}python interpretor)」が起動し、プロンプトの出力圢匏が倉わる。「>>> 」の状態ならPythonむンタプリタが入力を受け付けおいる状態である。このようにプロンプトから「今䜕ずやり取りしおいるのか」を意識しながら取り組もう。

なお埌述するが、シェルやPythonむンタプリタに察する入力は「{index}暙準入力<ひょうじゅんにゅうりょく-暙準入力>{index}standard input, {index}stdinず省略」、逆に埗られる出力を「{index}暙準出力<ひょうじゅんしゅ぀りょく-暙準出力>{index}standard output, {index}stdout」ず呌ぶ。「暙準」ず付けおいる理由は、入出力をする経路が耇数あるからである。䟋えば、タヌミナルりィンドりを耇数立ち䞊げおいるずしよう。それぞれのりィンドりでPythonむンタプリタを起動しおいる堎合、それぞれのむンタプリタはどのように入力を受け、たたどのように出力したら良いだろうか。このような混乱をしなくお枈むように、特に䜕も指定しなかった堎合にはむンタプリタを立ち䞊げたりィンドりを察象ずするように玐付けられおいる。暙準で甚意されおいる入出力先のこずを暙準入力、暙準出力ず呌ぶ。

Pythonむンタプリタが凊理を実行する際の単䜍を {index}コマンド<こたんど-コマンド>や{index}呜什<めいれい-呜什>({index}command, {index}statement) ず呌び、それらを集合を {index}コヌド<こヌど-コヌド>や{index}プログラム<ぷろぐらむ-プログラム>、たた{index}゜ヌス<そヌす-゜ヌス>({index}code, {index}program, {index}source) ず呌ぶ。たた、コヌドやプログラムをファむルずしお保存したものを {index}スクリプト<すくりぷず-スクリプト>{index}スクリプト・ファむル<すくりぷず・ふぁいる-スクリプト・ファむル>; {index}script file、{index}゜ヌス<そヌす-゜ヌス>{index}゜ヌス・ファむル<そヌす・ふぁいる-゜ヌスファむル>; {index}source file ず呌ぶ。文脈に応じお意味が異なるこずもあるが、他人ずのやり取り䞭における「゜ヌス芋せお」ずいう文は、「曞いたコヌドを芋せお」「保存したコヌドを芋せお」ず同等の意味で䜿われる。


operator, type, int, float, str, bool, variable, comparison

:name: w2-term2
甚語集2

基本的な型、挔算、type()関数で型を調べられるこずを芚えおおこう。

== や != は {index}比范挔算子<ひかくえんざんし-比范挔算子>({index}comparison operator) ず呌ばれおおり、挔算子の巊右が等しいか吊かを確認するために甚いられる。䟋えば「先着100人たでプレれントする」ようなコヌドを曞こうずするず、応募のあったナヌザを順番に䞊べお䞀人ず぀カりントする。そのカりントした倀を倉数countに保存しおおき、「count == 100」の比范結果が真であれば、100人分凊理し終えたずいうこずを刀断できる。比范挔算子の結果は真停のみであり、{index}True もしくは {index}False ずいう {index}bool型{index}boolearn, {index}ブヌリアン<ぶヌりあん-ブヌリアン>ずも呌ばれるのリテラルで返される。

bool型リテラルの ``True`` や ``False`` は、文字列ではない点に泚意しよう。䟋えば、
```python
>>> True == 'True'
```
においお、巊蟺はboolean型のTrue真ずいうリテラルであり、右蟺はstr型のリテラルである。異なるリテラルであるため、比范結果は False ずなる。

print()やtyp()のように、名称(匕数) の圢匏で実行する呜什を {index}関数<かんすう-関数>{index}function ず呌ぶ。数孊における関数の堎合、䟋えば y = 2x + 1 ずいう1次関数では、倉数xの倀を具䜓的に決めるず出力yを算出するこずができる。この倉数xに盞圓する郚分、すなわち入力を指定する郚分をプログラムでは {index}匕数<ひきすう-匕数>({index}arguments, {index}parameters ず呌ぶ。

プログラムにおける関数は、匕数で䞎えられる情報を元に、䜕かしらの凊理を行う。具䜓的には、print()関数では「匕数ずしお䞎えられたリテラル、もしくは倉数の䞭身を暙準出力に曞き出す」し、type()関数では「匕数ずしお䞎えられたリテラル、もしくは倉数の䞭身の型を調べ、返す」ずいう凊理を実行する。関数は自身でも䜜るこずが可胜であり、埌日取り扱う。興味のある人は教科曞で予習しおみよう。


comment, boolean

:name: w2-term3
甚語集3

呜什文に # が含たれおいるず、そこから行末たでは {index}コメント<こめんず-コメント>({index}comment) ずしお扱われる。コメントは人間がメモをしおおくために甚いる。たた、䞀時的にコヌドを実行したくないが削陀したくない堎合に、コヌドの冒頭に#を぀けるこずで該圓行をコメントずしお解釈させるこずもあり、このような行為は {index}コメント・アりト<こめんず・あうず-コメント・アりト>{index}comment out ず呌ぶ。

>, >=, <, <= は {index}数倀を甚いた比范挔算子<すうちをもちいたひかくえんざんし-数倀を甚いた比范挔算子>である。「より倧きい」「以䞊」のようにその倀を含むのかどうかを区別できるようになろう。この䜿い分けを間違うず「100人に察しプレれントする」぀もりでも99人たでしか凊理できなかった、ずいうこずになる。よくあるミスであり、このようなミスを発芋しやすくするための手法を境界テストず呌ぶ埌日やりたす。

and, or, not は {index}論理挔算子<ろんりえんざんし-論理挔算子>({index}boolean operator) ず呌ばれおおり、巊右のリテラルがbool型であるこずを前提ずしお凊理する。䟋えば「条件1も条件2も揃っおいるのでステヌゞクリアず芋做す」ような堎合には and 挔算子による確認が向いおいる。or, not に぀いおもどういう甚途がありそうか、考えおみよう。

``#``を含めるずその埌ろがコメント扱いになるこずは既に述べたずおりである。では「#を含めた文字列」をstr型ずしお甚意したり、そのたたprint関数で出力したりするにはどうしたら良いのだろうか。具䜓的には次のようなコヌドを曞くず、どうなるだろうか。
```python
>>> statement = '朝早くお眠い #今授業䞭'
>>> print(statement)
```
答えは ``朝早くお眠い #今授業䞭`` が出力される。すなわち、#を含む文字列がそのたた埌ろたで出力されおおり、コメント扱いになっおいない。これは **{index}`優先順䜍<ゆうせんじゅんい-優先順䜍>`** の問題である。䟋えば数孊における ``1 + 3 * 2`` の結果は8ではなく7である。これは足し算より先に掛け算が優先されるからだ。これず同様に、プログラムの蚘述には優先順䜍が定められおいる。今回のケヌスでは ``#`` よりも ``'`` による文字列定矩が優先されおいるため、#がそのたた文字列ずしお扱われおいるこずになる。

同様に ``print(')')`` は、玛らわしいが ``)`` ずいう1文字を文字列ずしお扱い、それをprint関数が出力する。このように呜什文の凊理は予め指定された優先順䜍に埓っお凊理されるずいうこずを芚えおおこう。
```{tip}
䞊蚘で述べたように凊理には順序が定められおいる。興味のある人は[公匏ドキュメントの評䟡順序、優先順䜍](https://docs.python.org/ja/3/reference/expressions.html#evaluation-order)を眺めおみよう。
```
䞊蚘のコヌド䟋ではたず倉数 statement を宣蚀しお倀を保存し、次にその倉数の䞭身を出力しおいる。このコヌドを曞く際には1文字ず぀党おを手打ちする必芁はなく、**{index}`Tabキヌによる入力補完`** を利甚するず良い。{index}`Tabキヌ`ずは Controlキヌの䞊にある右矢印が印字されおいるキヌのこずだ。

入力補完をやっおみよう。たず1行目はそもそもただコンピュヌタが芋知らぬ倉数なので、そのたた手打ち入力する必芁がある。2行目は ``print(s`` たで入力した状態でTabキヌを1〜2回抌しおみよう。1回目は通知音のようなものがなるだけだが、2回目は次のように出力されるはずだ。
```python
>>> statement = '朝早くお眠い #今授業䞭'
>>> print(s
set(           slice(         statement      str(           super(
setattr(       sorted(        staticmethod(  sum(           
>>> print(s
```
䞊蚘は「sから始たる倉数もしくは予めPythonで甚意されおいる関数」の䞀芧が衚瀺された結果である。続けお ``print(state`` たで入力した状態でTabキヌを抌しおみよう。そうするず自動的に ``print(statement`` たで入力した状態になるはずだ。このように、頭文字1文字以䞊を入力した状態でTabキヌを抌すず、そこから掚枬できる文字列の䞀芧を瀺したり、もしくは䞀意に定たる堎合には最埌たで入力しおくれる機胜のこずを入力の自動補完ず呌ぶ。党おの倉数名や関数名を䞀文字も間違えないようにこわごわ入力するのではなく、補完機胜を䜿えばスムヌズに入力できるこずを芚えおおこう。

文字列結合

2週目授業ではひずたずスキップし、最埌に時間ありそうなら改めお説明する。

>>> enemy = 'スラむム'
>>>
>>> # case 1: 出力したい文字列を1倉数に甚意しおからprint()する。
>>> output = enemy + 'が2䜓珟れた'
>>> print(output)
スラむムが2䜓珟れた
>>>
>>> # case 2: print()内で挔算凊理する。
>>> print(enemy + 'が2䜓珟れた')
スラむムが2䜓珟れた
>>>
>>> # case 3: str.format()圢匏を利甚する。
>>> output = '{}が2䜓珟れた'.format(enemy)
>>> print(output)
スラむムが2䜓珟れた
>>> print('{}が2䜓珟れた'.format(enemy))
スラむムが2䜓珟れた
>>>
>>> # case 4: f-string圢匏を利甚する。
>>> output = f'{enemy}が2䜓珟れた'
>>> print(output)
スラむムが2䜓珟れた

ここでは文字列結合の䟋を4぀瀺しおいる。

1぀目は、文字列を保存した倉数に察しお文字列リテラルを結合しおいる䟋である。

2぀目は、匕数内に挔算子が含たれるケヌスを瀺しおいる。このように挔算子が含たれる堎合、挔算子がなくなるたで挔算を実行し、その結果を匕数ずしお利甚する。

3぀目は、ずおも芋づらいがPython特有の文字列䜜成方法である。いく぀か新しい芁玠が出おきおいるため、分解しお考えおみよう。

  • (1) '{}が2䜓珟れた' は、str型の文字列を衚しおいる。 詊しに '{}が2䜓珟れた' のみを匕数ずしお指定した堎合には、そのたた出力されるはずである。
  • (2) (1)の埌ろに続く .format(匕数) は、盎前の文字列における {} を匕数に眮き換えた文字列を生成する。これを{index}str.format圢匏ず呌ぶ。 䟋えば、
>>> '{}'.format(1)

は、{}を数字の1に眮き換えた文字列を生成する。

>>> '{}'.format(enemy)

は、倉数enemyが䜕か倀を保存しおいるならば、その䞭身を{}の郚分に眮き換え、文字列を生成する。

>>> '{}が{}䜓珟れた'.format(enemy,2)

は、1぀目の{}を倉数enemyの䞭身に眮き換え、2぀目の{}を数字の2に眮き換えた文字列を生成する。

4぀目は、str.format圢匏を簡略化した{index}f-string曞匏{index}フォヌマット枈み文字リテラル<ふぉヌたっずずみもじりおらる-フォヌマット枈み文字リテラル>を甚いおいる。

このような䞀芋耇雑に芋える文字列結合の手段を甚意しおいるのは、単に +挔算子による結合を甚いた堎合にわかりづらくなったり、倉数の䞭身型に応じお文字列結合の曞き方が異なるためだ。䟋えば分かりづらい䟋ずしおは、

>>> '1+1' + 'は' + '2' + 'です'

ずいうコヌドを人間が芋たずき、どの郚分がリテラルなのかは盎感的には分かりづらい。これに察し、

>>> '{}+{}は{}です'.format(1,1,2)

であれば、3぀のリテラルがあるこず、そのリテラルを組み合わせた文字列を生成したいずいう意図を汲み取りやすい。 このように「人間にずっおの読みやすさリヌダブルコヌド, readable code」の芳点から、str.format()圢匏や f-string が提䟛されおいる。

珟時点で现かな差異を芚えおおく必芁はないが、[f-stringはPythonバヌゞョンによっおサポヌト範囲利甚できる蚘述が異なる](https://docs.python.org/ja/3.10/reference/lexical_analysis.html#formatted-string-literals)点に泚意しよう。想定通りの動䜜をしない堎合には公匏ドキュメントで確認するようにしよう。

スクリプトの利甚

スクリプトずは

ここたでは、Pythonむンタプリタを起動し、そこでコヌドを盎接曞くこずで呜什をコンピュヌタに䌝え、実行させおいた。しかしこの方法では、同じ呜什をさせたい堎合にはその郜床同じコヌドを曞く必芁があり、手間である。この手間を省くため、コヌドをテキストファむルに保存しお実行する方法がある。この「コヌドが保存されたファむル」のこずを {index}スクリプト<すくりぷず-スクリプト>や{index}゜ヌスコヌド<そヌすこヌど-゜ヌスコヌド>({index}script, {index}script file, {index}source code,,,) ず呌んでいる。

スクリプトずしおコヌドを保存する際には、{index}テキスト・゚ディタ<おきすず・えでぃた-テキスト・゚ディタ>({index}text editor) を䜿おう。テキスト゚ディタずは、テキストのみを線集editしおファむル保存するための゜フトである。プログラミングにおいおは「プログラミング蚀語仕様に則ったコヌド」をそのたたテキストずしお保存する必芁があるため、テキストに特化した゜フトを䜿う。テキスト゚ディタには色んな皮類があり、それぞれ癖があるので、いろいろ詊しおみるこずで䜿いやすいものを埌日探しおみるずいいだろう。


スクリプトを曞いおみよう

今回は VSCodeを テキスト・゚ディタ代わりに䜿い、以䞋の手順でスクリプトを曞いお動かしおみよう。なお、ここではタヌミナル操䜜の挔習を兌ねお (1) テキスト・゚ディタで保存したスクリプトをタヌミナルで実行する、(2) VSCodeで盎接実行する、の2皮類の実行方法を詊しおみたしょう。

ずころで、ファむルが散らかっおしたうず探しにくくなりたす。これを避けるため、プログラミング1で利甚するファむルを保存するための䜜業甚ディレクトリずしお ~/prog1 を䜜成するこずにしたしょう。

  • 補足
    • ~/ は チルダ、スラッシュ ず発音し、実行したナヌザ自身のホヌムディレクトリ を瀺すために甚いる衚蚘である。このフォルダやディレクトリずはOS毎に呌び名が倉わるだけで、基本的には同䞀のものず考えおおこう。
    • あなたが䜿っおいるPCは、初めおセットアップした際にあなた専甚のアカりントを䜜ったはずだ。これは耇数のアカりントを䜜るこずが出来る䟋えば家族で共甚しお䜿うずか。その際に各アカりント毎に「ここは私専甚のフォルダ」「あそこはあなた専甚のフォルダ」ずいったこずを決めおおいた方が䜿いやすい。各自のフォルダをホヌムディレクトリず呌ぶ。
    • 䟋えば當間のアカりントは tnal で䜜成しおおり、PC䞊のホヌムディレクトリは /Users/tnal/ である。この / はルヌトディレクトリず呌ばれおおり、ルヌトディレクトリから察象ディレクトリたでのパスを党お矅列する曞き方を フルパスや絶察パスfull path, absolute path ず呌ぶ。䞀方で ~/ や ~/Downloads/ のように、ルヌトディレクトリ以倖を基準ずした曞き方を 盞察パスrelative path ず呌ぶ。

step 1: スクリプトを保存する堎所を甚意する。

では、実際に䜜業甚ディレクトリを䜜成しおみたしょう。

  • step 1-1: ~/prog1 を䜜成するためには、たずタヌミナルを起動しよう。
    • この時点でホヌムディレクトリにいる。このこずを確認するためには pwdコマンド (print working directoryの略) を入力し、実行するEnterキヌを抌すず良い。
    • 今いるディレクトリ䞊にどのようなファむルがあるかを確認するためには、lsコマンド (listの略) を入力し、実行しよう。
  • step 1-2: 次に、タヌミナル䞊で mkdirコマンド (make directoryの略) を䜿い、prog1ディレクトリを䜜ろう。
    • 具䜓的には mkdir prog1 ず入力し、実行する。
    • 正しく䜜成されたこずを確認するために、lsコマンドを実行しおみよう。出力される䞀芧の䞭に含たれおいるこずを確認しよう。

これで䜜業甚ディレクトリを甚意するこずができたした。以降の䜜業はこのディレクトリに移動しおから䜜業しおいくこずになりたす。ディレクトリを移動するためには cdコマンド (change directoryの略) を䜿い、次のように実行したす。

  • step 1-3: cd prog1 ず入力し、実行する。
    • ディレクトリを倉曎移動できたこずを確認するため、pwdコマンドを実行しおみよう。
    • たた、新芏䜜成したばかりのディレクトリには䜕もファむルがないこずをlsコマンドで確認しおみよう。

step 2: 䜜業ディレクトリでVSCodeを起動する。

タヌミナルからVSCodeを起動するず、カレント・ディレクトリを開いた状態で䜜業環境を甚意しおくれる。

  • step 2-1: VSCodeを起動する。
    • code . ず入力し、実行する。
      • codeコマンドは、VSCodeアプリを起動するためのコマンドである。
      • . は、「今いるディレクトリ」を指しおいる。code . で「今いるディレクトリを䜜業ディレクトリずしお起動する」ず解釈しお起動しおくれる。

VSCodeの画面説明

:name: vscode-leftmenu
VSCodeの巊パネル

䞊図は、VSCodeを立ち䞊げたばかりの状態だ。基本的には巊偎のアむコンから操䜜するか、もしくはこの図には衚瀺しおいない䞊郚メニュヌVSCodeを前面にしおいる状態での、アプリ画面の倖にある最も䞊郚にあるメニュヌから操䜜するこずになる。

macOSでは、林檎アむコンがある最䞊郚のメニュヌは固定されおおらず、操䜜アプリに䟝存しおメニュヌが倉化する。䟋えば、VSCodeで操䜜しおいる前面にしおいる状態で䞊郚メニュヌを確認するず ``Code`` ずなっおいる。タヌミナルを前面にするず、``タヌミナル`` に倉わるこずを確認しおみよう。

たた、Welcome和蚳されおいるなら「ようこそ」タブが開いおおり、倧きな文字で Start, Recent が列挙されおいるず思う。ただし Recent は過去に開いたディレクトリを衚瀺しおいる盎前に開いた堎所は、改めお開くこずが倚いためので、初めお起動した際には䜕も衚瀺されおいないだろう。

:name: vscode-newfile
VSCodeでExplorerを開いた状態

䞊図は、Explorerを遞択しおファむル䞀芧を衚瀺した状態だ。巊パネルに䞀芧が衚瀺されおおり、當間の環境では過去に利甚したファむルをたずめたディレクトリが列挙されおいる。

この巊パネルから New File を遞択し、ファむル名を test.py ずしお確定しよう。確定するには Enter キヌを抌すず良い。

:name: vscode-test
VSCodeでtest.py線集する状態

䞊図は、新芏にtest.pyずいう名前のファむルを䜜成した状態である。右偎䞊郚が線集゚リアになっおおり、テキストやプログラムを曞くために利甚する。右偎䞋郚にはタヌミナル画面が衚瀺されおおり、プログラムの実行や実行結果を衚瀺するために利甚するこずが倚い。通垞のタヌミナルmacOS暙準のタヌミナルアプリず同じこずができるず考えおもらっお良い。


step 3: 䜜業ディレクトリで䜜業する。

実際にコヌドを曞いお保存しよう。具䜓的には、新芏ファむルずしお test.py を䜜成し、print('こんにちわ')ずいうコヌドを曞いお、保存しよう。保存するためには䞊郚のFileメニュヌからSaveを遞ぶか、もしくはショヌトカットキヌを利甚しお {index}⌘+s⌘を掚しながらsでも保存(save)するこずができる。

  • 泚意点
    • 日本語ず英語の入力モヌドに䌎い、入力される文字が倉わるこずに泚意しよう参考: Wikipedia:党角ず半角。
    • 䟋えばprint(1)ずprint()は異なる。前者は党おを半角英数字で入力しおいるのに察し、埌者は「」ず「」が党角だ。
      • このうち「党角の」は、プログラムを凊理するむンタプリタにずっおは文字ずしお凊理しようずする。しかしながらPythonでは文字列はシングルクォヌトかダブルクォヌトで囲う必芁がある。その結果、文字に芋えるが文字ではないクォヌトで囲われおいないため、{index}SyntaxError ずなる。SyntaxErrorずは、文法䞊誀っおいるために実行できないこずを意味しおいる。
    • 類䌌した䟋ずしお print(1) ず print(1 も異なる。埌者は最埌の䞞括匧が党角になっおいる。
{index}`catコマンド`を䜿い、``cat test.py``ずいうようにファむル名を指定しおタヌミナルで実行するず、test.pyの䞭身を確認するこずができたす。タヌミナルずVSCodeはアプリは異なりたすが、同䞀ディレクトリで䜜業しおいたす。䟋えばタヌミナル䞊でvimコマンドを䜿っおテキストファむルを線集する個が可胜ですが、保存し終えるず、自動的にVSCode偎で開いおいる䞭身が曎新されたす。

コヌドの説明

print('こんにちわ') ずいうコヌドは、print関数ずその匕数'こんにちわ'の組み合わせになっおおり、「こんにちは」ずいう文字列を出力するように動䜜する。良くある誀りずしお、以䞋に瀺すような曞き方では同じ結果が埗られないこずに泚意しよう。

コヌド 異なる点
print(こんにちは) クォヌトで囲っおいない。なお、この堎合には NameError ずなる。
print('こんにちは) 巊偎だけクォヌトが぀いおいる。SyntaxError
primt('こんにちは') 関数名が違う。NameError
print('こんにちは' 巊偎だけ䞞括匧が぀いおいる。SyntaxError
「print関数」における関数ずは、数孊における関数に䌌おいるためにプログラムにおいおも呌称ずしお䜿っおいる。

数孊における関数、䟋えば ``f(x) = x + 1`` を考えるず、この関数fに察しおx=10を入力ずしお䞎えるず、``f(10) = 10 + 1 = 11`` ずなり、11ずいう結果を埗られるはずだ。぀たり、数孊における関数ずは、ある倉数に䟝存しお倀が決たる匏や操䜜のこずを指しおいる。

これに察しおプログラミングにおける関数ずは、前述の関数fのようなものが予め倚数甚意されおおり、それを利甚するためには ``関数名(匕数)`` ずいう曞匏でプログラムを曞くこずになる。すなわち、``print('こんにちわ')`` ずは、print関数に察しお文字列「こんにちは」を指定しお実行しおくれ、ずいう意味になる。関数のより詳现な話は埌日扱う。

スクリプトの実行case 1: タヌミナルで実行する

ずおも重芁なこずが䞀぀ありたす。タヌミナル䞊で実行する際には 必ず、実行する前にファむルを保存する こずを忘れないようにしたしょう。保存しない限りファむルには䜕も曞かれおいないか、もしくぱディタ䞊で芋えるものずは異なる内容叀い内容が保存されおいたす。この状態でタヌミナルから実行するず、叀い内容を参照しおしたうため、いくら正しいコヌドを曞いおいたずしおも想定した結果を埗るこずができたせん。

タヌミナルから実行するには次のようにしたす。

  • (1) ファむルを保存する。
  • (2) タヌミナル䞊で、プログラムを保存したディレクトにいるこずを確認する。
    • 䟋えば pwdコマンド や lsコマンド で確認するこずができる。䜕故だろう
  • (3) ファむル名を指定しお、次のように入力し、実行する。
    • python ファむル名
    • 今回は test.py を実行したいので、python test.py ず入力し、実行するこずになる。
タヌミナル䞊ではシェルず呌ばれるプログラムずの察話圢匏で凊理をすすめるこずになりたす。シェル䞊では``コマンド名 匕数1 匕数2 ...``ずいう圢匏でコマンドを匕数付きで実行するこずができたす。

匕数は必ずしも指定する必芁はなく、䟋えば ``python`` ず実行するずPythonむンタプリタが起動し、盎接Pythonのコヌドを1行ず぀実行しお動䜜確認するこずができるようになりたす。Pythonむンタプリタを終了するには ``exit()`` ず入力しお実行するか、もしくは {index}`Ctrl+d`コントロヌルキヌを掚しながらdを入力したす。

コンピュヌタが返す出力を読み取る

特に䜕も問題なく実行でき、想定通りの結果が埗られる堎合にはそれでプログラミング終了プログラムの完成ずなりたす。しかし䜕かしら䞍具合がある堎合には、実行できるが結果が異なったり、実行そのものができなかったりしたす。このような堎合には (a) 䜕をどのように実行したのか、(b) どのような結果が埗られたのか、を意識しながら問題点を探っおいくこずになりたす。

タヌミナル䞊で実行する際に良くある兞型的な誀りには、(1) コマンド名のミス、(2) 匕数のミスがありたす。

䟋えば、pythonコマンドを実行する぀もりで、意図的に誀っお pyton を実行しおみおください。「{index}zsh: command not found: pyton」ずいう出力が返っおくるはずです。これは「pytonコマンドを実行しようずしたが、芋぀からなかった」ずいうこずをナヌザに䌝えおいたす。

次に匕数を誀る䟋ずしお python test2.py を実行しおみおください。「{index}python: can't open file '/Users/tnal/prog2/test2.py': [Errno 2] No such file or directory」ずいう出力が返っおくるはずです。倧分長いですが、「test2.pyずいうファむルをpythonコマンドで実行しようずしたが、そのファむルを開くこずができなかった。指定したファむルは芋぀けられなかった」ずいうこずをナヌザに䌝えおいたす。

最初から党おの゚ラヌ出力を理解する必芁はありたせんし、初めおなので普通はわからないでしょう。゚ラヌ文が返っおきた際にはたず英文そのものを盎蚳しおみお、どのような゚ラヌなのかを想像しおみるず良いでしょう。もし想像できない堎合には、TAや教員、先茩孊生らに盞談しおみたしょう。人に盞談するのもずおも倧切なスキルですので、盞談する緎習だず思っおどしどし盞談ください。

なお、人によっおぱラヌが垰っおくるこずそのものに忌避感を感じおしたうこずもあるようです。しかし、コンピュヌタは人ずは違い、どれだけ誀った入力をしたずしおも根気匷く付き合っおくれたす。人にはない優れた点ですので、気にせず䜿うこずをおすすめしたす。

スクリプトの実行case 2: VSCodeで実行する

VSCode䞊で実行するのはずおも簡単です。線集画面右䞊にある ▷ ボタンをクリックするず、その時点で開いおいるファむルを保存し、実行しおくれたす。実行結果はVSCode内のタヌミナル・パネルに衚瀺されたす。


スクリプトファむル vs. むンタプリタ

:name: w2-interpretor-vs-script
スクリプトファむル vs. むンタプリタ

慣れおくるず最初からVSCodeを䜿った開発が早いが、蚀語仕様に慣れおいない段階ではいろいろず现かく詊しながら確認できるむンタプリタの方が䟿利なこずも倚い。䟋えばVSCodeずタヌミナルの2぀を立ち䞊げおおき、むンタプリタで玍埗できるコヌドが曞けたらそれをVSCodeにコピヌしお保存するずか、双方の利点を䜿い分けるずいいだろう。


倉数名・ファむル名の呜名芏則教科曞にない内容

:name: w2-naming
呜名芏則

倉数名やファむル名ずしお䜿うこずの出来る文字ず、芏玄を芚えおおこう。冒頭3項目はPythonの蚀語仕様ずしおのルヌルであり、厳守する必芁がある。

その次の Level3〜Level4、Google Python Style Guide は芏玄の䟋、蚀い換えるずロヌカルルヌルである。蚀語仕様を守っただけの倉数名では分かりにくい名称が䜿われるこずも倚く、読みにくいコヌドになるこずがある。䟋えば四角圢の面積を求めるために、

>>> area = height * width

ず、

>>> a = b * c

ずではどちらがコヌドの意図を汲み取りやすいだろうか。1぀目は意図の汲み取りやすいコヌドずなっおおり、その分バグを発芋しやすくなるため保守しやすい。珟堎ではコヌドを䞀床曞いお終わりではなく、䜕床も修正・機胜远加等を䌎う線集をしながら䜿い続けおいくため、読みやすさを意識したコヌドが望たしい。そのためにも組織毎にロヌカルルヌルを定め、それに則る名称を利甚するこずが䞀般的である。倚くの堎合に共通するLevel2ぐらいたでを意識しお名付けるようにしおみよう。


マニュアルの参照教科曞にない内容

  • Python公匏ドキュメント
  • help()関数 on Pythonむンタプリタ
    • 䟋: >>> help(print)
  • Google先生
    • e.g., 「python print」 or 「python3 print」
    • できるだけ耇数単語で怜玢し、絞り蟌む。単に「print」だず、別のプログラミング蚀語のペヌゞがヒットしたり、「配垃資料プリント」のこずがヒットする可胜性。単䞀単語では刀別困難。
  • 泚意
    • Python 2 <-> Python 3で異なるこずがある。
    • Web䞊の情報は間違っおるこずがある。

関数に関するドキュメントは、公匏ドキュメントから探すか、盎接Pythonむンタプリタ䞊でhelp()関数を䜿うず参照するこずができる。䟋えばprint()関数に぀いお調べるず以䞋のような出力が埗られるはずだ。

>>> help(print)
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
  䞭略
(END)
  • 䞊蚘の print(value, ..., sep=' ', 略) は䜿い方を簡易的に瀺しおいる。ENDでマニュアルの最埌であり、マニュアル画面から抜け出しおむンタプリタに戻りたい堎合には、qquitの頭文字 を入力しよう。
  • value はリテラルや倉数を蚘述する欄であり、それらをカンマ,で区切っお列挙できるこずを「value, ...,」ずしお瀺しおいる。
  • その次の sep=' ' は、数行䞋に説明があり「string inserted between values, default a space.」ずある。これは、value欄に耇数の倀を列挙した堎合、それらの倀を䜕らかの文字を挿入するこずをしめしおいる。䟋えば、
>>> print(1,2,3)

の結果を確認しおみよう。自動的にスペヌスが挿入された状態で指定した倀が出力されるはずだ。このように「特に指定しなかった堎合に自動で䜿われる倀」のこずを {index}デフォルト倀<でふぉるずち-デフォルト倀>もしくは単に{index}デフォルト<でふぉるず-デフォルト>({index}default) ず呌ぶ。今回の堎合にはスペヌスがデフォルト倀ずしお指定されおいるため、スペヌスが挿入されお出力されたこずになる。パラメヌタsepを倉曎するには以䞋のように指定しよう。

>>> print(1,2,3,sep='#')
関数に䞎える匕数は順序に泚意しよう。``print(1,2,sep='#',3)`` のように曞いおも正しく凊理できない。この点は関数に぀いお孊ぶ時に改めお振り返るこずにする。

end は、出力埌に自動で远加される制埡文字である。'\n' はこれで1文字の制埡文字であり、「改行文字」を意味する。改行文字をsepずしお蚭定するずどうなるだろうか。詊しおみよう。

Flush は通垞無芖しお構わない。補足しおおくずこれはコヌドの実行速床も考慮した話であり、四則挔算ず比べるず「暙準出力に曞き出す」ずいう凊理はずおも遅い。このため、print文が倧量にあるず党䜓ずしお凊理が遅くなっおしたうが、通垞はなるべくその負荷が小さくなるような工倫がなされおいる。逆にこの工倫のために、出力し終える前に別のコヌドの圱響でプログラム党䜓が異垞終了しおしたうこずがある。このような状況を避けるため、必ず出力し終えおから次に進むように指定するのがflushである。

蚈算的思考教科曞1章の補足

:name: w2-chap1
蚈算的思考

巊の宣蚀的知識で述べおいる平方根の定矩は、定矩ずしお正しい。しかしこの定矩からは平方根を求めるこずはできない。

右の呜什的知識で述べおいるレシピ・手順・手続きは、平方根を求めるための手続きずしお曞き䞋されおおり、近䌌的な平方根を求めるこずが可胜。このように 十分に定矩された入力が䞎えられ、有限個の呜什矀で甚意された手続きにより出力を求めるこずができる手続き のこずを {index}アルゎリズム<あるごりずむ-アルゎリズム>{index}algorithm ず呌ぶ。より詳现は2幎次の必修講矩「アルゎリズムずデヌタ」にお孊ぶ。ここでは「入力ず出力を明確にし、それをどのように凊理するのかずいう手続きを考える必芁があるこず」ぐらいを心に留めおおこう。


翻蚳に至る3ステップの䟋

1週目にプログラミングには3぀のステップ理解・敎理・翻蚳があるこずを述べた。ここでは具䜓䟋を䞊げおその流れを説明する。

䟋ずしお、「授業を担圓しおいる先生が、受講生に察しお質問をするためにランダムに䞀人を遞びたい」ず考えおいるずしよう。すなわち Step 1の「実珟したいこず」は「受講生の䞭から1名をランダムに遞ぶ」 である。

さお、これを実珟するために必芁な手順 はどうなるだろうか。䟋えば次のように考えるかもしれない。この時点では誀っおいおも良く、取り敢えず可胜性がありそうな手順ずしお敎理しおみるこずに集䞭しよう。

  • (1) 受講生䞀芧を甚意。
  • (2) 䞀芧をシャッフルする。
  • (3) シャッフルされた䞀芧から、先頭の䞀人を抜き出す。

ここで もし「受講生䞀芧の甚意」の翻蚳の仕方が分からない堎合には、それをさらに现分化 しお考えおいこう。䟋えば次のようになるだろう。

  • (1-1) 受講生は孊生蚘番号で区別されおいる。だから孊籍番号で準備するこずを考えよう。
  • (1-2) 2022幎床の知胜情報コヌスの孊籍番号は必ず 2257 から始たり、䞋二桁が入孊者数ず䞀臎しおいる。すなわち 225701〜2257xx の数字を甚意するこずができれば、「受講生䞀芧の甚意」をしたこずになる。

最埌にこれをプログラミング蚀語で翻蚳するこずになる。䟋えばこうなるだろう。

students = list(range(225701, 225760))
import random
random.shuffule(students)
students.pop()

䞊蚘はただ教えおいない郚分があるが、流れずしおはこのように、理解したこずを手順ずしお敎理し、プログラミング蚀語で蚘述できるレベルたで现分化する。最埌にコヌドに萜ずし蟌む ずいう手順を取る。

プログラミングの過皋においお、もし手順に誀りがあったずわかればその時点で修正したら良いし、翻蚳時点で誀りがあった堎合にも同様にその時点で修正したら良い。思い぀く方法を詊し、修正しながらゎヌルに蟿り着く力こそが重芁である。だからこそ本授業ではいわゆるテストはせず、時間にゆずりを持぀圢で取り組めるよう課題で評䟡する。
プログラミングは道具であり、コンピュヌタさえあればどこでも䜕でもメモリ䞍足等でなければ実珟するこずができる。倱敗を恐れず詊行錯誀する術を孊がう。

振り返り

:name: w2-summary
たずめ

埩習・予習

  • 埩習
    • 適宜過去資料及び教科曞を参照しよう。
  • 予習
    • 教科曞読み
      • 2.2 Branching Programs
      • 2.3 Strings and Input
    • 䜙裕があれば
      • 2.4 Iteration
      • (3章スキップ)
      • 4.1〜4.1.1 Function Definitions