Hatena::Groupfukuoka-py

taketin.py RSSフィード

|

2011-12-07

初めてのPython 10章 Pythonのステートメント 11章 代入ステートメント、式ステートメント、printステートメント 12章 ifステートメント

18:18 | 初めてのPython 10章 Pythonのステートメント 11章 代入ステートメント、式ステートメント、printステートメント 12章 ifステートメント - taketin.py を含むブックマーク はてなブックマーク - 初めてのPython 10章 Pythonのステートメント 11章 代入ステートメント、式ステートメント、printステートメント 12章 ifステートメント - taketin.py

10章 Pythonのステートメント

  • 行の終わりがステートメントの終わり
  • セミコロンで1行に複数のステートメントを記述できる
a = 1; b = 2;  c = 3;
  • 複数行にまたがるステートメントは () [] {} で囲む
if (A == 1 and
    B == 2 and
    C == 3):
        print 'spam'

  • 字下げの終わりがブロックの終わり
if x > y:
    x = 1
    y = 2
  • 複合ステートメントはコロンで1行にまとめる事ができる(ただしボディに複合ステートメントが含まれない場合のみ)
if x > y: x = 1

11章 代入ステートメント、式ステートメント、printステートメント

・代入ステートメント

・代入ステートメントの形式

ステートメント説明
spam = 'spam'基本形
spam, ham = 'yum', 'YUM'タプル代入(代入先は変数、値の位置で決まる)アンパック代入ともいう
[spam, ham] = ['yum', 'YUM']リスト代入(代入先は変数、値の位置で決まる)アンパック代入ともいう
a, b, c, d = 'spam'シーケンス代入
spam = ham = 'lunch'マルチターゲット
spams += 42拡張代入ステートメント

・アンパック代入

L = [1, 2, 3, 4]
while L:
    front, L = L[0], L[1:]
    print front, L

~
1 [2, 3, 4]
2 [3, 4]
3 [4]
4 []

・拡張代入ステートメント

X += Y

等、省略した式の事。上記の例で言うと X = X + Y という式に比べて以下のメリットがある。

  • タイピングが少ない
  • 評価数が少ないので処理が早い
  • 速度の面で有利な操作方法が自動的に選択される(対象が不変性か可変性かで変わる)

変数名に関するルール

  • 先頭は英文字またはアンダースコア、その後は英文字、数字、アンダースコアのいずれか
  • 大文字と小文字は区別される
  • 予約語変数名として使用できない

・名前付けに関する慣例

  • アンダースコア2つで変数名を挟まない (__hoge__ など)
    • システム上特別な意味を持つ為
  • 先頭にアンダースコア1つ付けた名前は使わない(from module import * ステートメントでインポートできない為)
  • 先頭にアンダースコア2つ付けた名前は使わない(使用すると、所属するクラスの名前を付けた名前に自動的に変換される。これをマングリングという)
  • アンダースコア1つだけの名前は付けない(対話型コマンドラインで直前に実行された式の演算結果を保持する為に使われる為)
  • 大文字で始まる名前は通常クラスの名前に使用される為、変数名には使わない
  • モジュール名は小文字にする
  • self は予約語ではないが通常は特別な意味を持つため変数名としては使用しない

・式ステートメント

以下の場合に式をステートメントとして使用する事ができる


・print ステートメント

オブジェクトのデータをテキストに変換して標準出力ストリームに書き出すステートメント


・出力ストリームリダイレクト

標準出力先を変える事で、printステートメントの出力先も変更できる。独自クラスで出力先の挙動を定義する事もできる。その場合は writeメソッドを定義する。

class Hoge:
    def write(self, string):
        # 処理を記述

~

import sys
sys.stdout = Hoge()
print fuga

・>> を使ったリダイレクト

出力ストリームリダイレクトは >> を使う事でもっと簡単にできる

hoge = Hoge()
print >> huge, fuga

12章 ifステートメント

Python には多分岐のステートメントは存在しない(switch〜case文など)。

同様の処理はディクショナリやリストのインデクシングで行う。

>>> choice = 'ham'
>>> print {'spam' : 1.25
...            'ham' :   1.99
...            'eggs' :   0.99
...            'bacon' : 1.10}[choice]
1.99

ディクショナリに適切なキーが存在しないケースに対処するには、has_key メソッド、get メソッド、try ステートメントを使う、等の方法がある。


•ブロックの区切り

  • ブロックの区切りがインデントによって表現される。(インデントが同じになっているステートメントは全て同一のブロックと判定される)

