ひのきのぼうだけで
             全クリを目指す
        kyoto.py Python勉強会 in 高槻



@a rom a_bl ack (t ty170)
お前誰よ?
名前 : aroma_black

 最近tty170とかも使ってる

所属 : 某SIerのSE兼PG

 主に技術的課題解決要員

Pythonはシェルスクリプト覚えるのが嫌で
使い始めました
お断り



今日はPython2.7のはなしです

Python3.x? なにそれおいしいの?
装備品の紹介


ひのきのぼう

標準ライブラリ
http://www.python.jp/doc/release/library/
Pythonの標準ライブラリ


batteries included(電池付属)という哲学で
作られた
http://www.python.org/dev/peps/pep-0206/

すぐに使える強力(?)かつ多彩なライブラリ
Stage 1


敵全体攻撃

コレクションクラスを操作してみる

プログラミングの基本
itertools
  いっぱいあるのでドキュメントを参照

    イテレータやジェネレータを返すので
    リスト内包表記を組み合わせて使うと
    少ない行数で書ける

>>> from itertools import ifilter
>>> foobar = ['1', '2', 'foo', '4', 'bar']
>>> [e for e in ifilter(lambda x: x.isdigit(), foobar)]
['1', '2', '4']
Stage 2

仲間を増やす

シェルスクリプト的なものを作ってみる
(その時にあると便利なもの)

引数の解析って面倒臭いよね
argparse
    コマンドラインオプションの解析器

    optperseの後継
import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)
argparse
実行結果
  $ prog.py -h
  usage: prog.py [-h] [--sum] N [N ...]

  Process some integers.

  positional arguments:
   N           an integer for the accumulator

  optional arguments:
   -h, --help show this help message and exit
   --sum       sum the integers (default: find the
  max)
Stage 3



てきをあやつる

Pythonからファイル操作を簡単に行う
shutil
いっぱいあるのでドキュメント参照

ファイル操作はos, os.pathモジュールも
よく使います
 import os, shutil

 for root, dirs, files in os.walk(‘.’):
     for filename in files:
         if filename.endswith(‘.py’):
             pyfile = os.path.join(root, filename)
             shutil.copyfile(pyfile, “./pyfiles”)
Stage 4


強敵エクセルのおともだち、CSV

CSVファイルの読み書き

仕事でよく使うよね?
csvパッケージ
読み込み   import csv
       with open('some.csv', 'rb') as f:
           reader = csv.reader(f)
           for row in reader:
               print row

書き込み
       import csv
       with open('some.csv', 'wb') as f:
           writer = csv.writer(f)
           writer.writerows(someiterable)




すこし弄ればTSVとかも読めます
Stage 5



酒場で情報収集

Webスクレイピング
urllib2
   HTMLソースを取得するコードを3行で頼む

>>> import urllib2
>>> f = urllib2.urlopen('http://www.python.org/')
>>> print f.read(100)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//
EN">
<?xml-stylesheet href="./css/ht2html
Stage 6

試練の時

xUnit系のパッケージ付属

ドキュメントにテスト可能なコードも書ける
簡易的なdoctestというモジュールもある
unittest
xUnit系のテスティングモジュール
 import random
 import unittest

 class TestSequenceFunctions(unittest.TestCase):

     def setUp(self):
         self.seq = range(10)

     def test_sample(self):
         with self.assertRaises(ValueError):
             random.sample(self.seq, 20)
         for element in random.sample(self.seq, 5):
             self.assertTrue(element in self.seq)

 if __name__ == '__main__':
     unittest.main()
unittest
さっきのテストの実行結果


 .
 -------------------------------------------------------
 ---------------
 Ran 1 tests in 0.000s

 OK
doctest
対話シェルのコードを貼付けるだけ

docstringにも埋め込める
    def add(n, m):
        """Return n + m.

        >>> add(1, 2)
        3
        """
        return n + m

    if __name__ == "__main__":
        import doctest
        doctest.testmod()
doctest
異常が無ければ何も表示されない

異常があったときはエラーが表示される
 ***************************************************
 File "add.py", line 6, in __main__.add
 Failed example:
      add(1, 2)
 Expected:
      4
 Got:
      3
 ***************************************************
 1 items had failures:
    1 of    1 in __main__.add
 ***Test Failed*** 1 failures.
Stage Ex


エイリアンと戦う

関数言語的な機能を使ってみる

関数型言語使ってみたいけど敷居高そう...
functools
関数の部分適用
  >>> from functools import partial
  >>> basetwo = partial(int, base=2)
  >>> basetwo.__doc__ = 'Convert base 2 string to
  an int.'
  >>> basetwo('10010')
  18




応用すればカリー化とかもできる...はず
クリアできないとき....



そんな時は先人達の知恵をかりましょう。
つよくてニューゲーム

標準ライブラリだけでクリアする
と言ったなあれは嘘だ

PyPIと呼ばれるパッケージ管理サイト
http://pypi.python.org/pypi

RubyのRubyGems, PerlのCPANに相当
パッケージ管理ツールpip

パッケージを自動でインストールしてくれる
優れもの

easy_install は衰退しました

Python3対応
installing pip

前準備としてdistributeをインストール
http://python-distribute.org/distribute_setup.py

pipをダウンロード
http://pypi.python.org/pypi/pip/

展開してディレクトリの中で
$python setup.py install
pipの基本的な使い方
パッケージのインストール

  pip install package_name
パッケージのアンインストール

  pip uninstall package_name
パッケージの検索

  pip search package_name
http://www.pip-installer.org/en/latest/index.html
virtualenv


仮想的な実行環境を作る為のツール

アプリケーション間で依存するパッケージの
のバージョンの分離とか
virtualenvの基本的な使い方



PyPIにドキュメントがあるのでどうぞ!
http://pypi.python.org/pypi/virtualenv
virtualenv wrapper


virtualenvをシェルで使いやすくする為のツール
http://pypi.python.org/pypi/virtualenvwrapper/

Windowsな人はvirtualenv-win
https://github.com/davidmarble/virtualenvwrapper-win/
virtualenv wrapperの(ry



さっきのPyPIのサイトをどうぞ!
それでも倒せない



レベルを上げて物理で殴ればいい

たまには人に聞くなどもしてみては?
まとめ
Pythonの標準ライブラリは強力

 きんのひのきのぼう

今日紹介したPython標準ライブラリは一部です

 スイスの十得ナイフと言われているらしい

 ドキュメント眺めると新たな発見がある
 かも?
ご清聴ありがとうございました

ひのきのぼうだけで全クリ目指す