lectures_python



lectures_python

0 0


lectures_python

OUCC 2016年新入生向け講習会資料

On Github okwrtdsh / lectures_python

Python講習会2016

2016/04/23

かわら@okwrtdsh

Pythonって何?

Pythonはニシキヘビ?

Pythonの名前の由来はニシキヘビではない。 BBC のコメディシリーズ“Monty Python’s Flying Circus”が由来らしい。 (Why is it called Python?)

Pythonはどんな言語?

  • Readability counts.
  • There should be one-- and preferably only one --obvious way to do it.

The Zen of Pythonより一部抜粋

Pythonはどんな言語?

  • このような開発方針があるため、コードが読みやすく誰が書いても同じようなコードになり可読性や保守性がとても高い。
  • PEP(Python Enhancement Proposals)8にはPythonのコーディング規約が書かれているので、絶対に読むべき。(日本語訳)

Pythonは覚えやすい?

予約語が少ない

False      class      finally    is         return
None       continue   for        lambda     try
True       def        from       nonlocal   while
and        del        global     not        with
as         elif       if         or         yield
assert     else       import     pass
break      except     in         raise

Pythonは人気?

1 2 3 4 5 TIOBE Java C C++ C# Python PYPL Index Java Python PHP C# Javascript Devpost HTML/CSS Javascript Python Java C/C++ GitHub Javascript Python Java Ruby PHP

Pythonは人気?

Pythonプログラムの実行

Pythonの実行方法

インタラクティブシェルを使う PYファイルを作成し実行する

1. インタラクティブシェル

Terminalを開く python3と入力 Pythonコードを入力 exit()と入力

Hello World!を書いてみよう

Terminalを開く python3と入力 print('Hello World!')と入力 Hello World!と出力される exit()と入力
$ python3
>>> print('Hello World!')
Hello World!
>>> exit()

2. PYファイルを作成し実行する

text editorを開く Pythonコードを入力 hoge.pyと名前を付けて保存 Terminalを開く python3 hoge.pyと入力

Hello World!を書いてみよう

text editorを開く print('Hello World!')と入力 hello_world.pyと名前を付けて保存 Terminalを開く python3 hello_world.pyと入力 Hello World!と出力される
$ echo "print('Hello World!')" > hello_world.py
$ python3 hello_world.py
Hello World!

タイプとオブジェクト

タイプとオブジェクト

  • Pythonでは,全てのデータはオブジェクトとして作られる
  • タイプ(型)というのは,オブジェクトの種類のこと
  • 数値
  • 文字列
  • リスト
  • タプル
  • 辞書型
  • 集合型

1. 数値

  • 整数型,浮動小数点型などに加え,複素数型なども扱うことができる
  • 演算子
    • 足し算 $\cdots$ +
    • 引き算 $\cdots$ -
    • 掛け算 $\cdots$ *
    • 割り算 $\cdots$ /
    • 剰余 $\cdots$ %
    • 指数 $\cdots$ **

1. 数値

>>> 1 + 2
3
>>> 1 - 2
-1
>>> 2 * 3
6
>>> 2 ** 3
8
>>> 10 % 3
1
>>> 10 / 3
3.3333333333333335
>>> 10 // 3
3

