Skip to content
This repository was archived by the owner on Jan 8, 2019. It is now read-only.

Latest commit

 

History

History
313 lines (204 loc) · 15 KB

File metadata and controls

313 lines (204 loc) · 15 KB

第1部 Pythonの基礎

第1部では、実際のプログラミングで必要な基礎知識を身につけていただきます。

手元で実際にコードを実行していただくため、Python3.5, 3.4、いずれかのコンソールを起動してください。 入力しきれない場合はコピペしてもOKです。

参加者さんのレベルも様々かと思いますので、わかる方は早速課題からとりかかっていただいても構いません。

  • Pythonはもともとは教育用言語として開発されました。しかし機能はほかのプログラミング言語に引けを取らず、今やシステム開発や研究の現場で数多く利用されています。
  • PythonはRubyやPHPをはじめとするコンパイル不要な インタプリタ言語 の一種です。
    • 書けばすぐ動きます。C言語やJava, Go言語のような コンパイル言語 では実行前にコンパイルという作業が必要になります。
  • Pythonはインデントとよばれるスペースやタブを使った記述を強制されるため一般的にはきれいなコードになると言われます。

Pythonにかぎらずプログラミング言語には 変数 という機能があります。

よく 値の入れ物 だとか 保持しておく容器 のような説明がされますが、これ以上の説明は難しいので実例を見ていただきます。

a = 1
b = a
c = a + 1

# 上記を実施後「a」だけを入力すると「a」の中身を見ることができます。
a
# 「b」「c」の中もそれぞれ見てみましょう。以降このように値を見ることを「参照する」といいます。
  • 変数 は = (イコール)記号によって 右辺 の値を 左辺 に 代入 することで初めて利用できるようになります。
    • 等価 を 表すにはイコール記号を2つつなげて == と表現します。
    • 非等価 を 表すには ! 記号をつなげて != と表現します。
  • 一度も代入が行われていない 変数 は見ることができません。例えば下記のように代入していない変数「z」を 参照してみましょう。
z

以下の様なエラーが発生します:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'z' is not defined
  • Pythonでは既に値が入っている変数に対して再度代入(再代入)することもできます。
a = 2
a = 3
  • Pythonは動的型付け言語と呼ばれており、変数に対して直接値を代入することができましたが、 C や Java といった言語では定義後に指定された 型 しか代入できません。
    • Pythonの方が気軽に思えますが、どちらも一長一短があるため必ずしもどちらが良いとは言えません。
    • 型とは 数値 や 文字列 といったもので、値の性質を表しています。
      • 例えばPythonでそれぞれの型を加算すると、数値は 1 + 2 == 3 となり、文字列は '1' + '2' == '12' となります。
  • 変数を作成する方法は = を使った代入だけではありません。後述する 関数 の定義や、インポート文でも変数が作成されています。
  • 作成されていなくても参照できる変数があります。具体的には range や int などといったものです。
    • これらは ビルトインスコープ というスコープに属する 常に参照できる 特殊な変数です。
    • スコープ というものについてこのチュートリアルで詳しく理解する必要はありませんが、 常に参照できる 特殊な変数が存在するということは覚えておいてください。

PyQでは以下の課題を用意しています。 変数 についてもっと詳しく理解したい方は以下の課題に挑戦してみましょう。

  • プログラムは 順次, 分岐, 反復 といった基本動作の組み合わせによって動作します。
  • 順次とは 上から順に実行すること です。プログラムは必ず上から下に向かって1つずつ実行されます。
    • 後述する 反復 では上に処理が戻っているように見えますが、下が先に実行されているというわけではありません。
  • 分岐はプログラムに欠かせない ~だったら~する といった考え方です。例えば以下の様なものが考えられます。
    • 数値が奇数か偶数か表示する
    • ファイルが存在したら削除する
  • 以下のように記述できます。奇数と偶数を判定するプログラムです。
    • if文, else文 を適用する範囲のインデントを下げるのがポイントです。
i = 100
if i % 2 == 1:
    print(i, 'は奇数です')
else:
    print(i, 'は偶数です')

i = 101
if i % 2 == 1:
    print(i, 'は奇数です')
else:
    print(i, 'は偶数です')
  • ※1 % は余りを計算する演算子です。 2で割って1余る数字 は 奇数 と判断しています。
  • ※2 == は一致することを確かめる演算子です。
  • ※3 print はコンソールに文字列を 表示する ための関数です。関数については後述します。
  • else は if に該当しなかった時に実行されます。
  • if, else の他にPythonには elif と呼ばれる特殊な文があります。
    • これは`else` かつ if (さらに条件を書きたい)といった場合に利用されます。以下のように利用します。
if i > 0:
    print(i, 'は1以上の正の数です')
elif i < 0:
    print(i, 'は負の数です')
