96
Python言語」 はじめの一歩 Takanori Suzuki / 2016 Jan 12 ヒカ☆ラボ

「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12

Embed Size (px)

Citation preview

「Python言語」

はじめの一歩Takanori Suzuki / 2016 Jan 12

ヒカ☆ラボ

ハッシュタグは #ヒカラボ

自己紹介• 鈴木 たかのり / Takanori Suzuki

• Twitter: @takanory

• PyCon JP 2014-2016 Chair

• Python Bouldering 部(#kabepy)部長

• Python mini Hack-a-thon(#pyhack)主催

• Pythonで開発してる会社

• connpassも運営してるよ

• 一部分を書いた→

• http://www.shuwasystem.co.jp/products/7980html/4315.html

BeProud所属

• 2015年4月発売

• 内容はここから主に引用

• 128ページ、1,980円+税

• http://gihyo.jp/book/2015/978-4-7741-7320-7

Pythonエンジニア養成読本

来場ありがとうございます

Pythonでのプログラミングに

興味ある人?

Python 書いたことある人?

他の言語でプログラム 書いたことある人?

プログラム 書いたことない人?

注意事項

今日の内容だけで Python書けるように

ならないよ

今日やること1. Pythonの特徴

2. 言語の特徴

3. インストール

4. 基本的な言語仕様

5. Python 2と3の違い

6. よく使う標準ライブラリ

7. よく使うサードパーティ製パッケージ

8. どうやって学ぶか

1. Pythonの特徴

Q. Pythonってなにができるの?

A. なんでもできます

きれいに書きやすい ので保守しやすい

ちゃんとしてる

• 20年以上開発が継続

• 後方互換性あり

• PEPというルールに則って機能を拡張

Python 2 と 3

• 最新は Python 2.7.11 と 3.5.1

• 一部後方互換性なし

• 今日は Python 3 ベースでやります

2. 言語の特徴

今日やること1. Pythonの特徴

2. 言語の特徴 ← イマココ

3. インストール

4. 基本的な言語仕様

5. Python 2と3の違い

6. よく使う標準ライブラリ

7. よく使うサードパーティ製パッケージ

8. どうやって学ぶか

インデントでブロック構造

for i in range(10): if i % 5 == 0: print('ham') elif i % 3 == 0: print('eggs') else: print('spam')

対話モード$ python Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> for i in range(10): ... if i % 5 == 0: ... print('ham') ... elif i % 3 == 0: ... print('eggs') ... else: ... print('spam') ... ham spam spam : eggs

バッテリー付属

• 200+ の便利な標準ライブラリ

• http://docs.python.jp/3/library/

豊富な外部パッケージ

• 70,000+ の外部パッケージ

• PyPI: Python Package Index

• http://pypi.python.org/

• 「パイピーアイ」と読むらしい

3. インストール

python.orgからdownload

• Mac, Windowsはインストーラーからどうぞ

• https://www.python.org/downloads/

• WindowsはPATHの設定をお忘れなく

• Linux はそれぞれのパッケージ管理からどうぞ

4. 基本的な言語仕様

今日やること1. Pythonの特徴

2. 言語の特徴

3. インストール

4. 基本的な言語仕様 ← イマココ

5. Python 2と3の違い

6. よく使う標準ライブラリ

7. よく使うサードパーティ製パッケージ

8. どうやって学ぶか

対話モードで数値計算$ python >>> 1 + 1 2 >>> 2 * 3 6 >>> width = 60 >>> height = 90 >>> width * height 5400

文字列とリスト

>>> ‘Hello world' ‘Hello world' >>> "Monty Python's Flying Circus" "Monty Python's Flying Circus" >>> ['Hello', 3] ['Hello', 3]

関数と組み込み関数

>>> def add(a, b): ... return a + b ... >>> add(1, 3) 4 >>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

FizzBuzzで知る言語仕様

• 1から順番に数字を言う

• 3で割り切れる時は「Fizz」と言う(3, 6, 9, …)

• 5で割り切れる時は「Buzz」と言う(5, 10,…)

• 3と5で割り切れる時は「FizzBuzz」と言う(15, 30,…)

FizzBuzzやってみよう

• 1から順番に数字を言う

• 3で割り切れる時は「Fizz」と言う

• 5で割り切れる時は「Buzz」と言う

• 3と5で割り切れる時は「FizzBuzz」と言う

Pythonファイルを実行def fizzbuzz(num): return num

print(fizzbuzz(4))

$ python fizzbuzz.py 4

for: ループ処理def fizzbuzz(num): return num

for num in range(1, 101): print(fizzbuzz(num))

$ python fizzbuzz.py 1 2 3 : 100

if, elif, else: 条件分岐def fizzbuzz(num): if num % 3 == 0 and num % 5 == 0: return 'FizzBuzz' elif num % 3 == 0: return 'Fizz' elif num % 5 == 0: return 'Buzz' else: return str(num)

FizzBuzzの完成$ python fizzbuzz.py 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz : Buzz

その他の言語仕様• データ型

• 文字列の操作

• コレクション

• ファイル操作

• モジュール

データ型

• int: 整数型

• float: 浮動小数点型

• str: 文字列型

• bytes: バイト型

データ型>>> type(1) <class 'int'> >>> type(1.1) <class 'float'> >>> type('日本語') <class 'str'> >>> '日本語'.encode('utf-8') b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e' >>> type('日本語'.encode('utf-8')) <class 'bytes'>

文字列の操作>>> 'Hello World' # シングルクォーテーション 'Hello World' >>> "Hello World" # ダブルクォーテーション 'Hello World' >>> 'Mt.' + 'Fuji' # 文字列の連結 'Mt.Fuji' >>> 'python'[2:5] # スライス 'tho' >>> 't' in 'python' # 文字列の存在チェック True >>> 'pain-au-chocolat'.split('-') # 文字列分割 ['pain', 'au', 'chocolat']

コレクション

• list: リスト

• tuple: タプル

• dict: 辞書

• set: 集合

list: リスト>>> animals = ['cat', 'dog', 'snake'] >>> type(animals) <class 'list'> >>> animals[0] # 要素を取得 'cat' >>> animals[1:] # スライスも使える ['dog', 'snake'] >>> animals.append('elephant') # 要素を追加 >>> for animal in animals: # ループで取り出す ... print(animal) ... cat dog snake elephant

tuple: タプル>>> animals = ('cat', 'dog', 'snake') >>> type(animals) <class 'tuple'> >>> animals[0] # 要素を取得 'cat' >>> animals[1:] # スライスも使える ('dog', 'snake') >>> animals.append('elephant') # 追加はエラー Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'append' >>> 'spam', # 要素が一つのtupleを作成 ('spam',)

dict: 辞書>>> user_info = { ... 'firstname': 'takanori', ... 'lastname': 'suzuki', ... } >>> user_info {'firstname': 'takanori', 'lastname': 'suzuki'} >>> user_info['firstname'] # 要素を取得 'takanori' >>> 'firstname' in user_info # キーの存在チェック True >>> for key, value in user_info.items(): ... print(key, value) ... firstname takanori lastname suzuki

set: 集合>>> {'spam', 'ham'} {'ham', 'spam'} >>> {'spam', 'spam', 'spam'} {'spam'} >>> set1 = {'spam', 'ham'} >>> set2 = {'ham', 'eggs'} >>> set1 & set2 # 集合の積 {'ham'} >>> set1 | set2 # 集合の和 {'ham', 'eggs', 'spam'}

ファイル操作>>> with open('todo.txt') as f: # ファイルを開く ... todo_str = f.read() ... >>> with open('memo.txt', 'w') as f: # 書き込む ... f.write('Hello world\n') ... 12 >>> with open('memo.txt', 'a', encoding='utf-8') as f: # 文字コード指定して追記 ... f.write('こんにちは世界\n') ... 8

モジュールdef add(a, b): return a + b def sub(a, b): return a - b

>>> import calc >>> calc.add(1, 3) 4 >>> from calc import sub >>> sub(5, 2) 3

calc.py

5. Python 2 と 3 の違い

今日やること1. Pythonの特徴

2. 言語の特徴

3. インストール

4. 基本的な言語仕様

5. Python 2と3の違い ← イマココ

6. よく使う標準ライブラリ

7. よく使うサードパーティ製パッケージ

8. どうやって学ぶか

printが文から関数に

>>> print # 空行を出力

>>> print 'Hello Python 2!' Hello Python 2!

Python 2のprint文

Python 3のprint関数>>> print() # 空行を出力

>>> print('Hello Python 3!') Hello Python 3!

文字列がUnicodeに統一Python 2の2種類の文字列

Python 3の文字列は1種類

>>> type('str文字列') <type 'str'> >>> type(u'unicode文字列') <type 'unicode'>

>>> type('str文字列') <class 'str'> >>> type(u'unicode文字列') <class 'str'>

整数の割り算が実数Python 2の整数の割り算の結果は整数(int)

Python 3は浮動小数点数(float)

>>> 4 / 2 2 >>> 1 / 3 0

>>> 4 / 2 2.0 >>> 1 / 3 0.3333333333333333

標準ライブラリの再構成• 名前が変更

• ConfigParser -> configparser

• 統合

• StringIO, cStringIO -> io

• 再構成

• urllib, urllib2, urlparse -> urllib.*

6. よく使う

標準ライブラリ

今日やること1. Pythonの特徴

2. 言語の特徴

3. インストール

4. 基本的な言語仕様

5. Python 2と3の違い

6. よく使う標準ライブラリ← イマココ

7. よく使うサードパーティ製パッケージ

8. どうやって学ぶか

200+ の標準ライブラリ

http://docs.python.jp/3/library/

re: 正規表現>>> import re >>> m = re.search('py(thon)', 'python') >>> m <_sre.SRE_Match object; span=(0, 6), match='python'> >>> m.group() 'python' >>> m.group(0) 'python' >>> m.group(1) 'thon'

sys, os: システムパラメータとOS

>>> import os >>> os.mkdir('spam') >>> os.chdir('spam') >>> os.getcwd() # 現在のディレクトリ '/Users/takanori/hikalab/spam' >>> import sys >>> sys.exit(1)

datetime: 日付と時刻>>> from datetime import datetime, date >>> now = datetime.now() >>> now.isoformat() '2016-01-08T19:31:49.991178' >>> today = date(2016, 1, 12) >>> nextyear = date(2017, 1, 1) >>> delta = nextyear - today >>> delta.days 355

math, random: 数学関数と乱数>>> import math >>> math.pi 3.141592653589793 >>> math.sqrt(2) 1.4142135623730951 >>> import random >>> random.randint(1, 1000) 632 >>> data = ['spam', 'ham', 'eggs'] >>> random.choice(data) 'eggs' >>> random.shuffle(data) >>> data ['spam', 'eggs', 'ham']

itertools: イテレータ生成関数

>>> import itertools >>> list(itertools.chain('ABC', 'DEF')) ['A', 'B', 'C', 'D', 'E', 'F'] >>> list(itertools.combinations('ABCD', 2)) [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]

shutil: 高レベルなファイル操作

>>> import shutil >>> shutil.copytree('src_dir', 'dst_dir') >>> shutil.rmtree('src_dir')

json: JSONエンコーダ、デコーダ

>>> import json >>> data = {'spam': 'SPAM', ... 'ham': True, ... 'eggs': None, ... } >>> json_str = json.dumps(data) >>> json_str '{"eggs": null, "ham": true, "spam": "SPAM"}' >>> json.loads(json_str) {'ham': True, 'eggs': None, 'spam': 'SPAM'}

7. よく使う

サードパーティ製 パッケージ

今日やること1. Pythonの特徴

2. 言語の特徴

3. インストール

4. 基本的な言語仕様

5. Python 2と3の違い

6. よく使う標準ライブラリ

7. よく使うサードパーティ製パッケージ← イマココ

8. どうやって学ぶか

70,000+ の

サードパーティ製 パッケージ

https://pypi.python.org/pypi

pipとvirtualenv

• pip: サードパーティ製パッケージをインストールするためのコマンド

• virtualenv: 独立したPython環境を作る

pip のインストール

$ wget https://bootstrap.pypa.io/get-pip.py $ python get-pip.py $ pip install (package name)

virtualenv のインストール$ pip install virtualenv $ virtualenv venv $ . venv/bin/activate # enter virtualenv (venv)$ which python /Users/takanori/venv/bin/python (venv)$ pip install requests (venv)$ python >>> import requests >>> quit() (venv)$ deactivate # leave virtualenv $ python >>> import requests Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named 'requests'

dateutil: 日時操作の強力な拡張$ pip install python-dateutil

>>> from dateutil.parser import parse >>> parse("Mon Jan 26 20:34:20 UTC 2015") datetime.datetime(2015, 1, 26, 20, 34, 20, tzinfo=tzutc()) >>> parse("2015-01-26 20:34:20 JST") datetime.datetime(2015, 1, 26, 20, 34, 20, tzinfo=tzlocal()) >>> parse("Jan-26-2015") datetime.datetime(2015, 1, 26, 0, 0)

Requests: HTTPクライアント$ pip install requests

>>> import requests >>> url = 'http://connpass.com/api/v1/event/?keyword=python' >>> r = requests.get(url) # URLにアクセス >>> print(r.status_code) # ステータスコードを取得 200 >>> for event in r.json()['events'][:3]: # 先頭3件を取得 ... print(event['title']) # イベントのタイトルを取得 ... Python mini hack-a-thon 夏山合宿 2015 SoftLayer Bluemix Summit 2015 コミュニティ運営の秘訣を知りたい人、『Sync Meetup』に集まれ!!

BeautifulSoup4: HTML, XMLパーサ$ pip install beautifulsoup4

>>> from bs4 import BeautifulSoup >>> import requests >>> r = requests.get('http://docs.python.jp/3/library/') >>> soup = BeautifulSoup(r.content, "html.parser") # HTMLパース >>> toctree = soup.find('div', 'toctree-wrapper') # 目次を取得 >>> links = toctree.find_all('a') # aタグを全て取得 >>> len(links) # リンクの数を取得 358 >>> for link in links[:3]: # 先頭3件を取得 ... print(link.text) ... 1. はじめに 2. 組み込み関数 3. 組み込み定数

Pillow: 画像処理ライブラリ$ pip install pillow

>>> from PIL import Image >>> image = Image.open('sample.jpg') # 画像を読み込み >>> half = (image.size[0] / 2, image.size[1] / 2) >>> half = image.resize(half, Image.ANTIALIAS) # 縮小 >>> half.save('sample-half.jpg') # 画像を保存 >>> rotate = image.transpose(Image.ROTATE_90) # 回転 >>> rotate.save('sample-rotate.png') # PNGで保存

コーディング規約• PEP 0008 -- Style Guide for Python Code

• https://www.python.org/dev/peps/pep-0008/

• pep8: コーディング規約のチェック

• autopep8: 自動的にPEP8形式にする

• flake8: pep8 + ソースコードのチェック

Webフレームワーク

• Django: https://www.djangoproject.com/

• Pyramid: http://docs.pylonsproject.org/en/latest/docs/pyramid.html

• Flask: http://flask.pocoo.org/

• Bottle: http://bottlepy.org/

PyData関連• NumPy: 行列計算

• SciPy: 化学計算

• Pandas: データ操作と処理

• matplotlib: データ可視化

• Chainer: 深層学習

その他

• Sphinx: ドキュメント作成

• Ansible: システム構成管理

• pytz: タイムゾーン情報

• paramiko: SSH2接続

8. どうやって学ぶか

Pythonエンジニア養成読本

• これを買って復習しよう

使えるライブラリを 知りたい!?

• 2015年10月発売

• 定番、便利なライブラリを厳選

• 320ページ、2,880円+税

• http://gihyo.jp/book/2015/978-4-7741-7707-6

Pythonライブラリ厳選レシピ

Web上のテキスト• Pythonチュートリアル

• http://docs.python.jp/3/tutorial/

• Dive into Python 3 日本語版

• http://diveintopython3-ja.rdy.jp/

• Python HOWTO

• http://docs.python.jp/3/howto/

Python使っている人と知りあいたい!?

コミュニティに 参加しよう

PyCon JP 2016

• http://www.pycon.jp/

• Tokyo, Japan

• 秋くらい?

• スタッフも募集しています

• http://pyconjp.blogspot.jp/2015/11/pyconjp2016-staff-entry-open.html

入門者向け• Python入門者の集い

• http://python-nyumon.connpass.com/

• 次回は1月27日(水)

• Start Python Club

• http://startpython.connpass.com/

• 次回は2月8日(月)

女性向け

• PyLadies Tokyo

• http://pyladies-tokyo.connpass.com/

• 定期的にMeetupイベントを実施

• 次回は1月16日(土)

もくもく系• Python mini Hack-a-thon

• http://pyhack.connpass.com/

• だいたい毎月開催

• 1月22日(金)-24日(日)は雪山合宿

• Pythonもくもく会

• http://mokupy.connpass.com/

コミュニティ・イベント情報• connpassのPythonカテゴリ

• http://connpass.com/category/Python/

• PyCon JP Blogのイベント情報

• http://pyconjp.blogspot.jp/search/label/event

• Python Calendar Japan

• https://goo.gl/0UfW1Y

おまけ

Python 3.5の新機能• What’s New In Python 3.5

• http://docs.python.jp/3/whatsnew/3.5.html

• PEP 484 - Type Hints

• https://www.python.org/dev/peps/pep-0484/

def greeting(name: str) -> str: return 'Hello ' + name

まとめ

まとめ

• 復習しよう

• コードを書こう

• コミュニティに飛び込もう

Let’s meet again some-Community!!