2. 文字列

  • 文字列は「"」または「'」で記述する
  • 複数行は「"""」または「'''」で記述する
  • 文字列の結合は「+」
  • 文字列の繰り返しは「*」
  • 文字列中の文字へはインデックスでアクセス可能
  • 文字列の長さはlen関数で求められる

2. 文字列

>>> a = "hoge"
>>> a
'hoge'
>>> """hoge
... fuga
... """
'hoge\nfuga\n'
>>> a * 2
'hogehoge'
>>> a[0]
'h'
>>> a[-1]
'e'
>>> len(a)
4

3. リスト

  • リストは「[」と「]」で記述する
  • リスト内の要素へのインデックスを用いてアクセス可能
  • 末尾に要素を追加する時はappend関数を用いる
  • 末尾の要素を取り出すにはpop関数を用いる
  • 要素数を取得するにはlen関数を用いる

3. リスト

>>> a = [6, 1, 2]
>>> a[0]
6
>>> a.append(3)
>>> a
[6, 1, 2, 3]
>>> a.pop()
3
>>> a
[6, 1, 2]
>>> len(a)
3
>>> sum(a)
9

4. タプル

  • タプルは「(」と「)」で記述する
  • 要素数が一つの場合は「,」が必要
  • タプル内の要素へのインデックスを用いてアクセス可能
  • 要素数と同じ数の変数に各要素を一度に代入できる
  • 要素への値の代入はできない(一度定義したタプルは変更できない)

4. タプル

>>> t = (7, "hoge")
>>> t
(7, 'hoge')
>>> (1)
1
>>> (1, )
(1,)
>>> t[0]
7
>>> t[1]
'hoge'
>>> i, v = t
>>> i
7
>>> v
'hoge'

5. 辞書

  • 辞書は「{」と「}」で記述する
  • keyとvalueをペアで保持することができる
  • keyを使ってvalueにアクセスできる
  • keyが存在しない場合KeyErrorが発生する
  • get関数を使うとkeyが存在すればvalueを、なければdefault値を返す

5. 辞書

>>> d = {
...     "key": "value",
...     "num": 1,
... }
>>> d["key"]
'value'
>>> d["num"]
1
>>> d["num"] = 2
>>> d["num"]
2
>>> "key" in d.keys()
True
>>> "hoge" in d.keys()
False

5. 辞書

>>> "value" in d.values()
True
>>> "hoge" in d.values()
False
>>> d["hoge"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'hoge'
>>> d.get("key")
'value'
>>> d.get("hoge")  # Noneが返る
>>> d.get("hoge", "default")
'default'

6. 集合型(set)

  • 順序付けされていないユニークな要素で構成されたコレクション
  • 文字列またはリストから作成する
  • setの演算子
  • - $\cdots$要素の削除
  • | $\cdots$要素の和
  • & $\cdots$両方に含まれる要素
  • ^ $\cdots$一方に含まれる要素

6. 集合型(set)

>>> A = set("Hello")
>>> A
{'H', 'e', 'o', 'l'}
>>> B = set("World")
>>> B
{'l', 'd', 'o', 'r', 'W'}
>>> A - B
{'H', 'e'}
>>> A | B
{'o', 'l', 'd', 'W', 'H', 'r', 'e'}
>>> A & B
{'o', 'l'}
>>> A ^ B
{'d', 'W', 'H', 'r', 'e'}

制御文

制御文

処理の分岐
  • if
  • elif
  • else
処理の繰り返し
  • for
  • while

1. 処理の分岐

  • 関係演算子
    • < $\cdots$ より小さい
    • <= $\cdots$ 等しいまたはより小さい
    • > $\cdots$ より大きい
    • >= $\cdots$ 等しいまたはより小さい
    • == $\cdots$ 等しい
    • != $\cdots$ 異なる
  • 論理演算子
    • and $\cdots$ かつ
    • or $\cdots$ または
    • not $\cdots$ 否定

1. 処理の分岐

>>> n = 10
>>> if n > 0:
...     print("positive number")
... elif n < 0:
...     print("negative number")
... else:
...     print("zero")
...
positive number

1. 処理の分岐

>>> n = 10
>>> if n > 0 and n % 2 == 0:
...     print("positive multiple of two")
... elif n % 2 == 0:
...     print("negative multiple of two")
... elif n > 0:
...     print("positive")
... else:
...     print("negative")
...
positive multiple of two

2. 処理の繰り返し

  • for文
    • オブジェクトの個数分だけ処理を繰り返す
for 変数 in オブジェクト:
    処理
  • while文
    • 条件式が真である限り処理を繰り返す
while 条件式:
    処理
  • range関数
    • 等差数列を含むリストを生成する関数
range([start,] stop[, step])

2. 処理の繰り返し

>>> for i in [0, 1, 2]:
...     print(i)
...
0
1
2
>>> for i in range(3):
...     print(i)
...
0
1
2

2. 処理の繰り返し

>>> i = 0
>>> while i < 3:
...     print(i)
...     i += 1
...
0
1
2

関数オブジェクト

関数の定義

  • def文
def 関数名(引数1, 引数2, ... ):
    処理
  • lambda式
lambda 引数1, 引数2, ... : 引数を使う式

関数の呼び出し

関数名(引数1, 引数2, ... )

関数オブジェクト

>>> def add(x, y):
...     return x + y
...
>>> add(2, 3)
5
>>> f = lambda x, y: x + y
>>> f(2, 3)
5

その他

型変換

  • 文字列を整数に $\cdots$ int関数
  • 整数を文字列に $\cdots$ str関数
  • リストの要素の型変換 $\cdots$ map関数

型変換

>>> "2" + "3"
'23'
>>> int("2") + int("3")
5
>>> 2 * 3
6
>>> str(2) * 3
'222'
>>> a = map(str, [0, 1, 2])
>>> a  # python3からリストではなくmap object(iterator)が返る
<map object at 0x109b11048>
>>> list(a)
['0', '1', '2']
>>> b = map(int, ['0', '1', '2'])
>>> list(b)
[0, 1, 2]

リスト内包表記

  • 内包表記とは
    • リストや辞書におけるループ処理をシンプルに書くための表記方
  • 種類
    • リスト内包
    • 辞書内包
    • セット内包
    • ジェネレータ式

リスト内包表記

>>> [i ** 2 for i in range(5)]
[0, 1, 4, 9, 16]
>>> [i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]
>>> [i if i < 5 else 'L' for i in range(10)]
[0, 1, 2, 3, 4, 'L', 'L', 'L', 'L', 'L']
>>> [i if i < 5 else i if i % 2 == 0 else 'L' for i in range(10)]
[0, 1, 2, 3, 4, 'L', 6, 'L', 8, 'L']
>>> [x + y for x in range(3) for y in range(3)]
[0, 1, 2, 1, 2, 3, 2, 3, 4]

リスト内包表記

mapやfilterで記述することもできる

>>> [i ** 2 for i in range(5)]
[0, 1, 4, 9, 16]
>>> list(map(lambda x: x ** 2, range(5)))
[0, 1, 4, 9, 16]
>>> [i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]
>>> list(filter(lambda x: x % 2 == 0, range(10)))
[0, 2, 4, 6, 8]

in

特定の要素が含まれるか

>>> 3 in range(5)
True
>>> 'c' in "abcdef"
True
>>> d = {
...     "key": "value",
...     "num": 1
... }
>>> "key" in d
True
>>> "value" in d.values()
True

入力

>>> s = input()
hoge # 入力
>>> s
'hoge'
>>> i = int(input())
7 # 入力
>>> i
7
>>> l = input().split()
hoge 7 # 入力
>>> l
['hoge', '7']
>>> l = map(int, input().split())
3 3 4 # 入力
>>> list(l)
[3, 3, 4]

出力

>>> print("hoge")
hoge # 改行あり
>>> print("hoge", end="")
hoge>>> # 改行なし
>>> print("hoge", "fuga")
hoge fuga # スペース区切り
>>> print(", ".join(["hoge", "fuga"]))
hoge, fuga # カンマ区切り

注意

  • keyword引数の評価のタイミング
>>> def hoge():
...     print("hoge")
...
>>> def fuga(x=hoge()):
...     pass
...
hoge # 関数の定義時に1回だけ評価される
>>> fuga() # 評価されない

注意

  • keyword引数の評価のタイミング
>>> f = [lambda x: x * i for i in range(5)]
>>> f[2](5) # 呼び出した時にはiはすでに4になっている
20
>>> f[3](5)
20
>>> f = [lambda x, i=i: x * i for i in range(5)]
>>> f[2](5) # keyword引数に渡すと定義時に評価される
10
>>> f[3](5)
15

注意

  • 代入によってローカル変数が作られる
>>> def outer1():
...     x = 1
...     def inner1():
...         print(x)
...     inner1()
...     print(x)
...
>>> outer1()
1 # inner1
1 # outer1

注意

  • 代入によってローカル変数が作られる
>>> def outer2():
...     x = 1
...     def inner2():
...         x = 2
...         print(x)
...     inner2()
...     print(x)
...
>>> outer2()
2 # inner2
1 # outer2

注意

  • 変数はすべて参照
>>> a = list(range(5))
>>> a
[0, 1, 2, 3, 4]
>>> b = a
>>> b
[0, 1, 2, 3, 4]
>>> b[0] = 5
>>> b
[5, 1, 2, 3, 4]
>>> a
[5, 1, 2, 3, 4]

注意

  • スライスはコピーを生成
>>> a = list(range(5))
>>> a
[0, 1, 2, 3, 4]
>>> b = a[:]
>>> b
[0, 1, 2, 3, 4]
>>> b[0] = 5
>>> b
[5, 1, 2, 3, 4]
>>> a
[0, 1, 2, 3, 4]

演習

問題

  • 1から100までの整数を表示する。
  • ただし、3の倍数または3を含む整数の場合には数字の代わりに"San!"と出力する。

出力

1
2
San!
4
5
San!
7
8
San!
10
...

解答例

>>> for i in range(1, 101):
...     if i % 3 == 0 or "3" in str(i):
...         print("San!")
...     else:
...         print(i)

問題

  • 初めに整数Nを入力する。
  • その後N個の整数を入力し、各数に1を加えた値を『,␣(カンマ+スペース)』区切りで出力する。
  • できる人は、lambda式を使ってみよう。

入力

3
1
3
7

出力

2, 4, 8

解答例

n = int(input())
l = []
for _ in range(n):
    l.append(input())
print(", ".join(map(lambda x: str(int(x) + 1), l)))

まとめ

まとめ

Pythonを書こう!!

1
Python講習会2016 2016/04/23 かわら@okwrtdsh