第1部ではPythonプログラミングに必要な基礎知識を学んでいきます。
演習には PyQ を利用します。
目次
- 多少変なプログラムを書いて実行したくらいではpyq, お手持ちのPCは壊れないので、安心して間違えてください
- プログラムに問題がある場合はプログラムを実行した時にエラーメッセージが出力されます。そのメッセージによって問題に気づくことができますので、プログラムを書くときは細かく実行してエラーがでないかを確認していくと途中でつまずくことが少なくなります
- プログラムを書くときは全角半角に注意してください
- 空白(スペース)を入力する際、全角だとエラーになります。半角スペースを入力してください
- 別の言語なら知っているという方や以前プログラミングについて学んだことがあるような方は講義中にPyQの演習にどんどん取り掛かってもらって構いません。
- Pythonは教育用プログラミング言語を元として開発されました。しかし機能はほかのプログラミング言語に引けを取らず、実際のシステム開発や研究の分野、教育の現場でも数多く利用されています。
- PythonはRubyやPHPをはじめとするコンパイル不要な
インタプリタ言語の一種です。- 書けばすぐ動きます。C言語やJava, Go言語のような
コンパイル言語では実行前にコンパイルという作業が必要になります。
- 書けばすぐ動きます。C言語やJava, Go言語のような
- Pythonはインデントとよばれるスペースやタブを使った記述を強制されるため一般的にはきれいなコードになると言われます。
- まずは PyQ のチュートリアルで、プログラミングの第一歩を踏み出しましょう!
- https://pyconjp2017.pyq.jp/login/ にアクセス
- 配布したアカウントでログイン
- アカウントは当日お伝えします
- チュートリアルにチャレンジ
変数とは、プログラムの中で扱う値に名前をつけるものです。
=の左辺に変数の名前、右辺に値を記述することで、変数を使うことができます
a = 1
b = a + 2コードの解説
- 1行目は、
a に 1 を代入すると表現されます。この行以降で変数aを参照できるようになります- 変数に代入されている値を読み込んで利用することを
参照するといいます
- 変数に代入されている値を読み込んで利用することを
- 2行目では変数bへの代入時に早速変数aを参照しています。詳しくは以下のことを行なっています
- 変数a を参照して値(=1)を読み込む
- 1 と 2 を加算(a + 2 の計算)
- 加算した結果(=3)を b に代入
- 1行目は、
変数を利用することで、機械に値を覚えさせ、好きなタイミングで参照することができます
コラム
- 一度も代入が行われていない
変数は参照することができません。下記のように代入していない変数「z」を参照するコードを実行すると、エラーが発生します。
z発生するエラー:
Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'z' is not defined
- 一度も代入が行われていない
- 変数について学ぶ場合はこちら: https://pyq.jp/quests/#notification
文字列は、「文字が並んでいるもの」を表す値です
- 文字列を利用するには、値を
" (ダブルクォーテーション)または' (シングルクォーテーション)で囲みます
print("PyConJP Tutorial 2017")
print("~ Python を右腕にしよう ~")- printは値の出力に利用する関数です。関数の説明は後ほどでてきます。
文字列は、文字列同士を + でつなげることで、一つの文字列に結合できます
message = "Hello" + "World"
print(message)- このプログラムを実行すると、
HelloWorldが出力されます
リストは変数型の一種で、リスト全体を [ と ] で囲み、各要素を , (カンマ) で区切って記述します
hiyoko_list = ["オス", "メス", "オス", "メス"]- リストは、変数の後ろに
[番号]と書くことで、中の要素を参照できます- この時の番号を
インデックスと呼びます
- この時の番号を
print(hiyoko_list[0]) # => オス
print(hiyoko_list[1]) # => メス- 要素のインデックスが1から始まるのではなく、0から始まるのはPython以前のプログラミング言語からの慣習です
次のように リスト型の値の後ろに .append() と記述することでリストの末尾に要素を追加できます
a = ["x", "y"]
a.append("z")
print(a[2]) # => z と出力
.append()はリストオブジェクトのメソッドです。メソッドについては後で出てきます。
要素の削除も行えます。リストに .pop() と記述することでリストの末尾に要素を削除できます
a = ["x", "y"] print(a[1]) # => "y" a.pop() print(a[1]) # => 要素がないので ``IndexError`` というエラーになります
削除する要素の位置を指定したい場合は .pop(1) のようにインデックスで指定します
a = ["x", "y", "z"]
a.pop(1)
print(a[1]) # => z が表示される ("y" が削除され "z" が前にひとつずれる
- リストのPyQ: https://pyq.jp/quests/#duty
コメント文はプログラムコードを説明したり、プログラム中にメモを書く際に使います。
- コメントはプログラム中で
#の後に書きます。#の文字から行末までがコメントとして扱われます。 - コメント部分はPythonからは実行されず、解釈もされません。
- コードを自分で書いてみる時、コメントは省いてもプログラムの動きはかわりません
# これはコメントです
print("これは実行されます") # コードの後ろにもコメントはかけます
# print("これは実行されません")- プログラムは上から下に1行ずつ実行されます
- 制御フロー文と呼ばれる特殊な文を書くことで、プログラムが実行される順番や回数を制御できます
- ここでは、代表的な制御フローである if文, for文を学びます
if文は条件に合致した場合のみプログラムを実行する文です
- 次のコードは変数 age の値が 20 以上だった場合、「大人ですね」と表示するプログラムです
if age >= 20:
print("大人ですね")コードの解説:
- if文では、
ifと: (コロン)の間に条件式を書きます- 1行目の
age >= 20が条件式です。変数a が 20 以上かどうかを判定しています。条件式についてはあとで出てきます。
- 1行目の
- 2行目の
print("大人ですね")が、条件に一致する場合に実行されるコードです
- if文では、
条件に合致した場合に実行される対象は、if 文に続けて書かれた
インデント(字下げ)されたコードのまとまり(コードブロック)ですif age >= 20: print("大人ですね") print("条件に当てはまれば") print("この文も実行されます") print("この文はifと関係なく常に実行されます")
- インデントを行うには、一般的には4つのスペースを入力します
- 条件式は、真偽値を返す式を記述します
- わかりやすく表すと「yesかnoか」ですが、Pythonでは真(yes)を
True、偽(no)をFalseと表します
- わかりやすく表すと「yesかnoか」ですが、Pythonでは真(yes)を
if True:
print("この文は常に実行されます")
if False:
print("この文は常に実行されません")条件式では以下の演算子がよくつかわれます
| 演算子 | 説明 |
|---|---|
== |
等しい |
!= |
等しくない |
> |
より大きい |
< |
より小さい |
>= |
以上 |
<= |
以下 |
if ~ else文は条件に一致した場合としなかった場合にそれぞれ違うコードを記述する文です
if age >= 20:
print("大人ですね")
else:
print("子供ですね")for 文は繰り返しコードを実行する文です
- 次のコードは 変数 hiyoko_list の中のヒヨコたちがオスかメスか判定するプログラムです
hiyoko_list = ["オス", "メス", "オス", "メス"]
for hiyoko in hiyoko_list:
if hiyoko == "オス":
print("このヒヨコはオス")
else:
print("このヒヨコはメス")- コードの解説
- 1行目: 変数 hiyoko_list にリストの値を代入しています。リストの要素には、"オス" または "メス" の文字列が入っています
- 2行目: 空行です。プログラムを見やすくするために空行を入れることができます。
- 3行目: for文がでてきました。for文は
for 変数 in ループ対象:の形で記述します- for文では、以下の順番でプログラムが実行されます
- ループ対象(hiyoko_list) の変数の中から、先頭の要素を参照する
- で参照した値を変数(hiyoko)に代入
- for文に続けてインデントされたコードブロックを実行します
- ループ対象の次の要素を参照し、2, 3の流れを要素がなくなるまで繰り返す
- for文では、以下の順番でプログラムが実行されます
- 四則演算、ifのPyQ https://pyq.jp/quests/#water
- リスト、forのPyQ https://pyq.jp/quests/#duty
関数とは、どのプログラミング言語でも使われるとても大切な概念です
変数は「値」に対して名前をつけたものでしたが、関数は「処理」に対して名前がついたものです
例えば
len()という関数は、「与えられたリストの長さを計算する処理」を行いますl = ['A', 'B', 'C', 'D'] l_length = len(l) print(l_length) # => 4
関数は
関数名()の形で「呼び出し」ます(処理を実際に行わせることを呼び出すと言います)関数の
()の中には、関数に与える値を指定します。その値を「引数」と呼びます関数は呼び出しを行なうと「値を返す」ものがあります。返された値は、変数に代入したり、別の関数の引数として与えることができます。
- 上の用語を使って``len()`` 関数を表現しなおすと、
len()は 「引数」で与えられたリストの長さを「返す」関数といえます
- 上の用語を使って``len()`` 関数を表現しなおすと、
関数は上の
len()関数のように、引数で与える値と、返り値があらかじめ決まっています。len()以外にも便利な関数は数多くありますが、プログラミングを上達していく上では、関数の引数・返り値を一つ一つ学んでいくということが必要になります。
Pythonの関数呼び出しでは、引数名をキーワード指定できます。
- pythonでは キーワード指定しない場合、定義されている順番で引数が与えられます。キーワードで指定する場合、順番を気にしないで済みます
たとえば、後の説明に open() という関数がでてきますが、この関数は以下の形で定義されています
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)上記の open() 関数を呼び出す際、次の二つの文は同じ意味になります
open("text.txt", "r", -1, "utf-8")
open("text.txt", mode="r", buffering=-1, encoding="utf-8")さらに定義時に = で 値が指定されている引数は、デフォルト引数と呼ばれ、呼び出し時に省略することが可能です
open()関数の例では、第一引数の file は、値が入れられていないので必須です。その他のすべての引数はデフォルト引数であり、省略可能ですコラム:
open()を引数なしで呼び出した場合、以下のエラーになりますopen() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Required argument 'name' (pos 1) not found
- メソッドは、値(オブジェクト)に紐づいて何らかの処理を行う関数です
list.append()のように、値の型に応じて利用できるメソッドは異なります- 関数同様、型と、型ごとに利用できるメソッドを覚えていくのも、プログラムを学ぶ上で必要になっていきます
- 関数やメソッド(クラス)は自由につくる(定義する)ことができますが、今回のチュートリアルでは扱いません
- pyq上の 「関数の基本」「クラスの基本」で定義の仕方を学べます。
- モジュールとは関数やクラスなどをまとめたPythonファイルです。
- モジュールは
インポートすることで使えます。 datetimeという日時を操作するライブラリは以下のようにimport文を用いることで利用できるようになります。
import datetime
one_day = datetime.datetime(2016, 1, 31) # datetimeモジュールのdatetimeを使います。
print(one_day)以下のように出力されます:
2016-01-31 00:00:00
import文の前にfromをつけて以下のように記述することができます。
from datetime import datetime
one_day = datetime(2016, 1, 31)
print(one_day)- このように記述することで、モジュールの中で何を利用するのかがわかりやすくなります
- datetimeモジュールの使い方を学べます: https://pyq.jp/quests/#datetime
ファイルを読む・または書く(作る)という処理をプログラムから行えます。
例えば以下は test.txt という名前のテキストファイルを読み込んで内容を出力するプログラムです
with open('test.txt', encoding='utf-8') as fp:
data = fp.read()
print(data)- ファイルはプログラムでは「開く」「読みこむ、または書き込む」「閉じる」という3ステップが操作します。
- 「閉じる」のを忘れてしまうと、OSが同時にファイルを開ける数の上限に達してしまい新しくファイルを開けなくなるなど、思いもよらないエラーを招くことがあります。
- with文 はよく open と組み合わせて使われる構文で、組み合わせて使うことで最後の「閉じる」ステップをプログラムが自動でおこなってくれます
- コードの解説:
- 1行目で open() 関数で 'test.txt' というファイルを開き、fp という変数に入れます
- 2行目で fp に対して read (読み込み) を実行し、結果を data という変数に代入しています
- 3行目で 読み込んだ data を出力しています
- 「閉じる」コードは記述していませんが、これはwithが裏でやってくれています
- note: with文は open 以外にも様々な使い方ができます。詳しくは with文とコンテキストマネージャ を参照ください
- open関数は、ファイルを開き、ファイルオブジェクトを返します。
- 第一引数に開くファイルを指定します。ファイルは
相対パスや絶対パスで指定します(パスについては後ででてきます - よく使われるオプション引数は
modeとencodingですmode: 書き込みモードか読み込みモードを指定するオプションです。何も指定しない場合は読み込みモードです。書き込みモードでファイルを開きたい場合は mode='w' と指定します。encodingはファイルのエンコーディングを指定します。ファイルのエンコーディングを正しく設定しないと、読み込み時や、書き込んだファイルを開いた時に文字化けが発生します
- 第一引数に開くファイルを指定します。ファイルは
ファイルを読み書きする際「どこのファイル」にアクセスするかの場所を表す文字列を「パス」といいます
パスは、ディレクトリ(フォルダ)を
/(windowsでは¥) で区切った形で表されますパスの具体例:
/Users/furi/Desktop/neko.png(windowsではC:¥Users¥furi¥Desktop/neko.png)上の具体例の用に、絶対パスと言います。
相対パスは、現在の(スクリプトを実行する)ディレクトリを基準として、そこからの相対的なパスを記述したものです
現在のディレクトリが
/Users/furi/codesの場合に相対パスがどう解釈されるかの例挙げます相対パス
解釈される絶対パス
備考
"neko.png"
"/Users/furi/codes/neko.png"
"./neko.png"
"/Users/furi/codes/neko.png"
先頭に何も書かないのと "./" をつけるのは同じ意味です
"images/neko.png"
"/Users/furi/codes/images/neko.png"
python の os モジュールには、ファイル・パスといったosに依存した関数がまとまっています
次のプログラムは、osが提供している関数を使って、ファイルの一覧を作成するプログラムです。
import os
target_path = "./"
for filename in os.listdir(target_path):
file_path = os.path.join(target_path, filename)
if os.path.isfile(file_path):
print(filename)- コードの解説
os.listdir(path)は引数で与えられたディレクトリのパス内のすべてのファイル・ディレクトリをリストで返しますos.path.join(path, filename)はdir_pathとfilenameを結合して、filenameのパスを返します- filename には相対パスを記述することはできません。
- コラム: なぜこの関数を使うか
- 単純に文字列で ``"/Users/furi/" + "cat.png" `` と結合することはできますが、以下のメリットがあります
- メリット1: windows/linuxでパスの区切り文字が違うが、os.path.joinを使うことで違いを意識しないでプログラムがかける
- メリット2: dir_path の末尾に "/" がついていてもいなくてもプログラムがよしなにパスを返してくれる
- 単純に文字列で ``"/Users/furi/" + "cat.png" `` と結合することはできますが、以下のメリットがあります
os.path.isfile(path)は、与えらたパスがファイルかどうかを判定して、真偽値を返します- path がディレクトリの場合
Falseを返します
- path がディレクトリの場合
- ファイルの読み込み: https://pyq.jp/quests/#lunch
- ファイルの書き込み: https://pyq.jp/quests/#log
- osモジュールの使い方: https://pyq.jp/quests/#module_os