else:
    print('0です')
  • Pythonには case 文と呼ばれる分岐が存在しないため、 if, elif, else を組み合わせて表現することになります。
  • 反復は繰り返し(ループ)を表現します。
  • 以下は 0 ~ 9 の数値を小さい順に 奇数 か 偶数 を判定するプログラムです。
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
    if i % 2 == 1:
        print(i, 'は奇数です')
    else:
        print(i, 'は偶数です')
  • 上記を実行すると i という変数に 0 ~ 9 の数値が順番に入り、奇数か偶数かの判定が実行されるというわけです。
  • Pythonにおける反復は for文, while文 のいずれでも表現できますが、今回のチュートリアルで使うのは for文 だけで事足ります。
    • 実際の利用ケースも while文 より for文 の方が多いです。
  • Pythonには range という ビルトイン関数 (最初から使える関数)があります。
    • Python2系までは range(10) とすることで [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] というリストオブジェクトが生成されます。
    • Python3系からは rangeオブジェクト というオブジェクトが生成されるようになります。これはリストと同じように使えますが要素にアクセスした時に値が生成されるため 省メモリ です。
      • 上記課題では [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] を使っていますが range(10) を使ったほうがプログラムがシンプルになります。余裕があれば同じ結果に成ることを確認してみましょう。

PyQでは以下の課題を用意しています。 分岐と反復(ループ) についてもっと詳しく理解したい方は以下の課題に挑戦してみましょう。

プログラムを書いていると 同じような処理 を何度も書く必要があります。

この 同じような処理 を切り出して、繰り返し利用できるようにしたものが 関数 です。

  • 以下は時給(wage)と働いた時間を受け取り、給料を表示する calc_wage 関数の定義と実行です。どのような結果になるか試してみてください。
def calc_wage(wage, hours):
    total_wage = wage * hours
    return total_wage

calc_wage(900, 5)
  • 関数が受け取る値を引数(ひきすう)といいます。以下のように2つの種類に分別されますがチュートリアルではどちらも 引数 と呼びます。

    • 特に関数の 定義時 に指定する引数を 仮引数 と呼びます。 仮引数 は何個でもよく、引数を受け取らない関数を定義することもできます。
    • 特に関数の 実行時 に指定する引数を 実引数 と呼びます。 実引数 は 仮引数 の数と合わせる必要があり、合わないとエラーになります。

    calc_wage() と実行してエラーが出ることを確認してみましょう。:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: calc_wage() missing 2 required positional arguments: 'wage' and 'hours'
    
    • 上記は「引数を 2個 受け取ることを期待しているが実際には 0個 だった」というエラーメッセージです。

    calc_wage(1, 2, 3) と実行してエラーが出ることを確認してみましょう:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: calc_wage() takes 2 positional arguments but 3 were given
    
    • 上記は「引数を 2個 受け取ることを期待しているが実際には 3個 だった」というエラーメッセージです。
  • 関数が返却する値を 返却値 や 返り値 、戻り値 などと言ったりします。

    • return 文は必須ではなく省略すると何も返却しません。

PyQでは以下の課題を用意しています。 関数の定義と実行 についてもっと詳しく理解したい方は以下の課題に挑戦してみましょう。

  • モジュールとは関数やクラスなどをまとめたPythonファイルです。
  • モジュールは インポート することで使えます。
  • datetime という日時を操作するライブラリは以下のように import 文を用いることで利用できるようになります。
import datetime

one_day = datetime.datetime(2016, 1, 31)  # datetimeモジュールのdatetimeを使います。
print(one_day)

以下のように出力されます:

2016-01-31 00:00:00
  • 先ほどの記述方法では datetime モジュールの datetime ということで datetime.datetime(2016, 1, 31) のように書く必要がありました。
  • import 文の前に from をつけて以下のように記述することができます。
from datetime import datetime

one_day = datetime(2016, 1, 31)
print(one_day)
  • こちらの方法だとライブラリ名を省略して datetime(2016, 1, 31) のように短縮した形式で記述することができます。
  • 必要な物だけを import し、記述量を減らすことができる記述方法です。必須ではありませんが、便利なのでぜひ使ってみてください。
  • モジュールをディレクトリでまとめたものを パッケージ といいます。モジュールと同じように import できます。
  • これらを公開し、インストールすることで利用できる形式にしたものをライブラリといい、 PyPI にアップロードされています。

PyQでは以下の課題を用意しています。 モジュール についてもっと詳しく理解したい方は以下の課題に挑戦してみましょう。

第1部の知識を応用して以下の課題を解いてみましょう。 課題は全部で5問ありますが、1問目を解くことができれば十分です。

PyQではなく手元のPCで課題を解く場合、ダウンロードした pyconjp2016-tutorial ディレクトリから codes/1 に search.py というファイルにあなたのコードを書いて実行しましょう。

作ったPythonファイルは以下のように実行できます:

python search.py

こちらの問題はPyQ上でも実施できます。