Python のブール演算

  • ブール演算子は and, or, not
  • True, False は 1, 0 のカスタマイズ版である
  • or演算の場合、左から評価され最初にTrueと判定されたオペランドのオプジェクトが返される(ショートサーキット評価)
  • and演算の場合、最初にFalse判定された時点で評価が終了する。True判定された場合は最後に判定されたオペランドが返される。
  • 戻り値としては True, False ではなくオペランドに使われているオブジェクトである、という点が C等の言語と違う部分。但し判定は結局 True, False になるので意味は同じ。

三項演算子

if X:
    A = Y
else:
    A = Z

~

# Python 2.5 以上
A = Y if X else Z

# Python 2.5 以下
A = ((X and Y) or Z) # 但し Y が必ず True であるという前提

又は

A = [Z, Y][bool(X)]
↓
>>> ['f', 't'][bool('')]
'f'
>>> ['f', 't'][bool('spam')]
't'

•ブール演算の応用

X = A or B or C or None

最初に True と評価されたオブジェクトを返す。

Python はあらゆるオブジェクトが True, あるいは False と解釈される。

2011-11-29

初めてのPython 8章リストとディクショナリ, 9章タプル、ファイルオブジェクト、その他

01:38 | 初めてのPython 8章リストとディクショナリ, 9章タプル、ファイルオブジェクト、その他 - taketin.py を含むブックマーク はてなブックマーク - 初めてのPython 8章リストとディクショナリ, 9章タプル、ファイルオブジェクト、その他 - taketin.py

8章 リストとディクショナリ

