画面下の「▶」で再生開始、「⏸」で一時停止
画面右下の「>」で次頁へ、「<」で前頁へ
青字下線の部分は、まとめプリントの穴埋め
「作業」のところでは、ファイルをダウンロードしてコンパイル・実行
1990 年発表、 Guido van Rossum(蘭)による
のプログラミング言語である
ライブラリーが豊富で
などで広く用いられる
2010 年代後半から急速に人気が高まってきている
https://
を省略している。)
www.python.org | Python Software Foundation |
www.python.jp | python.jp |
www.djangoproject.com | Django |
jupyter.org | Jupyter Notebook |
インストール方法はこのリンク先で説明する
Python を実行できる Web ページも紹介している
python
というコマンドで起動する
>>>
)のあとに式を入力すれば、その値を出力する
>>> 1 + 1
2
quit()
または exit()
と入力すれ
ば終了するpython ファイル名
というコマンドで、ファイルに保存したプログラムを実行できる
$ python factorial.py
(「$
」はプロンプト)
統合開発環境 (IDE)
idle
というコマンドで起動する)や Jupyter Notebook が有名
変数は「=
」の左辺に書き、右辺の値を代入する
>>> x = 2
>>> x * 3
6
宣言は特になく、変数に初めて代入したときに用意される
⇐ 綴りの間違いには気を付ける必要がある
関数はキーワード def
により定義できる
>>> def fact(n):
... if n == 0:
... return 1
... else:
... return n * fact(n - 1)
...
>>> fact(10)
3628800
...
⋯ 第 2 プロンプト
関数定義は、
def
fact
)(
」〜「)
」の中の
,
」区切りの並びn
のみ):
」で始まる。改行後に関数の本体を記述する
関数の本体はインデント(字下げ)する
def
の位置よりも数文字分下げるreturn 文は(セミコロンがないこと以外は)C と同じ
Python はインデンテーションが意味を持つ
(一方、C や Java はどのようにインデントしてもプログラム の意味は変わらない)
ファイルに関数などを書いて import
文で読み込む
ファイル factorial.py
def fact(n):
if n == 0:
return 1
else:
return n * fact(n - 1)
Python ソースファイルには拡張子.py
をつける
>>> from factorial import *
>>> fact(20)
2432902008176640000
Ideone で実行 Rextester で実行 JDoodle で実行
from
〜 import
*
.py
j
をつけることで虚数を表せる
>>> (1 + 1j) / (1 - 2j)
(-0.2+0.6j)
"
」 または一重引用符「'
」
で囲まれた文字列
>>> "hello"
'hello'
>>> 'world'
'world'
"""
または一重引用符
'''
で囲む
>>> """Mike said "Hello!"
... and Anne said "Good Bye!"
... """
'Mike said "Hello!"\nand Anne said "Good Bye!"\n'
f
または F
をつける{
」〜「}
」に囲まれた部分が式として評価され、文字列中に埋め込まれる
>>> x = 13
>>> f"The factorial of {x} is {fact(x)}."
'The factorial of 13 is 6227020800.'
f 文字列のなかに波括弧(「{
」または「}
」)を
含めたいときはどうすれば良いか調べよ
/
」は通常の(小数になりうる)除算になる//
」を用いる%
」である
>>> 1 / 3
0.3333333333333333
>>> 17 // 6
2
>>> 17 % 6
5
「**
」は累乗を求める演算子である
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951
>>> y = 23
>>> print(x, "+", y, "=", x + y)
13 + 23 = 36
sep=
〜 と指定すると、区切り文字を〜に変えることができる
>>> print(x, "+", y, "=", x + y, sep=',')
13,+,23,=,36
キーワード引数 ⋯ キーワード=式
のカタチの引数
int
関数(整数への変換)
や float
関数(浮動小数点数への変換)と組み合わせるファイル名 temp.py
x = float(input('x を入力してください: '))
y = float(input('y を入力してください: '))
z = int(input('z を入力してください: '))
age = int(input('年齢を入力してください: '))
if
というキーワード、条件式、コロン
「:
」で始まり、改行後に条件が成り立つときに実行する文を並べる
if x < 0:
print('x は負の数です。')
print('正の数や 0 ではありません。')
条件が成り立つときに実行する文はインデント(字下げ)する、つまり
if
の位置よりも数文字(この例では 4 文字)分開始を下げる条件が成り立たないときに実行する文は、キーワード else
、
コロン「:
」のあとに改行して書く
if y < 0:
print('y は負の数です。')
print('正の数や 0 ではありません。')
else:
print('y は正の数または 0 です。')
print('負の数ではありません。')
if
と else
の間に elif
とい
うキーワード、条件式、コロン「:
」、改行、インデントした文の並び、というカタチをはさめる
if z <= 0:
print('z は負の数か 0 です。')
elif z < 10:
print('z は一桁の正の数です。')
elif z < 100:
print('z は二桁の正の数です。')
else:
print('z は三桁以上の正の数です。')
条件式は and
(〜かつ〜)、or
(〜または〜)、not
(〜でない)などの論理演算子で組み合わせる
ことができる
if 13 <= age and age <= 19:
print('あなたはティーンエイジャーです。')
Python では比較演算子は連ねることができる(C や Java と異なる)
→ 先の例は次のように書くこともできる
# x < y < z は x < y and y < z と同じ。
# ただし、前者では y は一度しか評価されない。
if 13 <= age <= 19:
print('あなたはティーンエイジャーです。')
「#
」から行末まではコメントである
for
、変数、キーワード in
、式、コロン「:
」
というカタチで使われるファイル名 temp2.py
for i in range(5):
print('Hello')
print(' ', i, '回目')
range
関数range(n)
⋯ 0 から n - 1 までの整
数の列を返す
先程の例は、変数 i
に 0, 1, …, 4 が順に代入される
Hello 0 回目 Hello 1 回目 Hello 2 回目 Hello 3 回目 Hello 4 回目
range
関数(続き)range
関数は次のようなカタチでも使われる
range(n) | \(0\), \(1\), ⋯, \(n - 1\) を返す。 |
range(m, n) | \(m\), \(m + 1\), ⋯, \(n - 1\) を返す。 |
range(m, n, s) | \(m\), \(m + s\), ⋯, \(m + k \cdot s\) を返す。 |
ただし、\(k\) は \(m + k \cdot s\) が \(n\) 未満となるような最大の \(k\)
while
、条件式、コロン「:
」、改行後に繰り返す文をインデントして並べて書く
n = 1000
while n > 0:
print(n, end=', ')
n = n // 2 # n //= 2 と書いてもよい
print() # 改行のみ出力する
print
関数にend=
〜 とキーワード引数を指定すると最後に出力
する文字を変えることができる
(何も指定しないと改行文字を最後に出力する)
先の例を実行すると、次のように出力する
1000, 500, 250, 125, 62, 31, 15, 7, 3, 1,
※ Python に do〜while 文に相当する構文はない
[
〜]
)で囲み,
」で区切って並べる[]
⋯ 空リスト[2, 3, 5]
⋯ 2, 3, 5 からなるリストリストは「+
」演算子や「+=
」演算子で連接できる
>>> w = [1,3] + [0]
>>> w += [6,2,3]
>>> w
[1, 3, 0, 6, 2, 3]
数学の集合の表記に似た糖衣構文 (syntax sugar)
>>> [x * y for x in range(1, 5) for y in range(5, 8)]
[5, 6, 7, 10, 12, 14, 15, 18, 21, 20, 24, 28]
>>> [x * x for x in range(1, 11) if x % 2 == 1]
[1, 9, 25, 49, 81]
[
〜]
)のなかに最初に式を一つ書きfor
変数 in
式」というカタチかif
式」というカタチをその値は
for
変数 in
式」という繰り返しの中でif
式」という条件が成り立つときの最初の式の値を順に並べたもの
次のリスト内包表記の値は何か?
[x * y for x in [1,2] for y in [3,5,7]]
ヒント:
for x in [1,2]:
for y in [3,5,7]:
print(x * y)
の出力を並べたものと同じになる
,
」(コンマ)で区切って並べ、丸括弧「(
」と「)
」で囲んで表す関数の戻り値に使えるし、代入文の左辺に書ける
ファイル名 temp3.py
def sort2(m, n):
if m > n:
return (m, n)
else:
return (n, m)
i1 = int(input('整数 1 を入力してください: '))
i2 = int(input('整数 2 を入力してください: '))
(j1, j2) = sort2(i1, i2)
print('大きいほうは', j1, '小さいほうは', j2, 'です。')
特に次のように書くと、2 つの変数の内容を入れ替えることができる
y, x = x, y
(この例ではタプルのまわりの丸括弧が省略されている)
次のリスト内包表記の値は何か?
[(x, y) for x in [1,4,7]
for y in [2,5,8] if x < y]
ヒント:
for x in [1,4,7]:
for y in [2,5,8]:
if x < y:
print((x, y))
3 つの実数 a, b, c を受け取り、二次方程式 \(a x^2 + b x + c = 0\) の 2 つ
の解を組として返す関数 quadratic
を定義せよ
zip
イテラブル (iterable) ⋯ いくつかの要素を列挙したデータ
(リストもイテラブルの一種)
>>> list(zip([1,3,5,7,11], [2,4,6,10]))
[(1, 2), (3, 4), (5, 6), (7, 10)]
一般にイテラブルを表示するためには list
関数でリストに変換する必要が
ある
関数を引数に取る(あるいは戻り値とする) 関数
リストに対しては、いくつかの高階関数が標準ライブラリーに用意されている
map
リストの要素に一斉に関数を適用し、その戻り値のリストを返す関数 (正確にはイテラブルを受け取って、イテラブルを返す関数)
map
関数(続き)この関数は次のように使用する
>>> list(map(chr, [97, 98, 99, 100]))
['a', 'b', 'c', 'd']
>>> def twice(n):
... return 2 * n
>>> list(map(twice, [97, 98, 99]))
[194, 196, 198]
chr
⋯ 文字コードに対し対応する一文字からなる文字列を返す関数
名前をつけずに関数を表現する記法
(ラムダという名前は、かつて数学の一分野で、この目的のためにギリシャ文字の
「λ」が使われたことに由来する)
例: lambda x: 2 * x
⋯ twice
と同等の関数
def twice(x):
return 2 * x
キーワード lambda
とコロン「:
」の間に仮引数のコンマ区切りの並びを、
コロンの右側に戻り値の式を書く
使用例:
>>> list(map(lambda x: x * x, [2, 3, 5]))
[4, 9, 25]
filter
リストの要素の中で、与えられた関数の値を真にする要素だけのリストを返す
>>> list(filter(lambda x: x % 2 == 0, [2, 3, 5, 8]))
[2, 8]
コルーチン (coroutine) の一種を提供する
コルーチン ⋯ 2 つ以上のプログラムの実行単位が、 交互に制御を受け渡しながら実行されていく方式
ファイル名 fib.py
def gfib(n):
a = 1
b = 1
while a < n:
yield a
a, b = b, a + b
Python のジェネレーター関数では yield
というキーワード
を使って値を生成する
next
関数を呼び出すと、ジェネレーター関数内部のコー
ドが実行され、yield
された値を next
の戻り値として返すnext
関数を呼び出すと先の yield の続きから実行が再開され、やはり、
次の yield された値を返す
gen = gfib(100)
print(next(gen)) # 1 を出力する
print(next(gen)) # 1 を出力する
print(next(gen)) # 2 を出力する
print(next(gen)) # 3 を出力する
print(next(gen)) # 5 を出力する
print(next(gen)) # 8 を出力する
ジェネレーターイテレーターは for
文の in
の次の式でも使える。
このとき for
文は
next
関数に渡し、返される値を順に変数に代入してループする
for v in gfib(20):
print(v, end=' ')
Ideone で実行 Rextester で実行 JDoodle で実行
この部分は「1 1 2 3 5 8 13
」と出力する
ジェネレーターは必ずしも有限個の要素で終わる必要はない — 例:
def ifib():
a = 1
b = 1
while True:
yield a
a, b = b, a + b
次のようにすると、
for i, v in zip(range(15), ifib()):
print(v, end=' ')
print()
Ideone で実行 Rextester で実行 JDoodle で実行
この部分は「1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
」と出力する
整数 \(n\) を引数として受け取り、最初は \(n\) を yield し、以降、
という処理を繰り返すジェネレーター関数 hailstone
を定義せよ
素数列を生成するプログラムを例として挙げる
def ifrom(n):
while True:
yield n
n += 1
def sieve(n, xs):
for i in xs:
if i % n != 0:
yield i
def primes():
xs = ifrom(2)
while True:
n = next(xs)
yield n
xs = sieve(n, xs)
ifrom(2) = [2, 3,4, 5,6, 7,8, 9,10, 11,12, 13,14, 15,16, 17,18, 19, … sieve(2, ↑) = [3, 5, 7,9, 11, 13,15, 17, 19,21, 23, 25,27, 29, 31,33, 35, … sieve(3, ↑) = [5, 7, 11, 13, 17, 19, 23,25, 29, 31,35, 37, 41, 43, 47, 49, 53, … sieve(5, ↑) = [7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,49, 53, 59, 61, 67, … sieve(7, ↑) = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, … sieve(11, ↑) = [13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, … ⋮
この primes()
は無限に素数を生成するので、例えば range
のように有限のものと zip
する
for i, p in zip(range(20), primes()):
print(p, end=' ')
Ideone で実行 Rextester で実行 JDoodle で実行
この for 文は、
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71
と 20 個の素数を出力する