2010年12月12日日曜日

移転のお知らせ

移転しました。
http://php6.jp/python

デフォルト引数

関数の引数にはデフォルト値を指定できる。デフォルト値が指定されていれば、引数は指定しなくてもよい。

>>> def multiple(a, b=2):
... return a*b
...
>>> multiple(1)
2
>>> multiple(2)
4
>>> multiple(4)
8
>>> multiple(4,2)
8
>>> multiple(4,4)
16

引数のデフォルト値に可変(Mutable)オブジェクトを指定した場合は毎回同じ値が参照されるので注意。ListやDictionaryを使う場合は要注意
>>> def f(a, L=[]):
... L.append(a)
... return L
...
>>> f(1)
[1]
>>> f(2)
[1, 2]
>>> f(3)
[1, 2, 3]

2010年12月11日土曜日

pass / 何もしない

何も操作をしたくないが構文上の都合で文(statement)が必要なときにはpassを使えばよい。
>>> def func():
...
...
File "", line 3

^
IndentationError: expected an indented block
>>> def func():
... pass
...
>>> func()
>>>

リスト、タプル、ディクショナリ内の値の存在確認

リスト(list)内に要素が含まれているか確認
>>> colors = ("red", "green", "blue")
>>> print "red" in colors
True
>>> print "yellow" in colors
False

タプル(tuple)内に要素が含まれているか確認
>>> numbers = ["zero", "one", "two"]
>>> print "zero" in numbers
True
>>> print "three" in numbers
False

ディクショナリ(Dictionary)のキーに要素が含まれているか確認
>>> monthNames = {1:"Jan", 2:"Feb", 3: "Mar"}
>>> 1 in monthNames
True
>>> 4 in monthNames
False
>>> "Jan" in monthNames
False

ディクショナリ(Dictionary)の値に要素が含まれているか確認
>>> monthNames = {1:"Jan", 2:"Feb", 3: "Mar"}
>>> "Jan" in monthNames.values()
True
>>> "Dec" in monthNames.values()
False
>>> 1 in monthNames.values()
False

GETまたはPOSTで受け取った変数を一覧表示

class MainPage(webapp.RequestHandler):
def get(self):
for key in self.request.arguments():
self.response.out.write(key + "=" + self.request.get(key) + "
")

GQLの実行結果を2個ずつまとめる

#データを取得
sites = db.GqlQuery("SELECT * FROM Site ORDER BY date DESC")

#シンプルな記述/通常はこの記法推奨
for site in sites:
self.response.out.write(site.url+"
")

#インデックスを使ったループ/非推奨
for i in range(0, sites.count()):
self.response.out.write(sites[i].url+"
")

#インデックスを使い2要素ずつ処理/段組などの実装に使う可能性あり
for i in range(0, sites.count(), 2):
for j in range(0, 2):
if i + j >= sites.count():
break
self.response.out.write(sites[i+j].url+" ")
self.response.out.write("
")

#データ構造
class Site(db.Model):
url = db.URLProperty()

2010年12月10日金曜日

self.response.out.writeで数値を出力時の罠

self.response.out.writeの引数に数値の0を指定すると、何も出力されないので注意しましょう。はまりました。

for i in range(0,6):
self.response.out.write(i)
>> 12345

for i in range(0,6):
self.response.out.write(str(i))
>> 012345

セッション処理でエラー発生中

ブラウザによっては問題なく動作しています。あとで原因調査します。

Traceback (most recent call last):
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 515, in __call__
handler.get(*groups)
File "/base/data/home/apps/rapidproxy/1.346766960722169101/main.py", line 34, in get
session = appengine_utilities.sessions.Session()
File "/base/data/home/apps/rapidproxy/1.346766960722169101/appengine_utilities/sessions.py", line 562, in __init__
self.session = _AppEngineUtilities_Session.get_session(self)
File "/base/data/home/apps/rapidproxy/1.346766960722169101/appengine_utilities/sessions.py", line 142, in get_session
ds_session = db.get(str(session_key))
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1318, in get
keys, multiple = datastore.NormalizeAndTypeCheckKeys(keys)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 144, in NormalizeAndTypeCheckKeys
keys = [_GetCompleteKeyOrError(key) for key in keys]
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 2150, in _GetCompleteKeyOrError
key = Key(arg)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore_types.py", line 304, in __init__
raise datastore_errors.BadKeyError('Invalid string key %s.' % encoded)
BadKeyError: Invalid string key agpyYXBpZHByb3h5ciQLEhtfQXBwRW5naW5lVXRpbGl0aWVzX1Nl********.

Pythonのバージョンを調べる

C:\Python25>python -V
Python 2.5.4

2010年12月9日木曜日

dir / オブジェクトが持っている要素を調べる

オブジェクトにどのようなメソッド(関数)があるのか調べる。


>>> dir("hoge")
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir(123)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

コマンドラインからGAEにデプロイ

GUIのインターフェースからだとメールアドレスとパスワードを毎回入力する必要があり面倒。コマンドラインからなら、アカウント情報の入力は一度でよい。

appcfg.py update myapp

GAEに頻繁にデプロイする必要がある場合はコマンドライン推奨。

len / tuple, list, 文字列などの長さを取得

>>> len("hoge")
4
>>> len([1,2,3,4,5])
5
>>> len((1,2,3,4,5,6))
6

2010年10月16日土曜日

更新再開します。

しばらくPython勉強してなかったが、自宅のPCも整備できたので、勉強再開します。