・リスト

  • シーケンスである
  • 可変性である
  • インデクシング、スライシング、連結等の操作が可能
  • ネストする事で行列(多次元配列

・良く使われるメソッド

  • append()
    • リストの最後に要素を追加する
    • スライシングでも同等の事ができる
      • L.append(X) と L[len(L):] = [X] は同等の処理
      • L + [X] は返り値として新しいオブジェクトを生成して返すものなので違う
  • sort()
    • 標準の比較関数を用い、昇順でソートされる
    • 独自の比較関数引数に渡して使用する事もできる
    • Python2系では型が異なるオブジェクト同士でもソート可能。その場合、アルファベット順でソートされる。(int と str では int が小さい)
    • Python3系では型が異なるオブジェクト同士でソートされた場合、例外が発生する

・ディクショナリ


9章 タプル、ファイルオブジェクト、その他

・タプル

  • シーケンスである
  • 不変性である
  • ネストできる
  • インデクシング、スライシングの操作が可能
  • メソッドはない
  • リテラルの () は省略できる

・ファイル

  • open() 関数で開く。第一引数がファイル名、第二引数がモード
  • close() で明示的に閉じるが、オブジェクトが廃棄されれば自動的に閉じられる。
>>> myfile = open('myfile', 'w')
>>> myfile.write('hello world\n')
>>> myfile.close()

>>> myfile = open('myfile', 'r')
>>> myfile.readline()
'hello world\n'
>>> myfile.readline()
''
# 保存
>>> F = open('datafile.txt', 'w')
>>> import pickle
>>> pickle.dump([1, 2, 3], F)
>>> F.close()

#読み込み
>>> F = open('datafile.txt')
>>> E = pickle.load(F)
>>> E
[1, 2, 3]

リファレンスとコピー

>>> X = copy.deepcopy(Y)

wahyuwahyu2012/06/06 17:51That's an apt answer to an interesitng question

qvaedruoqvaedruo2012/06/07 05:13TCa5us <a href="http://hmnwebsheicz.com/">hmnwebsheicz</a>

maqomhkgszmaqomhkgsz2012/06/07 10:44EmjhbT , [url=http://ghgqtuacwxgc.com/]ghgqtuacwxgc[/url], [link=http://ikwxzlslkfsd.com/]ikwxzlslkfsd[/link], http://tefsgzdyxupy.com/

eewvgqdjeewvgqdj2012/06/12 01:38fHV1Or <a href="http://eidkswqubjtt.com/">eidkswqubjtt</a>

fofzfyfofzfy2012/06/13 07:082544AT , [url=http://xflidjowsadu.com/]xflidjowsadu[/url], [link=http://xcrjobjfmtza.com/]xcrjobjfmtza[/link], http://zxxhprxhksfd.com/

2011-11-28

初めてのPython 5章数値, 6章ダイナミックな型付け, 7章文字列

00:28 | 初めてのPython 5章数値, 6章ダイナミックな型付け, 7章文字列 - taketin.py を含むブックマーク はてなブックマーク - 初めてのPython 5章数値, 6章ダイナミックな型付け, 7章文字列 - taketin.py

5章 数値

気になるとこだけ。


三項演算子

if foo:
    val = bar
else:
    val = baz

val = bar if foo else val = baz

if節を後置する書き方。


・切り捨て演算

x // y

少数部分を切り捨てる


・bool型

True, False は 1, 0 とほぼ同じ。

これはboolクラスのインスタンスであり、boolクラスはintのサブクラスである。

True + 1    # 2
False + 1    # 1

といった式も通る。


6章 ダイナミックな型付け

変数リファレンス

>>> L1 = [1, 2, 3]
>>> L2 = L1    # リファレンスコピー
>>> L1[0] = 0
>>> L2    # 影響を受ける
[0, 2, 3]

~

>>> L1 = [1, 2, 3]
>>> L2 = L1[:]    # 値のコピー
>>> L1[0] = 0
>>> L2    # 影響を受けない
[1, 2, 3]

・同等と同一

>>> L = [1, 2, 3]
>>> M = L
>>> L == M     # 同等であるか
True
>>> L is M     # 同一であるか
True

~

>>> L = [1, 2, 3]
>>> M = [1, 2, 3]
>>> L == M     # 同等であるか
True
>>> L is M     # 同一であるか
False

~

# 小さい値はキャッシュが使用される
>>> X = 42
>>> Y = 42
>>> X == Y     # 同等であるか
True
>>> X is Y     # 同一であるか(キャッシュが使用され、同一とみなされている)
True

※ sysモジュールの getrefcount() メソッドリファレンスカウントを得る事ができる。



7章 文字列

・特徴

  • 不変性のシーケンスオブジェクト
  • シングルクォートとダブルクォートは同じ
  • トリプルクォートで複数行の文字列を作成できる
  • インデクシング、スライシングが利用可能
  • スライシングの引数は3つ指定可能。3つ目はステップ数を示す。
>>> S = 'abcdefghijklmnop'
>>> S[1:10:2]
'bdfhj'
>>> S[::2]
'acegikmo'

・文字列フォーマット

% 演算子を文字列に対して使う場合は Cのsprintfと同じ機能にオーバーロードされている

>>> "my name is %s" % 'taketin'
'my name is taketin'
>>> "%d %s " % (1, 'spam')
'1 spam'

~

# 全てのオブジェクトは文字列への変換が可能
>>> "%s -- %s -- %s" % (42, 3.14, [1, 2, 3])
'42 -- 3.14 -- [1, 2, 3]'

# ディクショナリを使用したフォーマット
>>> "%(n)d %(x)s" % {"n": 1, "x": "spam"}
'1 spam'

>>> reply = """
Hello %(name)s!
Your age squared is %(age)s
"""
>>> values = {'name': 'taketin', 'age': 33}
>>> print reply % values
Hello taketin!
Your age squared is 33

ビルトイン関数 vars() を使うと、その時存在する変数と値を全てディクショナリに入れて返してくれるので上記のようなケースに使える。

>>> name = 'taketin'
>>> age = 33
>>> reply = """
Hello %(name)s!
Your age squared is %(age)s
"""
>>> print reply % vars()
Hello taketin!
Your age squared is 33

・便利なメソッド

  • replace()
  • join()
  • find()
  • split()
  • rstrip()
  • upper()
  • isalpha()
  • endswith()

などなど。シンプルで分かりやすい。


・stringモジュール

python2.0 までは stringモジュールという標準ライブラリに現在の文字列メソッドとほぼ同じものが用意されていた。

現在も後方互換用に stringモジュールは存在する。

NagaNaga2012/06/06 20:17Good point. I hadn't tohguht about it quite that way. :)

nnualyonnualyo2012/06/07 05:31NOdyAn <a href="http://hqxoeaxqhvky.com/">hqxoeaxqhvky</a>

ouludvfouludvf2012/06/08 01:44mudPR0 , [url=http://zwbgzszyeefx.com/]zwbgzszyeefx[/url], [link=http://guciiczuqcpp.com/]guciiczuqcpp[/link], http://gkbdepkefiyo.com/

ojnuriuynojnuriuyn2012/06/12 02:02KD0eOn <a href="http://ubqdclxpowqv.com/">ubqdclxpowqv</a>

vxedycgfptpvxedycgfptp2012/06/13 07:29tEQBYI , [url=http://pqeompbtxzvd.com/]pqeompbtxzvd[/url], [link=http://bdlsteyavifc.com/]bdlsteyavifc[/link], http://csxegvnmjspw.com/

2011-11-23

初めてのPython 3章プログラムの起動方法, 4章ビルトインオブジェクト

13:25 | 初めてのPython 3章プログラムの起動方法, 4章ビルトインオブジェクト - taketin.py を含むブックマーク はてなブックマーク - 初めてのPython 3章プログラムの起動方法, 4章ビルトインオブジェクト - taketin.py

3章 プログラムの起動方法

モジュール

一つのpythonプログラムファイルの事


インポートする

実行するプログラム内にモジュールを読み込む事。

import hoge

インポートは1セッションにつき1回のみ実行される。

hoge.py をインポートした場合、バイトコードファイルhoge.pycが作成される。

ファイルを見つける > コンパイルしてバイトコード化 > 実行


・reload()

インポートされたファイルを同セッション内でもう一度読み込みなおしたい場合はビルトイン関数 reload() を使用。


・ネームスペース

読み込まれたモジュールはネームスペースになる。

hoge.py の中で宣言された変数 fuga にアクセスするには、呼び出しもとから

hoge.fuga

で呼び出す。

また、

from hoge import fuga

とする事で、変数のコピーを取得する事ができ、呼び出しもとから

fuga

で呼び出せる。


4章 Pythonのビルトインオブジェクト

ビルトインオブジェクトリテラル
オブジェクトの型リテラル性質
数値1234, 3.14不変性
文字列'spam', "spam"不変性
リスト[1, [2, 'three'], 4]可変性
ディクショナリ{'food': 'spam', 'taste': 'yum'}可変性
タプル(1, 'spam', 4, 'U')不変性
ファイルmyfile = open('eggs', 'r')-
その他set, type, None, boolなど-
文字列 == シーケンス
s = 'spam'

・操作方法

インデクシング

s[1]          // s
s[-1]         // m

スライシング

s[1:3]       // pa

連結

s + '1'     // spam1

繰り返し

s * 3      // spamspamspam

・トリプルクォートで複数行改行込みの文字列作成

str = '''
Hello
World.
'''

・頭にr添付でraw(生)文字列

str = r'hoge'

・頭にu添付でunicode文字列

str = u'ほげ'

リスト == シーケンス

リスト内包表記

list = [ [1,2,3], [4,5,6], [7,8,9] ]
col2 = [row[1] for row in list]     // [2,5,8]

ディクショナリ == 写像

シーケンスではないので、並びは一定ではない。

一定に取り出したい場合、ソートすればOK。ビルトイン関数 sorted() が便利。

dic = {'name': 'yamada', 'age', 30}
for key in sorted(dic):
    print key, '=>', dic[key]    // name => yamada

指定したキーを保持しているか

if dic.has_key('name'):
    print 'has'

タプル == シーケンス

リストと違い不変性である。


ファイル
f = open('sample.txt', 'w')
f.write('hogehoge')
f.close()

その他の型

ビルトイン関数 set() で作成する集合型など

x = set('spam')
y = set(['h', 'a', 'm'])

x & y    // 交差 set(['a', 'm'])
x | y     // 結合 set(['a', 'p', 's', 'h', 'm'])
x - y    // 差 set(['p', 's'])

・型チェック

if type(x) == type([]):    // 型でチェック
    print 'list'

if type(x) == list:          // 型の名前でチェック
    pritn 'list'

if isinstance(x, list):      // オブジェクト指向的な確認法
    print 'list'

上記方法で型チェックできるが、動的言語通常型チェックは余り行わない。


ユーザ作成クラス

ユーザ定義クラスは、新たな型作成という事もできる。

定義の一例

class Worker:
    def __init__(self, name, pay):
        self.name = name
        self.pay = pay
    def lastName(self):
        return self.name.split()[-1]
    def giveRaise(self, percent):
        self.pay *= (1.0 * percent)



dir() 関数引数オブジェクトを渡せば持っているメソッド全部確認できる

※ help() 関数で PyDoc へアクセスできる

SanjanaSanjana2012/06/06 09:46Short, sweet, to the point, FREE-eaxlcty as information should be!

mwttpbhsghmwttpbhsgh2012/06/06 16:49fIsRZI <a href="http://zdemjrbfbayf.com/">zdemjrbfbayf</a>

uudmpcuudmpc2012/06/07 11:39Zr47Y2 , [url=http://hyapzwuuusux.com/]hyapzwuuusux[/url], [link=http://vzkrbcljabdm.com/]vzkrbcljabdm[/link], http://wayuiynoxcqn.com/

wawrlhmwawrlhm2012/06/07 18:09ITuqFW <a href="http://xzjgddqbbkzd.com/">xzjgddqbbkzd</a>

nntckhnntckh2012/06/07 22:10y2bF5R , [url=http://gpzuqwmkxusm.com/]gpzuqwmkxusm[/url], [link=http://koaazijtnztt.com/]koaazijtnztt[/link], http://nxrdhdjfuzmj.com/

2011-11-19

学習再開、環境構築

23:36 | 学習再開、環境構築 - taketin.py を含むブックマーク はてなブックマーク - 学習再開、環境構築 - taketin.py

2年の時を経て再開します。Python

何もかも忘れてます。


Amazon CAPTCHA

を取りあえず一冊読む事から。


最近の動向

Macにpythonbrew+virtualenvでPython環境を作ってみた - ぱせらんメモ

によると、

pythonbrew による複数のPythonバージョン管理

virtualenv による複数の環境管理

が流行りらしいです。


手持ちの macbookair OSX10.7.2 に環境作ります。


curl -kLO https://github.com/utahta/pythonbrew/raw/master/pythonbrew-install
chmod +x pythonbrew-install
./pythonbrew-install

で pythonbrew 入れました。

2系と3系とありますけど、良く使われてるのは2系の最終版である2.7.2なんでしょうか?


pythonbrew install 2.7.2

したけどいきなりエラーになりましたよ。

build.log 見ましたよ。


326 tests OK.

2 tests failed:

test_ctypes test_platform

24 tests skipped:

test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp

test_codecmaps_kr test_codecmaps_tw test_curses test_dbm_gnu

test_epoll test_gdb test_largefile test_msilib test_ossaudiodev

test_smtpnet test_socketserver test_startfile test_timeout test_tk

test_ttk_guionly test_urllib2net test_urllibnet test_winreg

test_winsound test_xmlrpc_net test_zipfile64

Those skips are all expected on darwin.

make: *** [test] Error 1


とかなってて、make test でエラーになってる?

とりあえず勧められるがままに --force オプションつけて入れましたよ。

ここは気持ち悪いとこですがひとまず置いておきます。


Pythonのおさらい(初めてのPython 1章〜2章 読んだ)

Python実行するとインタプリタはまずバイトコードコンパイルする。

Pythonプロセスに書き込み権限あれば .pyc ファイルが生成される。

これがあればもとの .py 無くても動作可能。

逆を言うと書き込み権限無ければ毎回 Pythonコードをバイトコードコンパイルするので効率悪い。

バイトコードはPVM(PythonVirtualMachine)と呼ばれるランタイムエンジンで実行される。

このあたりはインタプリタ内部の動作なので意識する必要無し。

フローズンバイナリと呼ばれる、PVMとバイトコードをまとめた実行形式ファイルを作る事もできる。


エディタについて

今まで仕事でPHPをメインに書いてきて、マシンがwindowsだった事もありエディタ秀丸使ってましたよ、ええ。

それから iPhone開発もやったりして、Xcode使ってますよ。


VimEmacs どっちもかじってみてるけどどっちかに倒錯してるわけでも無い。未だ無宗教

なのでとりあえず手っ取り早く弄れる Vim でまずは触って行く事にする。


Pythonを快適に編集できるようvimを設定する - 玉虫色に染まれ!

ここを参考にインデントの設定。


とまあ、こんな感じで環境整えて2年振りに再開したわけです。

続く。

RodRod2012/06/08 13:28There's nothing like the relief of fidnnig what you're looking for.

jvpbfrqdrjvpbfrqdr2012/06/11 06:26yAQ7P8 , [url=http://usuabkkzjozo.com/]usuabkkzjozo[/url], [link=http://vojuivtwqobz.com/]vojuivtwqobz[/link], http://mtaxicrclmxg.com/

vghgghsvghgghs2012/06/13 12:32tQoWRg , [url=http://kzqljdvqxwex.com/]kzqljdvqxwex[/url], [link=http://kotdtdzvaiyy.com/]kotdtdzvaiyy[/link], http://tapfuvvzkjel.com/

|