SlideShare una empresa de Scribd logo
1 de 85
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
他言語エンジニアの
ためのPython入門
虎の穴 開発室
白井 尊昭
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
タイムテーブル
時刻 内容
19:00 開場・受付
19:30 開会案内・会場説明
19:35
発表者: 開発室 白井
他言語エンジニアのためのPython入門
(スライド発表+ハンズオン+演習)
2. Pythonではじめるオタク向けサービス
開発(クローリング&スクレイピング)
21:05 休憩&LT準備
21:15 LT×3名→1名
21:30 終了
1
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
目次
• はじめに
• Pythonとは
• Pythonことはじめ
– インストール+環境構築からデータ構造・制御構造ま
で一通り紹介
• Pythonによるクローリング&スクレイピング入
門
• その他のトピック
2
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
自己紹介
白井 尊昭
所属: 開発室(エンジニアとデザイナが在籍)
• 2014年4月〜(株)ブレインパッド エンジニ
ア
広告系のASPサービス開発
• 2017年10月〜(株)虎の穴 エンジニア
新規サービスの開発
• 好きなアニメ: 攻殻機動隊、PSYCHO-PASS
(最近は) Just Because
• 好きな漫画: (最近は) ヒナまつり
3
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
勉強会の目的
• 他のオブジェクト指向言語(Java, Ruby, …)
は使えるがPythonはよく知らないので
概要を知りたい方向け
– 基本的なデータ構造や制御構造だけでなく
学習方法やIDEなど自学するための入り口も紹介
• オタクアプリなど、好きなサービスを自分で
Pythonで作るためのきっかけ作り
– 今回はクローリング&スクレイピングまで
– Webアプリの作り方は範囲外(今後予定)
4
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
虎の穴とPython
• 株式会社虎の穴では言語はRubyを主に採用
– RubyWorld Conference 2017や福岡RubyKaigi 02出展
• Pythonに興味はあるがサービスで
使ったことのないエンジニアが社内では多い
• Ruby以外の言語も選択肢として増やしておきた
い
5
社内でPython勉強会を開催&社外にも共有
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
勉強会の進め方
• 発表聴講+ハンズオン形式
–ときどき軽い演習
• 質問あれば随時受け付けます!
6
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Pythonとは
• いわゆるLL言語
(軽量プログラミング言語)
• オブジェクト指向言語
• なぜPythonという名前?
× Python (ニシキヘビ)
◯ Monty Python‘s Flying Circus
(空飛ぶモンティ・パイソン、
イギリスのコメディ番組)
7
https://docs.python.jp/3/faq/general.html#why-is-it-called-python
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Pythonの特徴
• 動的で強い型付け
– (動的)プログラム実行時にデータ型が見いだされる
– (強い)型付けが常に強制
例: 整数型を文字列型のように扱うには
明示的に変換
• バッテリー同梱(batteries included)
– 標準で様々な機能を利用できる。
例: emailパッケージで電子メール向けのメッセージデコー
ドなど
• 機械学習やデータ分析の用途に適している(後述)
8
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
用途
• 機械学習
– データから学習してモデルをつくること
例: 人の顔を判別するモデル
– ライブラリが豊富
• TensorFlow, Chainer, scikit-learn, PySpark, …
– 機械学習向けの環境構築が楽(Minicondaなど)
• データ分析
– PandasやJupyter
• Webアプリケーション
– フレームワークはDjangoやFlaskが有名
9
参考: https://www.python.org/about/apps/
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
The Zen of Python (Pythonの禅)
“Python を理解し利用する上での導きとなる、
Python の設計原則と哲学をリストにしたもの”
対話プロンプトで”import this”とすると…
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
… (略)
10
参考: https://docs.python.jp/3/glossary.html
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
例: Explicit is better than implicit.
訳: 暗黙よりも明示(的に書くこと)の方が良い。
※配下の全モジュールをimportするのでなく、
必要なものを直指定すべき、など
from os import *
print(getcwd())
↓
import os
print(os.getcwd())
11
https://qiita.com/IshitaTakeshi/items/e4145921c8dbf7ba57ef
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Pythonの歴史(2系と3系が共存)
リリース 西暦年 備考
0.9.0 1991 Guido van RossumがABC言語の後継として生み出す
2.0 2000 Python 2.x系リリース
3.0 2008 Python 3.x系リリース
2.7 2010 Python 2.xの最後のメジャーリリース
2017 Python 3.6.3リリース(最新版)
2020
Python 2.xのサポート(セキュリティアップデートや
バグフィックス)終了
12
http://docs.python.jp
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Python3.xを利用しよう
• 結論: Python2.xでなくPython3.xでほぼ問題なし
• 主要ライブラリの対応状況: ほぼPython3.x対応
– https://python3wos.appspot.com/
• Google App Engineを使う場合は注意
– Standard environmentはPython 2.7のみ
• ネット上の情報はバージョンに注意
ライブラリの利用方法が違ったりするため
13
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Pythonのトレンド
各種プログラミング言語ランキングでは上位常連
(例) PYPL: PopularitY of Programming Language
– Pythonは常に上昇傾向(そろそろ首位)
– チュートリアルの検索回数をもとに作られたイン
デックス(シェア)
14
http://pypl.github.io/PYPL.html
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Pythonことはじめ
15
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
内容
• インストール(事前にお願いしました)
• (仮想)環境構築
• Hello, world!
• データ型
• 制御構造(if, while, for)
• 関数・クラス
• ファイル入出力
16
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Python3のインストール
• Windows
– https://www.python.org/ > Downloads > Windows > 3.6.4
– https://qiita.com/taiponrock/items/f574dd2cddf8851fb02c
• Mac
– 2.xは標準でインストール済
– https://qiita.com/1000ch/items/93841f76ea52551b6a97
• ※pyenvは複数バージョンのインストールに利用。3.6.3をイン
ストール
– (homebrewでも可) brew install python3
• これのみだとpython3と毎回打つ必要
17
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
venvで仮想的にPythonの環境を構築
• 仮想的にPythonの環境を構築できる
標準パッケージ
• ディレクトリごとに、異なるPythonバージョン
やパッケージの環境を利用可能
– 同一バージョンを複数使い分けることも可能
• Python3.3以上でのみ利用可、
それ以前ならvirtualenvをインストールして利用
が一般的
18
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
venvの使い方
$ cd ~/projects
$ python -m venv py # 仮想環境の作成
$ cd py
$ source bin/activate # 仮想環境を有効化
(py) $ which python
/Users/xxx/projects/py/bin/python(py)
(py) $ deactivate # 仮想環境を無効化
$ which python
/Users/xxx/.pyenv/shims/python #環境による
19
注意: 以降、仮想環境での実行を想定
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
開発環境
• PyCharm(パイチャーム)またはIntelliJ IDEA + Python
plugin
– PyCharm: JetBrainsが開発したPython用のIDE。
無償版でも十分(有償は高め)
– IntelliJ IDEA + Python plugin: PyCharmと基本的に
Pythonの機能は同じ
→HTMLやCSSなどWeb開発も便利にしたいならこちら
– この環境がオススメ
• Jupyter Notebook
– ブラウザでかんたんに試行錯誤しながらコーディングして実行
結果を保存したりできる
• 各エディタ
– AtomやEmacsなど
20
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
PEP8: スタイルガイド
• PEP8: Pythonコードのスタイルガイド(ペップエイト)
• Pythonのコードを読みやすく、スタイル統一するための規約
• PEP: Python Enhancement Proposal(Python拡張提案)
• 新機能の提案やガイドラインの説明などをするためのドキュメント
• https://www.python.org/dev/peps/pep-0008/
• (個人による日本語訳の例: https://github.com/mumumu/pep8-ja)
• PEP8の例
• 1段階のインデントには4つのスペースを使う
• クラス内のメソッド定義は空白行1つで区切る
• 関数名は小文字で、可読性のために必要とされる場合に単語を
アンダースコアで区切る
• PEP8 チェックツール: flake8(フレークエイト)
がおすすめ(コードのエラーチェックなどもできる)
21
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Hello, world!
1. コンソールで実行
$ python
…
>>> print(“Hello, Akihabara!”)
Hello, Akihabara!
>>> exit() # 終了
2. ファイルを指定して実行
(ファイルhello.pyに同じ内容を記述)
$ python hello.py
Hello, world!
22
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
ブロック
Pythonではブロックはインデントで記述し、
括弧は用いない
PEP8ではスペース4つが推奨
if x == 0:
print(“hoge”)
else:
print(“fuga”)
23
Python Ruby Java
インデント end { … }
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
データ型
• 整数型、文字列型、リスト型、辞書型…
• 整数型と文字列型を+で演算はできない、
などの制限が存在(強い型付け)
• 型を調べるには組み込み関数typeを利用
>>> type(123)
<type ‘int’>
※プリミティブ型は存在しない
※Javaでいうプリミティブ型: byte, int, float, …
Pythonでは全てがオブジェクトであり型をもつ
24
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
変数
• 宣言不要
• 「x = 3」で代入可、「x + 10」などでxを参照可
能
• 「x = “aaa”」などとすると新たなxを作成し代入
(「3」は破棄)
• 定数は存在しない
※PEP8では定数的扱いをするものの命名は
HOGE_FUGAを推奨
25
Python Ruby Java
変数宣言 不要 不要 型宣言
定数 なし あり あり
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
数値
• 整数型、実数型、複素数型、ブール型が存在
• 算術演算(四則演算や剰余算など)ができる
>>> type(1) # 整数型
<type 'int'>
>>> type(1.1) # 実数型
<type 'float'>
>>> type(1+2j) # 複素数型
<type 'complex'>
>>> type(True) #ブール型
<type 'bool'>
26
Python Ruby Java
整数 int Integer
short
int
long
小数
点数
float
decimal
Float
float
double
複素
数
complex Complex ×
ブー
ル
bool Boolean boolean
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Tips: 厳密な計算が必要ならDecimal
• floatは浮動小数点数のため10進数の演算ではない
>>> 1.1 + 2.2
3.3000000000000003
• 任意の数を10進数で正確に表すには固定小数点数型
>>> from decimal import Decimal
>>> decimal.Decimal('0.1') + decimal.Decimal('0.2’)
Decimal('0.3')
• 決済などお金を扱うのに便利
• 標準モジュールには含まれるが広く使われる型ではない
• 注意: 以下は無意味(もとの値が浮動小数点数なら意図
しない値に)
>>> decimal.Decimal(0.1)
27
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
文字列型
• 文字を扱うための型。他言語でいう文字型charは存
在しない
– ‘あいうえお’や’hogehoge’など
• 非可変(変更不可)
• できること
– 文字列と文字列を結合して
新たな文字列を作成
– 文字列の一部分を切り出して
新たな文字列を作成
– など
28
Python Ruby Java
string str String String
char × × char
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
文字列型の記述方法と補足
• 記述方法は3つ
• 「’hoge’」シングルクォーテーション
• 「”hoge”」ダブルクォーテーション
• 「’’’hoge’’’」トリプルクォーテーション(シングル
又はダブルを3つ)
• プログラム中での改行を文字列中での改行とみなす
• unicode型とstr型が存在
– (Python 3.xはデフォルトでunicode型なので特に気
にしなくて良い)
29
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
文字列操作
# 文字列の連結
>>> 'hoge' + 'fuga'
'hogefuga'
# 文字列の長さを取得
>>> len('hoge')
4
# 文字の先頭が~であればTrue
>>> 'hoge'.startswith('ho')
True
>>> 'hoge'.startswith('a')
False
30
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
文字列操作2
# replaceにより文字を置換できる
>>> 'hogefuga'.replace('hoge', ’piyo')
‘piyofuga’
# 前後の空白を取り除く(全角も可能)
>>> ‘ hogefuga ‘.strip()
‘hogefuga’
31
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
部分文字列の取得
インデックスによるアクセスが可能
>>> s = 'hogefuga'
>>> s[0]
'h'
>>> s[:3] #0文字目から3文字目の”直前”まで
'hoge'
>>> s[2:4]
'ge'
32
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
リスト型
リストは角括弧の中にカンマで区切られた式を並べて
作る
※柔軟で便利な操作が可能(後述)
数値、文字列、式を混ぜたリスト
>>> [1, 2+3, ‘hoge’, ‘fuga’, 1.1]
[1, 5, 'hoge', 'fuga', 1.1]
インデックスアクセス
>>> x = [1, 2, 3]
>>> x[1] = 100
>>> x
[1, 100, 3]
33
Python Ruby Java
リスト list Array []
型の
制約
なし なし あり
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
リスト型に対する操作の例
>>> x = [‘hoge’, ‘fuga’, ‘piyo’] # リストの作成
>>> x
['hoge', 'fuga', 'piyo']
>>> x[0] # 0番目の要素を取得(最初の要素は0番目)
'hoge'
>>> len(x) # リストの長さを取得
3
>>> x.append(1) # リストに1を追加
>>> x
['hoge', 'fuga', 'piyo', 1]
>>> ‘hoge’ in x # ‘hoge’がリストに存在する場合True、そう
でない場合False
True
34
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
タプル型
タプルは丸括弧の中にカンマで区切られた式を並べて作る。リストと
は違い、要素は変更不可能
>>> (1, 2+3, ‘hoge’, ‘fuga’, 1.1) # 数値、文字列、式を混ぜたタプル
(1, 5, ‘hoge’, ‘fuga’, 1.1)
>>> (1, ) # 要素が1個のタプル。式をくくるときも丸括弧を使うため、
カンマをつけて区別する
(1,)
>>> () # 要素が0個のタプル
()
>>> a = (1, 2, 3)
>>> a[0] = 4 # これはエラー
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
35
Python Ruby Java
タプル tuple
(近い)Arrayを
freezeする
なし
型の
制約
なし なし -
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
set型(集合型)
• 順序のないユニークなオブジェクトの集合
• 数学的な集合演算が可能(和集合を求めるなど)
>>> {1, 2+3, ‘hoge’, ‘fuga’, 1.1} # 数値、文字列、式を混ぜ
た集合
set([1, 2, 3])
>>> set([1, 2, 3]) # set()でリストをくくってもsetを生成で
きる
set([1, 2, 3])
>>> {1, 2} & {2, 3} # 共通集合
set([2])
>>> a = {1, 2}
>>> {1, 2, 2, 3}
{1, 2, 3}
36
※要素の追加ができない、変更不可能なflozenset型もある。
Python Ruby Java
set tuple Set HashSet
型の
制約
なし なし あり
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
辞書型
• RubyでいうHash, JavaでいうHashMap
• 辞書に格納された要素に順序は存在しない
• リストのように、インデックスではアクセス出来ない
>>> d = {‘hoge’: 1, ‘fuga’: 2, ‘piyo’: 2} # キー:値という
ペアを要素とする
>>> d[‘fuga’] # ‘fuga’は辞書に存在するので、その値を
取得できる
2
>>> d[‘xxx’] # 存在しない
…
KeyError: 'xxx'
37
Python Ruby Java
辞書 dict Hash HashMap
型の
制約
なし なし あり
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
辞書型
>>> d = {'fuga': 2, 'piyo': 2, 'hoge': 1}
>>> d[‘aaa’] = 3 # 辞書への要素追加
>>> d
{'fuga': 2, 'aaa': 3, 'piyo': 2, 'hoge': 1}
>>> d[10] = (1, 2, 3) # いろいろな値を追加できる
>>> d
{10: (1, 2, 3), 'fuga': 2, 'aaa': 3, 'piyo': 2, 'hoge': 1}
>>> del d[‘hoge’] # 辞書から要素を削除
>>> d.keys() # 辞書に含まれるキーのリスト
[10, 'fuga', 'aaa', 'piyo']
>>> d.values() #辞書に含まれる値のリスト
[(1, 2, 3), 2, 3, 2]
38
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
制御フロー
39
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
制御フローは以下3つ
• if(条件分岐)
• while(繰り返し)
• for(繰り返し)
※switchはなし
40
Python Ruby Java
条件
分岐
if
if
unless
case
if
switch
while while
while
until
while
do while
for for for
for
拡張for
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
if文
最初にマッチしたもののみ実行
if x < 0:
print(“if”)
elif x < 1:
print(“elif”)
else:
print(“else”)
41
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
while文
式の値が真である間、繰り返し実行
x = 0
while x < 100:
x += 1
print(x)
42
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
for文
シーケンス(文字列、タプル、リスト)などの要
素一つ一つに対して反復処理を行う
for x in [“hoge”, “fuga”, “piyo”]:
print(x)
# “a”, “b”, “c”が出力
for x in “abc”:
print(x)
43
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
for文: range()関数
• 0から99までの数値リストは、組み込み関数
rangeを用い、range(0,100)で作成できる
• [0, 1, 2, 3, 4, …, 99]というリストを書く必要がない
# 0から99までの数値が出力される
for x in range(0, 100):
print(x)
44
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
練習: FizzBuzz (5~10分くらい)
• 1~50の数値を出力するfizzbuzz.py
を作成して下さい。
– 3の倍数の時に文字列”Fizz”
– 5の倍数の時に”Buzz”
– 15の倍数の時に”FizzBuzz”
– それ以外はその数
• 制限: print()関数の記述は1回のみ
45
$ python fizzbuzz.py
1
2
Fizz
4
Buzz
Fizz
…(略)
14
FizzBuzz
…(略)
49
Buzz
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
解答例
for x in range(1, 51):
if x % 15 == 0:
print("FizzBuzz")
elif x % 5 == 0:
print("Buzz")
elif x % 3 == 0:
print("Fizz")
else:
print(x)
46
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
良くない解答例
for x in range(1, 51):
if x == 3:
print(“fizz”)
if x == 5:
print(“buzz”)
if x == 6
print(“fizz”)
…
47
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
関数定義
48
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
関数定義
# 引数に型制限はなし(演算不可の場合は実行時
エラー)
def hoge(x):
print(x)
return x + x
※PEP8: 関数名はすべて小文字で単語の境界には
アンダースコア「_」をつけるべき
49
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
組み込み関数
• 組み込み関数:type()やprint()など、
標準で組み込まれていていつでも利用できる関
数
• 使用するためにモジュールをimportなどする必要が
ない
• 組み込み関数の一覧
• http://docs.python.jp/2/library/functions.html
>>> print('Hello, world!')
Hello, world!
50
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
演習: 再帰的呼び出し(10分)
関数の中で関数を呼ぶことも可能。
そのような関数を定義し、nの階乗を求めて下さい。
例: 5の階乗
5! = 5 * 4 * 3 * 2 * 1 = 120
関数定義のヒント:
def hoge(x):
print(x)
return x + x
51
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
解答例
def factorial(x):
if x == 1:
return x
else:
return x * factorial(x - 1)
print(factorial(10))
52
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
クラス定義
53
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
クラスの定義
多重継承も可能だが複雑なので避けるのが吉
class MyClass:
"""これはコメント"""
i = 123
def __init__(self):
print("コンストラクタ")
def f(self):
print("hoge")
c = MyClass()
c.f()
print(c.i) # クラス変数
54
Python Ruby Java
クラス ◯ ◯ ◯
多重継承 ◯ × (Mix-in) ×
インタ
フェース
× × ◯
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
クラスのインスタンス化
クラスは通常、インスタンス化して使う
– クラス名()でインスタンス化。
ただし、__init__にself以外の引数があるときは引
数を与える
(ファイルの続き)
x = MyClass() # インスタンス化
x.f() # ‘hoge’がprintされる
55
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
ファイル入出力
56
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
ファイル入出力について
• ファイルオブジェクトを介して読み書きを行う
• 組み込み関数のopen() でファイルオブジェクトを
生成できる
• ファイルを開く際にはモードが存在
• 読み出し専用、書き込み専用、追記用、読み書き
両用
• さらに、テキストモードかバイナリモードか指定
57https://docs.python.jp/3/tutorial/inputoutput.html#reading-and-writing-files
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
読み込み
# 事前に適当なファイルa.txtなどを作成
>>> f = open('a.txt', 'r')
>>> f.read() # ファイルの最後まで読み、strとして返す
'aefan'
>>> f.read() # 終端まで読んだので、空が返ってくる
''
>>> f.read()
''
>>> f.close()
>>> f.read() # ファイルを閉じた後に読もうとするとエラー
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file
58
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
ファイル読み込みの3つの方法
read(): ファイルの終端まで読む
readlines(): ファイルの終端まで読み、
各行をリストの要素にして返す(改行コードは含まない)
readline(): ファイルを1行分読む(改行コードも含む)
>>> f = open('a.txt', 'r')
>>> f.readlines()
['aefan']
>>> f.close()
>>>
>>> f = open('a.txt', 'r')
>>> f.readline()
'aefan'
>>> f.readline()
59
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
ファイルへの書き込み
• write(s): 文字列sをファイルに書き込む
• writelines(l): シーケンス型lをファイルに書き込む
• 以下を追記モードでも試してみてください
• open(file_name, ‘a’)でfile_nameを開く
>>> f = open('a.txt', 'w')
>>> f.write(‘abcde’) # 適当に
>>> f.close()
>>> f.write('abcde')
# 例外発生
>>> f = open('a.txt', 'r')
>>> f.read()
'abcde'
60
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
ファイルの読み込み(for文)
for文により、ファイルの各行を簡単に読み込める
$ cat a.txt
aaa
bbb
ccc
(読み込み。各行に含まれる改行も表示されている)
>>> for l in open('a.txt', 'r'):
... print(l)
...
aaa
bbb
61
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
クローリング&スクレイピング
62
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
この章の内容
1. クローリング
2. スクレイピング
3. 注意事項
特にクローリングを行う際の注意や推奨事項
63
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
複数の書籍が刊行
64
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
クローリング&スクレイピング
• クローリング: ハイパーリンクをたどりながら
webページを収集
– 特に、Googleなどの検索エンジンが大規模に運用
• スクレイピング: webページをパースして
欲しい情報を抜き出す
• UNIXコマンドでもOK
– wget: 再帰的にwebページを取得できるオプション(-r)あり
• 特定ページ取得/とにかく全部取得するならこれでもOK
– スクレイピングはPythonが圧倒的に楽
• Pythonの場合は複数のライブラリを組み合わせて作成
(後述)
– フレームワークscrapyが有名だが、学習コストの関係上省略
65
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
webページをたどる(クローリング)
本格的に行う場合はscrapyフレームワークを利用
→「Python クローリング&スクレイピング」6章
→本質的でない作業を肩代わりしてくれる
• リンクの抽出
• (エラー時の)リトライ
• 時間間隔の調整
…
今回は本格的なクローリングは割愛
66
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
webページの取得: requestsライブラリ
requestsライブラリが標準のurllibより簡単
インストール:
$ pip install requests
>>> import requests
>>> r = requests.get('http://qiita.com/advent-
calendar/2014')
>>> r.status_code
200
>>> r.text
‘<!DOCTYPE html> …’
※今回は複雑な処理をしないためurllibを利用
67
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
例: Wikipediaからアニメ一覧を取得
from urllib.request import urlopen
from bs4 import BeautifulSoup
# 日本のテレビアニメ作品一覧 (2010年代 後半))
f = urlopen('https://goo.gl/vFjEp5’)
soup = BeautifulSoup(f, "html.parser")
# 今期(2017年 10月 - 12月)のアニメ一覧
table = soup.find_all('table', {'class': 'wikitable'})[11]
for tr in table.find_all('tr'):
a = tr.find('a')
if a:
print(a.text, a.get('href'))
68
※DBPediaという構造化されたデータも存在するが割愛
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
結果(タイトルとリンク取得)
THE IDOLM@STER Prologue SideM -Episode of Jupiter-
/wiki/%E3%82%A2%E3%82%A4%E3%83%89%E3%83%
AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%B
C_SideM
銀魂. ポロリ篇
/wiki/%E9%8A%80%E9%AD%82_(%E3%82%A2%E3%83
%8B%E3%83%A1)
お見合い相手は教え子、強気な、問題児。
/wiki/%E3%81%8A%E8%A6%8B%E5%90%88%E3%81%
84%E7%9B%B8%E6%89%8B%E3%81%AF%E6%95%99
%E3%81%88%E5%AD%90%E3%80%81%E5%BC%B7%
E6%B0%97%E3%81%AA%E3%80%81%E5%95%8F%E9
%A1%8C%E5%
85%90%E3%80%82
…
69
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
各ページからジャンルを抽出
def get_genre(url):
f = urlopen(url)
soup = BeautifulSoup(f, "html.parser")
table = soup.find("table", {"class": "infobox"})
if not table:
return
for tr in table.find_all("tr"):
th = tr.find('th')
if th and "ジャンル" in th:
return tr.find('td').text.split("、")
print(get_genre("https://ja.wikipedia.org/wiki/Just_Because!"))
70
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
アニメ一覧取得+ジャンル抽出
def get_genre_ranking():
f = urlopen('https://goo.gl/vFjEp5')
soup = BeautifulSoup(f, "html.parser")
# 今期(2017年 10月 - 12月)のアニメ一覧
genre_counts = defaultdict(int)
table = soup.find_all('table', {'class': 'wikitable'})[11]
for tr in table.find_all('tr'):
a = tr.find('a')
if a:
genres = get_genre("https://ja.wikipedia.org" + a.get('href'))
sleep(1) # 重要
if genres:
for genre in genres:
genre_counts[genre] += 1
return sorted(genre_counts.items(), key=lambda x: x[1])
71
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
ジャンル集計結果(抜粋)
72
ジャンル 作品数 例
ファンタジー 9 このはな奇譚
学園 6 Just Because!
SF 6 少女終末旅行
恋愛 5 Just Because!
アイドル 5 ラブライブ!サンシャイン!!
コメディ 5 銀魂. ポロリ篇
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Google画像検索でアニメ画像取得
• Selenium + PhantomJSでGoogle画像検索の
結果をスクリーンショットで取得
– https://github.com/AKB428/selenium_sample/blob/ma
ster/google_image_search.py
– python google_image_search.py “チノ”
– Selenium
• WebアプリのUIテストツール。コンソールからブラウザ操作
が可能
– PhantomJS
• wekitがベースのヘッドレスブラウザ
• メンテナンス終了予定のためヘッドレスChromeなどでも可
73
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
結果
チノちゃんを画像検索した
結果のスクリーンショット
74
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
(紹介)自然言語処理
人間が日常的に使っている自然言語をコンピュー
タに処理させる一連の技術であり、人工知能と言
語学の一分野 (Wikipedia)
• 例
– Google検索、Google翻訳、自動要約など
• スクレイピングと組み合わせると
– あるアニメの記事に出現する単語(「スポーツ」な
ど)のうち多く出現する上位の取得などができる
75
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
形態素解析器MeCab
• 文を形態素に分割
– 形態素解析: 文を形態素に分割すること(単語よりも
細かい)
• 専用”辞書”の利用が必要→Neologdがおすすめ
– アニメやマンガのタイトルを含む新語・流行語が含
まれる
– 「進撃 の 巨人」→「進撃の巨人」
– インストール(時間がかかるため割愛)
• Python3からMeCabを使う
https://qiita.com/taroc/items/b9afd914432da08d
afc8
76
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
注意事項
1. クローリング対象のWebサービスへの負荷を考
慮する
– シリアルアクセス
• レスポンスが返ってきてから次のリクエストを行う
– 1秒に1回程度
• 裏側の処理の重さなども考慮しておく
– DoSアタックと誤認される事例が存在
• 岡崎市立中央図書館事件(Librahack)
2. 著作権やサイトの利用規約に注意する
– そのまま公開するなどはNG
77
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Tips
• UserAgentに連絡先や自分のwebサイトのページ
を載せる
– サーバ管理者がクローラー作成者に連絡を取れるよ
うになる
• robots.txtを守る
– やりすぎてBAN対象にされる場合を考え、同じサイ
トでも定期的に取得
• サイトマップを起点にクローリングする
78
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
高度なクローリング&スクレイピング
Pythonクローリング&スクレイピングがおすすめ
• クローリングの高速化
• クローリングとスクレイピングの分離
• webページの自動操作 (selenium)
など
※本スライドでは省略
79
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
その他のトピック
Pythonistaになろう
80
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
さまざまなPythonコミュニティ
• PyCon JP
– 日本で毎年開催されるPythonのカンファレンス
– 安いチケットはすぐに売り切れるので早めの申込がオスス
メ
– https://pycon.jp/2017/ja/
• Python Boot Camp
– 初心者向けPythonチュートリアル。日本各地で開催
– https://www.pycon.jp/support/bootcamp.html
• PyLadies Tokyo
– 女性Pythonistaをつなぐために活動しているコミュニティ
の日本?支部
– https://pyladies-tokyo.connpass.com/
• 他: https://www.python.jp/community/
81
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
Easter egg(隠し機能)
標準機能としていくつかの隠し機能が存在
>>> import __hello__
Hello world...
>>>
※普通はimportしても何も出力されない
>>> import sys
>>>
82
http://www.lifewithpython.com/2013/07/Python-easter-eggs.html
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
良記事
• Pythonを書き始める前に見るべきTips
– https://qiita.com/icoxfog417/items/e8f97a6acad07903
b5b0
• 最強のPython開発環境 PyCharmのすゝめ
– https://qiita.com/pashango2/items/de342abc10722ed
7a569
83
Copyright (C) 2017 Toranoana Inc. All Rights Reserved.
学習コンテンツ
• 公式チュートリアルはオススメ
– 一通りの主要な機能を身につけられる
– https://docs.python.jp/3/tutorial/index.html
• PyQ(有償)
– 2,980円/月~
– https://pyq.jp/quests/
– 西尾泰和氏が監修
84

Más contenido relacionado

La actualidad más candente

20170131 python3 6 PEP526
20170131 python3 6 PEP526 20170131 python3 6 PEP526
20170131 python3 6 PEP526 masahitojp
 
なぜ科学計算にはPythonか?
なぜ科学計算にはPythonか?なぜ科学計算にはPythonか?
なぜ科学計算にはPythonか?Aki Ariga
 
Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Atsuo Ishimoto
 
Python東海Vol.5 IPythonをマスターしよう
Python東海Vol.5 IPythonをマスターしようPython東海Vol.5 IPythonをマスターしよう
Python東海Vol.5 IPythonをマスターしようHiroshi Funai
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
tse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティtse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティAtsuo Ishimoto
 
Pythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpPythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpYoshifumi Yamaguchi
 
Python3 プログラミング勉強会
Python3 プログラミング勉強会Python3 プログラミング勉強会
Python3 プログラミング勉強会Tetsuya Morimoto
 
python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集Hikaru Takemura
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由Ransui Iso
 
Python twitterとtkinterのことはじめ
Python twitterとtkinterのことはじめPython twitterとtkinterのことはじめ
Python twitterとtkinterのことはじめYukitaka Uchikoshi
 
今年使ってみて良かった、Pythonモジュール、パッケージ、ツール
今年使ってみて良かった、Pythonモジュール、パッケージ、ツール今年使ってみて良かった、Pythonモジュール、パッケージ、ツール
今年使ってみて良かった、Pythonモジュール、パッケージ、ツールaoshiman
 
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングSounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングt-sin
 
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化Yutaka Kato
 
LLdeade Python Language Update
LLdeade Python Language UpdateLLdeade Python Language Update
LLdeade Python Language UpdateAtsushi Shibata
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版Katsuhiro Morishita
 

La actualidad más candente (20)

20170131 python3 6 PEP526
20170131 python3 6 PEP526 20170131 python3 6 PEP526
20170131 python3 6 PEP526
 
なぜ科学計算にはPythonか?
なぜ科学計算にはPythonか?なぜ科学計算にはPythonか?
なぜ科学計算にはPythonか?
 
第1回python勉強会
第1回python勉強会第1回python勉強会
第1回python勉強会
 
Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料
 
2018/1/30 Django勉強会
2018/1/30 Django勉強会2018/1/30 Django勉強会
2018/1/30 Django勉強会
 
Python東海Vol.5 IPythonをマスターしよう
Python東海Vol.5 IPythonをマスターしようPython東海Vol.5 IPythonをマスターしよう
Python東海Vol.5 IPythonをマスターしよう
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
tse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティtse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティ
 
Pythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpPythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjp
 
Python3 プログラミング勉強会
Python3 プログラミング勉強会Python3 プログラミング勉強会
Python3 プログラミング勉強会
 
python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
 
Python twitterとtkinterのことはじめ
Python twitterとtkinterのことはじめPython twitterとtkinterのことはじめ
Python twitterとtkinterのことはじめ
 
今年使ってみて良かった、Pythonモジュール、パッケージ、ツール
今年使ってみて良かった、Pythonモジュール、パッケージ、ツール今年使ってみて良かった、Pythonモジュール、パッケージ、ツール
今年使ってみて良かった、Pythonモジュール、パッケージ、ツール
 
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングSounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
 
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
 
LLdeade Python Language Update
LLdeade Python Language UpdateLLdeade Python Language Update
LLdeade Python Language Update
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
 

Similar a 2017/12/21 虎の穴 Python勉強会

明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化Taiji Tsuchiya
 
Python Kyoto study
Python Kyoto studyPython Kyoto study
Python Kyoto studyNaoya Inada
 
Python32 pyhackathon-201011
Python32 pyhackathon-201011Python32 pyhackathon-201011
Python32 pyhackathon-201011Toru Furukawa
 
Python languageupdate (2004)
Python languageupdate (2004)Python languageupdate (2004)
Python languageupdate (2004)泰 増田
 
Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]MasaruOinaga
 
Exgettextの話
Exgettextの話Exgettextの話
Exgettextの話k1complete
 
rpi_handson_2.5
rpi_handson_2.5rpi_handson_2.5
rpi_handson_2.5teruyaono1
 
Hello World Python featuring GAE
Hello World Python featuring GAEHello World Python featuring GAE
Hello World Python featuring GAEMaito Kuwahara
 
DATUM STUDIO PyCon2016 Turorial
DATUM STUDIO PyCon2016 TurorialDATUM STUDIO PyCon2016 Turorial
DATUM STUDIO PyCon2016 TurorialTatsuya Tojima
 
cs-10. Python の基礎(オブジェクト,メソッド,引数,文字列)
cs-10. Python の基礎(オブジェクト,メソッド,引数,文字列) cs-10. Python の基礎(オブジェクト,メソッド,引数,文字列)
cs-10. Python の基礎(オブジェクト,メソッド,引数,文字列) kunihikokaneko1
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botdcubeio
 
Programming AWS with Python
Programming AWS with Python  Programming AWS with Python
Programming AWS with Python Yasuhiro Matsuo
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2Tomohiro Namba
 
Kerasで深層学習を実践する
Kerasで深層学習を実践するKerasで深層学習を実践する
Kerasで深層学習を実践するKazuaki Tanida
 
PostgreSQLとpython
PostgreSQLとpythonPostgreSQLとpython
PostgreSQLとpythonSoudai Sone
 
200319 eash python_shareslide
200319 eash python_shareslide200319 eash python_shareslide
200319 eash python_shareslideHiroki Katayama
 

Similar a 2017/12/21 虎の穴 Python勉強会 (20)

明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化
 
Django_fukuoka
Django_fukuokaDjango_fukuoka
Django_fukuoka
 
Django_Fukuoka
Django_FukuokaDjango_Fukuoka
Django_Fukuoka
 
Python Kyoto study
Python Kyoto studyPython Kyoto study
Python Kyoto study
 
Python32 pyhackathon-201011
Python32 pyhackathon-201011Python32 pyhackathon-201011
Python32 pyhackathon-201011
 
Python languageupdate (2004)
Python languageupdate (2004)Python languageupdate (2004)
Python languageupdate (2004)
 
Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]
 
Exgettextの話
Exgettextの話Exgettextの話
Exgettextの話
 
rpi_handson_2.5
rpi_handson_2.5rpi_handson_2.5
rpi_handson_2.5
 
Hello World Python featuring GAE
Hello World Python featuring GAEHello World Python featuring GAE
Hello World Python featuring GAE
 
DATUM STUDIO PyCon2016 Turorial
DATUM STUDIO PyCon2016 TurorialDATUM STUDIO PyCon2016 Turorial
DATUM STUDIO PyCon2016 Turorial
 
Tfug kansai vol2
Tfug kansai vol2Tfug kansai vol2
Tfug kansai vol2
 
cs-10. Python の基礎(オブジェクト,メソッド,引数,文字列)
cs-10. Python の基礎(オブジェクト,メソッド,引数,文字列) cs-10. Python の基礎(オブジェクト,メソッド,引数,文字列)
cs-10. Python の基礎(オブジェクト,メソッド,引数,文字列)
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack bot
 
Programming AWS with Python
Programming AWS with Python  Programming AWS with Python
Programming AWS with Python
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
Kerasで深層学習を実践する
Kerasで深層学習を実践するKerasで深層学習を実践する
Kerasで深層学習を実践する
 
PostgreSQLとpython
PostgreSQLとpythonPostgreSQLとpython
PostgreSQLとpython
 
200319 eash python_shareslide
200319 eash python_shareslide200319 eash python_shareslide
200319 eash python_shareslide
 
Why python
Why pythonWhy python
Why python
 

Más de 虎の穴 開発室

Railsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認するRailsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認する虎の穴 開発室
 
虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴 開発室
 
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdfDeno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf虎の穴 開発室
 
toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明虎の穴 開発室
 
Deno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介しますDeno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介します虎の穴 開発室
 
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –虎の穴 開発室
 
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと虎の穴 開発室
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」虎の穴 開発室
 
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!虎の穴 開発室
 
セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説虎の穴 開発室
 
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発虎の穴 開発室
 
Amplify Studioを使ってみた
Amplify Studioを使ってみたAmplify Studioを使ってみた
Amplify Studioを使ってみた虎の穴 開発室
 
いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!虎の穴 開発室
 
【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ虎の穴 開発室
 
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について虎の穴 開発室
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜 虎の穴 開発室
 
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント 虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント 虎の穴 開発室
 

Más de 虎の穴 開発室 (20)

FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化
 
Railsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認するRailsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認する
 
虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf
 
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdfDeno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
 
toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明
 
Deno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介しますDeno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介します
 
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
 
GCPの画像認識APIの紹介
GCPの画像認識APIの紹介 GCPの画像認識APIの紹介
GCPの画像認識APIの紹介
 
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
 
GitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼうGitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼう
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」
 
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
 
セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説
 
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
 
Amplify Studioを使ってみた
Amplify Studioを使ってみたAmplify Studioを使ってみた
Amplify Studioを使ってみた
 
いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!
 
【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ
 
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
 
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント 虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
 

2017/12/21 虎の穴 Python勉強会

  • 1. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 他言語エンジニアの ためのPython入門 虎の穴 開発室 白井 尊昭
  • 2. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. タイムテーブル 時刻 内容 19:00 開場・受付 19:30 開会案内・会場説明 19:35 発表者: 開発室 白井 他言語エンジニアのためのPython入門 (スライド発表+ハンズオン+演習) 2. Pythonではじめるオタク向けサービス 開発(クローリング&スクレイピング) 21:05 休憩&LT準備 21:15 LT×3名→1名 21:30 終了 1
  • 3. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 目次 • はじめに • Pythonとは • Pythonことはじめ – インストール+環境構築からデータ構造・制御構造ま で一通り紹介 • Pythonによるクローリング&スクレイピング入 門 • その他のトピック 2
  • 4. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 自己紹介 白井 尊昭 所属: 開発室(エンジニアとデザイナが在籍) • 2014年4月〜(株)ブレインパッド エンジニ ア 広告系のASPサービス開発 • 2017年10月〜(株)虎の穴 エンジニア 新規サービスの開発 • 好きなアニメ: 攻殻機動隊、PSYCHO-PASS (最近は) Just Because • 好きな漫画: (最近は) ヒナまつり 3
  • 5. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 勉強会の目的 • 他のオブジェクト指向言語(Java, Ruby, …) は使えるがPythonはよく知らないので 概要を知りたい方向け – 基本的なデータ構造や制御構造だけでなく 学習方法やIDEなど自学するための入り口も紹介 • オタクアプリなど、好きなサービスを自分で Pythonで作るためのきっかけ作り – 今回はクローリング&スクレイピングまで – Webアプリの作り方は範囲外(今後予定) 4
  • 6. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 虎の穴とPython • 株式会社虎の穴では言語はRubyを主に採用 – RubyWorld Conference 2017や福岡RubyKaigi 02出展 • Pythonに興味はあるがサービスで 使ったことのないエンジニアが社内では多い • Ruby以外の言語も選択肢として増やしておきた い 5 社内でPython勉強会を開催&社外にも共有
  • 7. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 勉強会の進め方 • 発表聴講+ハンズオン形式 –ときどき軽い演習 • 質問あれば随時受け付けます! 6
  • 8. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonとは • いわゆるLL言語 (軽量プログラミング言語) • オブジェクト指向言語 • なぜPythonという名前? × Python (ニシキヘビ) ◯ Monty Python‘s Flying Circus (空飛ぶモンティ・パイソン、 イギリスのコメディ番組) 7 https://docs.python.jp/3/faq/general.html#why-is-it-called-python
  • 9. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonの特徴 • 動的で強い型付け – (動的)プログラム実行時にデータ型が見いだされる – (強い)型付けが常に強制 例: 整数型を文字列型のように扱うには 明示的に変換 • バッテリー同梱(batteries included) – 標準で様々な機能を利用できる。 例: emailパッケージで電子メール向けのメッセージデコー ドなど • 機械学習やデータ分析の用途に適している(後述) 8
  • 10. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 用途 • 機械学習 – データから学習してモデルをつくること 例: 人の顔を判別するモデル – ライブラリが豊富 • TensorFlow, Chainer, scikit-learn, PySpark, … – 機械学習向けの環境構築が楽(Minicondaなど) • データ分析 – PandasやJupyter • Webアプリケーション – フレームワークはDjangoやFlaskが有名 9 参考: https://www.python.org/about/apps/
  • 11. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. The Zen of Python (Pythonの禅) “Python を理解し利用する上での導きとなる、 Python の設計原則と哲学をリストにしたもの” 対話プロンプトで”import this”とすると… >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. … (略) 10 参考: https://docs.python.jp/3/glossary.html
  • 12. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 例: Explicit is better than implicit. 訳: 暗黙よりも明示(的に書くこと)の方が良い。 ※配下の全モジュールをimportするのでなく、 必要なものを直指定すべき、など from os import * print(getcwd()) ↓ import os print(os.getcwd()) 11 https://qiita.com/IshitaTakeshi/items/e4145921c8dbf7ba57ef
  • 13. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonの歴史(2系と3系が共存) リリース 西暦年 備考 0.9.0 1991 Guido van RossumがABC言語の後継として生み出す 2.0 2000 Python 2.x系リリース 3.0 2008 Python 3.x系リリース 2.7 2010 Python 2.xの最後のメジャーリリース 2017 Python 3.6.3リリース(最新版) 2020 Python 2.xのサポート(セキュリティアップデートや バグフィックス)終了 12 http://docs.python.jp
  • 14. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Python3.xを利用しよう • 結論: Python2.xでなくPython3.xでほぼ問題なし • 主要ライブラリの対応状況: ほぼPython3.x対応 – https://python3wos.appspot.com/ • Google App Engineを使う場合は注意 – Standard environmentはPython 2.7のみ • ネット上の情報はバージョンに注意 ライブラリの利用方法が違ったりするため 13
  • 15. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonのトレンド 各種プログラミング言語ランキングでは上位常連 (例) PYPL: PopularitY of Programming Language – Pythonは常に上昇傾向(そろそろ首位) – チュートリアルの検索回数をもとに作られたイン デックス(シェア) 14 http://pypl.github.io/PYPL.html
  • 16. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Pythonことはじめ 15
  • 17. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 内容 • インストール(事前にお願いしました) • (仮想)環境構築 • Hello, world! • データ型 • 制御構造(if, while, for) • 関数・クラス • ファイル入出力 16
  • 18. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Python3のインストール • Windows – https://www.python.org/ > Downloads > Windows > 3.6.4 – https://qiita.com/taiponrock/items/f574dd2cddf8851fb02c • Mac – 2.xは標準でインストール済 – https://qiita.com/1000ch/items/93841f76ea52551b6a97 • ※pyenvは複数バージョンのインストールに利用。3.6.3をイン ストール – (homebrewでも可) brew install python3 • これのみだとpython3と毎回打つ必要 17
  • 19. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. venvで仮想的にPythonの環境を構築 • 仮想的にPythonの環境を構築できる 標準パッケージ • ディレクトリごとに、異なるPythonバージョン やパッケージの環境を利用可能 – 同一バージョンを複数使い分けることも可能 • Python3.3以上でのみ利用可、 それ以前ならvirtualenvをインストールして利用 が一般的 18
  • 20. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. venvの使い方 $ cd ~/projects $ python -m venv py # 仮想環境の作成 $ cd py $ source bin/activate # 仮想環境を有効化 (py) $ which python /Users/xxx/projects/py/bin/python(py) (py) $ deactivate # 仮想環境を無効化 $ which python /Users/xxx/.pyenv/shims/python #環境による 19 注意: 以降、仮想環境での実行を想定
  • 21. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 開発環境 • PyCharm(パイチャーム)またはIntelliJ IDEA + Python plugin – PyCharm: JetBrainsが開発したPython用のIDE。 無償版でも十分(有償は高め) – IntelliJ IDEA + Python plugin: PyCharmと基本的に Pythonの機能は同じ →HTMLやCSSなどWeb開発も便利にしたいならこちら – この環境がオススメ • Jupyter Notebook – ブラウザでかんたんに試行錯誤しながらコーディングして実行 結果を保存したりできる • 各エディタ – AtomやEmacsなど 20
  • 22. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. PEP8: スタイルガイド • PEP8: Pythonコードのスタイルガイド(ペップエイト) • Pythonのコードを読みやすく、スタイル統一するための規約 • PEP: Python Enhancement Proposal(Python拡張提案) • 新機能の提案やガイドラインの説明などをするためのドキュメント • https://www.python.org/dev/peps/pep-0008/ • (個人による日本語訳の例: https://github.com/mumumu/pep8-ja) • PEP8の例 • 1段階のインデントには4つのスペースを使う • クラス内のメソッド定義は空白行1つで区切る • 関数名は小文字で、可読性のために必要とされる場合に単語を アンダースコアで区切る • PEP8 チェックツール: flake8(フレークエイト) がおすすめ(コードのエラーチェックなどもできる) 21
  • 23. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Hello, world! 1. コンソールで実行 $ python … >>> print(“Hello, Akihabara!”) Hello, Akihabara! >>> exit() # 終了 2. ファイルを指定して実行 (ファイルhello.pyに同じ内容を記述) $ python hello.py Hello, world! 22
  • 24. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ブロック Pythonではブロックはインデントで記述し、 括弧は用いない PEP8ではスペース4つが推奨 if x == 0: print(“hoge”) else: print(“fuga”) 23 Python Ruby Java インデント end { … }
  • 25. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. データ型 • 整数型、文字列型、リスト型、辞書型… • 整数型と文字列型を+で演算はできない、 などの制限が存在(強い型付け) • 型を調べるには組み込み関数typeを利用 >>> type(123) <type ‘int’> ※プリミティブ型は存在しない ※Javaでいうプリミティブ型: byte, int, float, … Pythonでは全てがオブジェクトであり型をもつ 24
  • 26. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 変数 • 宣言不要 • 「x = 3」で代入可、「x + 10」などでxを参照可 能 • 「x = “aaa”」などとすると新たなxを作成し代入 (「3」は破棄) • 定数は存在しない ※PEP8では定数的扱いをするものの命名は HOGE_FUGAを推奨 25 Python Ruby Java 変数宣言 不要 不要 型宣言 定数 なし あり あり
  • 27. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 数値 • 整数型、実数型、複素数型、ブール型が存在 • 算術演算(四則演算や剰余算など)ができる >>> type(1) # 整数型 <type 'int'> >>> type(1.1) # 実数型 <type 'float'> >>> type(1+2j) # 複素数型 <type 'complex'> >>> type(True) #ブール型 <type 'bool'> 26 Python Ruby Java 整数 int Integer short int long 小数 点数 float decimal Float float double 複素 数 complex Complex × ブー ル bool Boolean boolean
  • 28. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Tips: 厳密な計算が必要ならDecimal • floatは浮動小数点数のため10進数の演算ではない >>> 1.1 + 2.2 3.3000000000000003 • 任意の数を10進数で正確に表すには固定小数点数型 >>> from decimal import Decimal >>> decimal.Decimal('0.1') + decimal.Decimal('0.2’) Decimal('0.3') • 決済などお金を扱うのに便利 • 標準モジュールには含まれるが広く使われる型ではない • 注意: 以下は無意味(もとの値が浮動小数点数なら意図 しない値に) >>> decimal.Decimal(0.1) 27
  • 29. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 文字列型 • 文字を扱うための型。他言語でいう文字型charは存 在しない – ‘あいうえお’や’hogehoge’など • 非可変(変更不可) • できること – 文字列と文字列を結合して 新たな文字列を作成 – 文字列の一部分を切り出して 新たな文字列を作成 – など 28 Python Ruby Java string str String String char × × char
  • 30. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 文字列型の記述方法と補足 • 記述方法は3つ • 「’hoge’」シングルクォーテーション • 「”hoge”」ダブルクォーテーション • 「’’’hoge’’’」トリプルクォーテーション(シングル 又はダブルを3つ) • プログラム中での改行を文字列中での改行とみなす • unicode型とstr型が存在 – (Python 3.xはデフォルトでunicode型なので特に気 にしなくて良い) 29
  • 31. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 文字列操作 # 文字列の連結 >>> 'hoge' + 'fuga' 'hogefuga' # 文字列の長さを取得 >>> len('hoge') 4 # 文字の先頭が~であればTrue >>> 'hoge'.startswith('ho') True >>> 'hoge'.startswith('a') False 30
  • 32. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 文字列操作2 # replaceにより文字を置換できる >>> 'hogefuga'.replace('hoge', ’piyo') ‘piyofuga’ # 前後の空白を取り除く(全角も可能) >>> ‘ hogefuga ‘.strip() ‘hogefuga’ 31
  • 33. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 部分文字列の取得 インデックスによるアクセスが可能 >>> s = 'hogefuga' >>> s[0] 'h' >>> s[:3] #0文字目から3文字目の”直前”まで 'hoge' >>> s[2:4] 'ge' 32
  • 34. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. リスト型 リストは角括弧の中にカンマで区切られた式を並べて 作る ※柔軟で便利な操作が可能(後述) 数値、文字列、式を混ぜたリスト >>> [1, 2+3, ‘hoge’, ‘fuga’, 1.1] [1, 5, 'hoge', 'fuga', 1.1] インデックスアクセス >>> x = [1, 2, 3] >>> x[1] = 100 >>> x [1, 100, 3] 33 Python Ruby Java リスト list Array [] 型の 制約 なし なし あり
  • 35. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. リスト型に対する操作の例 >>> x = [‘hoge’, ‘fuga’, ‘piyo’] # リストの作成 >>> x ['hoge', 'fuga', 'piyo'] >>> x[0] # 0番目の要素を取得(最初の要素は0番目) 'hoge' >>> len(x) # リストの長さを取得 3 >>> x.append(1) # リストに1を追加 >>> x ['hoge', 'fuga', 'piyo', 1] >>> ‘hoge’ in x # ‘hoge’がリストに存在する場合True、そう でない場合False True 34
  • 36. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. タプル型 タプルは丸括弧の中にカンマで区切られた式を並べて作る。リストと は違い、要素は変更不可能 >>> (1, 2+3, ‘hoge’, ‘fuga’, 1.1) # 数値、文字列、式を混ぜたタプル (1, 5, ‘hoge’, ‘fuga’, 1.1) >>> (1, ) # 要素が1個のタプル。式をくくるときも丸括弧を使うため、 カンマをつけて区別する (1,) >>> () # 要素が0個のタプル () >>> a = (1, 2, 3) >>> a[0] = 4 # これはエラー Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment 35 Python Ruby Java タプル tuple (近い)Arrayを freezeする なし 型の 制約 なし なし -
  • 37. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. set型(集合型) • 順序のないユニークなオブジェクトの集合 • 数学的な集合演算が可能(和集合を求めるなど) >>> {1, 2+3, ‘hoge’, ‘fuga’, 1.1} # 数値、文字列、式を混ぜ た集合 set([1, 2, 3]) >>> set([1, 2, 3]) # set()でリストをくくってもsetを生成で きる set([1, 2, 3]) >>> {1, 2} & {2, 3} # 共通集合 set([2]) >>> a = {1, 2} >>> {1, 2, 2, 3} {1, 2, 3} 36 ※要素の追加ができない、変更不可能なflozenset型もある。 Python Ruby Java set tuple Set HashSet 型の 制約 なし なし あり
  • 38. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 辞書型 • RubyでいうHash, JavaでいうHashMap • 辞書に格納された要素に順序は存在しない • リストのように、インデックスではアクセス出来ない >>> d = {‘hoge’: 1, ‘fuga’: 2, ‘piyo’: 2} # キー:値という ペアを要素とする >>> d[‘fuga’] # ‘fuga’は辞書に存在するので、その値を 取得できる 2 >>> d[‘xxx’] # 存在しない … KeyError: 'xxx' 37 Python Ruby Java 辞書 dict Hash HashMap 型の 制約 なし なし あり
  • 39. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 辞書型 >>> d = {'fuga': 2, 'piyo': 2, 'hoge': 1} >>> d[‘aaa’] = 3 # 辞書への要素追加 >>> d {'fuga': 2, 'aaa': 3, 'piyo': 2, 'hoge': 1} >>> d[10] = (1, 2, 3) # いろいろな値を追加できる >>> d {10: (1, 2, 3), 'fuga': 2, 'aaa': 3, 'piyo': 2, 'hoge': 1} >>> del d[‘hoge’] # 辞書から要素を削除 >>> d.keys() # 辞書に含まれるキーのリスト [10, 'fuga', 'aaa', 'piyo'] >>> d.values() #辞書に含まれる値のリスト [(1, 2, 3), 2, 3, 2] 38
  • 40. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 制御フロー 39
  • 41. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 制御フローは以下3つ • if(条件分岐) • while(繰り返し) • for(繰り返し) ※switchはなし 40 Python Ruby Java 条件 分岐 if if unless case if switch while while while until while do while for for for for 拡張for
  • 42. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. if文 最初にマッチしたもののみ実行 if x < 0: print(“if”) elif x < 1: print(“elif”) else: print(“else”) 41
  • 43. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. while文 式の値が真である間、繰り返し実行 x = 0 while x < 100: x += 1 print(x) 42
  • 44. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. for文 シーケンス(文字列、タプル、リスト)などの要 素一つ一つに対して反復処理を行う for x in [“hoge”, “fuga”, “piyo”]: print(x) # “a”, “b”, “c”が出力 for x in “abc”: print(x) 43
  • 45. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. for文: range()関数 • 0から99までの数値リストは、組み込み関数 rangeを用い、range(0,100)で作成できる • [0, 1, 2, 3, 4, …, 99]というリストを書く必要がない # 0から99までの数値が出力される for x in range(0, 100): print(x) 44
  • 46. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 練習: FizzBuzz (5~10分くらい) • 1~50の数値を出力するfizzbuzz.py を作成して下さい。 – 3の倍数の時に文字列”Fizz” – 5の倍数の時に”Buzz” – 15の倍数の時に”FizzBuzz” – それ以外はその数 • 制限: print()関数の記述は1回のみ 45 $ python fizzbuzz.py 1 2 Fizz 4 Buzz Fizz …(略) 14 FizzBuzz …(略) 49 Buzz
  • 47. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 解答例 for x in range(1, 51): if x % 15 == 0: print("FizzBuzz") elif x % 5 == 0: print("Buzz") elif x % 3 == 0: print("Fizz") else: print(x) 46
  • 48. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 良くない解答例 for x in range(1, 51): if x == 3: print(“fizz”) if x == 5: print(“buzz”) if x == 6 print(“fizz”) … 47
  • 49. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 関数定義 48
  • 50. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 関数定義 # 引数に型制限はなし(演算不可の場合は実行時 エラー) def hoge(x): print(x) return x + x ※PEP8: 関数名はすべて小文字で単語の境界には アンダースコア「_」をつけるべき 49
  • 51. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 組み込み関数 • 組み込み関数:type()やprint()など、 標準で組み込まれていていつでも利用できる関 数 • 使用するためにモジュールをimportなどする必要が ない • 組み込み関数の一覧 • http://docs.python.jp/2/library/functions.html >>> print('Hello, world!') Hello, world! 50
  • 52. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 演習: 再帰的呼び出し(10分) 関数の中で関数を呼ぶことも可能。 そのような関数を定義し、nの階乗を求めて下さい。 例: 5の階乗 5! = 5 * 4 * 3 * 2 * 1 = 120 関数定義のヒント: def hoge(x): print(x) return x + x 51
  • 53. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 解答例 def factorial(x): if x == 1: return x else: return x * factorial(x - 1) print(factorial(10)) 52
  • 54. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クラス定義 53
  • 55. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クラスの定義 多重継承も可能だが複雑なので避けるのが吉 class MyClass: """これはコメント""" i = 123 def __init__(self): print("コンストラクタ") def f(self): print("hoge") c = MyClass() c.f() print(c.i) # クラス変数 54 Python Ruby Java クラス ◯ ◯ ◯ 多重継承 ◯ × (Mix-in) × インタ フェース × × ◯
  • 56. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クラスのインスタンス化 クラスは通常、インスタンス化して使う – クラス名()でインスタンス化。 ただし、__init__にself以外の引数があるときは引 数を与える (ファイルの続き) x = MyClass() # インスタンス化 x.f() # ‘hoge’がprintされる 55
  • 57. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイル入出力 56
  • 58. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイル入出力について • ファイルオブジェクトを介して読み書きを行う • 組み込み関数のopen() でファイルオブジェクトを 生成できる • ファイルを開く際にはモードが存在 • 読み出し専用、書き込み専用、追記用、読み書き 両用 • さらに、テキストモードかバイナリモードか指定 57https://docs.python.jp/3/tutorial/inputoutput.html#reading-and-writing-files
  • 59. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 読み込み # 事前に適当なファイルa.txtなどを作成 >>> f = open('a.txt', 'r') >>> f.read() # ファイルの最後まで読み、strとして返す 'aefan' >>> f.read() # 終端まで読んだので、空が返ってくる '' >>> f.read() '' >>> f.close() >>> f.read() # ファイルを閉じた後に読もうとするとエラー Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file 58
  • 60. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイル読み込みの3つの方法 read(): ファイルの終端まで読む readlines(): ファイルの終端まで読み、 各行をリストの要素にして返す(改行コードは含まない) readline(): ファイルを1行分読む(改行コードも含む) >>> f = open('a.txt', 'r') >>> f.readlines() ['aefan'] >>> f.close() >>> >>> f = open('a.txt', 'r') >>> f.readline() 'aefan' >>> f.readline() 59
  • 61. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイルへの書き込み • write(s): 文字列sをファイルに書き込む • writelines(l): シーケンス型lをファイルに書き込む • 以下を追記モードでも試してみてください • open(file_name, ‘a’)でfile_nameを開く >>> f = open('a.txt', 'w') >>> f.write(‘abcde’) # 適当に >>> f.close() >>> f.write('abcde') # 例外発生 >>> f = open('a.txt', 'r') >>> f.read() 'abcde' 60
  • 62. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ファイルの読み込み(for文) for文により、ファイルの各行を簡単に読み込める $ cat a.txt aaa bbb ccc (読み込み。各行に含まれる改行も表示されている) >>> for l in open('a.txt', 'r'): ... print(l) ... aaa bbb 61
  • 63. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クローリング&スクレイピング 62
  • 64. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. この章の内容 1. クローリング 2. スクレイピング 3. 注意事項 特にクローリングを行う際の注意や推奨事項 63
  • 65. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 複数の書籍が刊行 64
  • 66. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. クローリング&スクレイピング • クローリング: ハイパーリンクをたどりながら webページを収集 – 特に、Googleなどの検索エンジンが大規模に運用 • スクレイピング: webページをパースして 欲しい情報を抜き出す • UNIXコマンドでもOK – wget: 再帰的にwebページを取得できるオプション(-r)あり • 特定ページ取得/とにかく全部取得するならこれでもOK – スクレイピングはPythonが圧倒的に楽 • Pythonの場合は複数のライブラリを組み合わせて作成 (後述) – フレームワークscrapyが有名だが、学習コストの関係上省略 65
  • 67. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. webページをたどる(クローリング) 本格的に行う場合はscrapyフレームワークを利用 →「Python クローリング&スクレイピング」6章 →本質的でない作業を肩代わりしてくれる • リンクの抽出 • (エラー時の)リトライ • 時間間隔の調整 … 今回は本格的なクローリングは割愛 66
  • 68. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. webページの取得: requestsライブラリ requestsライブラリが標準のurllibより簡単 インストール: $ pip install requests >>> import requests >>> r = requests.get('http://qiita.com/advent- calendar/2014') >>> r.status_code 200 >>> r.text ‘<!DOCTYPE html> …’ ※今回は複雑な処理をしないためurllibを利用 67
  • 69. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 例: Wikipediaからアニメ一覧を取得 from urllib.request import urlopen from bs4 import BeautifulSoup # 日本のテレビアニメ作品一覧 (2010年代 後半)) f = urlopen('https://goo.gl/vFjEp5’) soup = BeautifulSoup(f, "html.parser") # 今期(2017年 10月 - 12月)のアニメ一覧 table = soup.find_all('table', {'class': 'wikitable'})[11] for tr in table.find_all('tr'): a = tr.find('a') if a: print(a.text, a.get('href')) 68 ※DBPediaという構造化されたデータも存在するが割愛
  • 70. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 結果(タイトルとリンク取得) THE IDOLM@STER Prologue SideM -Episode of Jupiter- /wiki/%E3%82%A2%E3%82%A4%E3%83%89%E3%83% AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%B C_SideM 銀魂. ポロリ篇 /wiki/%E9%8A%80%E9%AD%82_(%E3%82%A2%E3%83 %8B%E3%83%A1) お見合い相手は教え子、強気な、問題児。 /wiki/%E3%81%8A%E8%A6%8B%E5%90%88%E3%81% 84%E7%9B%B8%E6%89%8B%E3%81%AF%E6%95%99 %E3%81%88%E5%AD%90%E3%80%81%E5%BC%B7% E6%B0%97%E3%81%AA%E3%80%81%E5%95%8F%E9 %A1%8C%E5% 85%90%E3%80%82 … 69
  • 71. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 各ページからジャンルを抽出 def get_genre(url): f = urlopen(url) soup = BeautifulSoup(f, "html.parser") table = soup.find("table", {"class": "infobox"}) if not table: return for tr in table.find_all("tr"): th = tr.find('th') if th and "ジャンル" in th: return tr.find('td').text.split("、") print(get_genre("https://ja.wikipedia.org/wiki/Just_Because!")) 70
  • 72. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. アニメ一覧取得+ジャンル抽出 def get_genre_ranking(): f = urlopen('https://goo.gl/vFjEp5') soup = BeautifulSoup(f, "html.parser") # 今期(2017年 10月 - 12月)のアニメ一覧 genre_counts = defaultdict(int) table = soup.find_all('table', {'class': 'wikitable'})[11] for tr in table.find_all('tr'): a = tr.find('a') if a: genres = get_genre("https://ja.wikipedia.org" + a.get('href')) sleep(1) # 重要 if genres: for genre in genres: genre_counts[genre] += 1 return sorted(genre_counts.items(), key=lambda x: x[1]) 71
  • 73. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. ジャンル集計結果(抜粋) 72 ジャンル 作品数 例 ファンタジー 9 このはな奇譚 学園 6 Just Because! SF 6 少女終末旅行 恋愛 5 Just Because! アイドル 5 ラブライブ!サンシャイン!! コメディ 5 銀魂. ポロリ篇
  • 74. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Google画像検索でアニメ画像取得 • Selenium + PhantomJSでGoogle画像検索の 結果をスクリーンショットで取得 – https://github.com/AKB428/selenium_sample/blob/ma ster/google_image_search.py – python google_image_search.py “チノ” – Selenium • WebアプリのUIテストツール。コンソールからブラウザ操作 が可能 – PhantomJS • wekitがベースのヘッドレスブラウザ • メンテナンス終了予定のためヘッドレスChromeなどでも可 73
  • 75. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 結果 チノちゃんを画像検索した 結果のスクリーンショット 74
  • 76. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. (紹介)自然言語処理 人間が日常的に使っている自然言語をコンピュー タに処理させる一連の技術であり、人工知能と言 語学の一分野 (Wikipedia) • 例 – Google検索、Google翻訳、自動要約など • スクレイピングと組み合わせると – あるアニメの記事に出現する単語(「スポーツ」な ど)のうち多く出現する上位の取得などができる 75
  • 77. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 形態素解析器MeCab • 文を形態素に分割 – 形態素解析: 文を形態素に分割すること(単語よりも 細かい) • 専用”辞書”の利用が必要→Neologdがおすすめ – アニメやマンガのタイトルを含む新語・流行語が含 まれる – 「進撃 の 巨人」→「進撃の巨人」 – インストール(時間がかかるため割愛) • Python3からMeCabを使う https://qiita.com/taroc/items/b9afd914432da08d afc8 76
  • 78. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 注意事項 1. クローリング対象のWebサービスへの負荷を考 慮する – シリアルアクセス • レスポンスが返ってきてから次のリクエストを行う – 1秒に1回程度 • 裏側の処理の重さなども考慮しておく – DoSアタックと誤認される事例が存在 • 岡崎市立中央図書館事件(Librahack) 2. 著作権やサイトの利用規約に注意する – そのまま公開するなどはNG 77
  • 79. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Tips • UserAgentに連絡先や自分のwebサイトのページ を載せる – サーバ管理者がクローラー作成者に連絡を取れるよ うになる • robots.txtを守る – やりすぎてBAN対象にされる場合を考え、同じサイ トでも定期的に取得 • サイトマップを起点にクローリングする 78
  • 80. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 高度なクローリング&スクレイピング Pythonクローリング&スクレイピングがおすすめ • クローリングの高速化 • クローリングとスクレイピングの分離 • webページの自動操作 (selenium) など ※本スライドでは省略 79
  • 81. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. その他のトピック Pythonistaになろう 80
  • 82. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. さまざまなPythonコミュニティ • PyCon JP – 日本で毎年開催されるPythonのカンファレンス – 安いチケットはすぐに売り切れるので早めの申込がオスス メ – https://pycon.jp/2017/ja/ • Python Boot Camp – 初心者向けPythonチュートリアル。日本各地で開催 – https://www.pycon.jp/support/bootcamp.html • PyLadies Tokyo – 女性Pythonistaをつなぐために活動しているコミュニティ の日本?支部 – https://pyladies-tokyo.connpass.com/ • 他: https://www.python.jp/community/ 81
  • 83. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. Easter egg(隠し機能) 標準機能としていくつかの隠し機能が存在 >>> import __hello__ Hello world... >>> ※普通はimportしても何も出力されない >>> import sys >>> 82 http://www.lifewithpython.com/2013/07/Python-easter-eggs.html
  • 84. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 良記事 • Pythonを書き始める前に見るべきTips – https://qiita.com/icoxfog417/items/e8f97a6acad07903 b5b0 • 最強のPython開発環境 PyCharmのすゝめ – https://qiita.com/pashango2/items/de342abc10722ed 7a569 83
  • 85. Copyright (C) 2017 Toranoana Inc. All Rights Reserved. 学習コンテンツ • 公式チュートリアルはオススメ – 一通りの主要な機能を身につけられる – https://docs.python.jp/3/tutorial/index.html • PyQ(有償) – 2,980円/月~ – https://pyq.jp/quests/ – 西尾泰和氏が監修 84