Tag/Python
pythonを勉強中 vol.7
今日もPythonを勉強。
基本的な事しかしてませんが・・・
知識に成れば良い!
ってことで、
前回やったリストなんかと同じ「オブジェクトの集合」の
「タプル」
これって本を読んでると、
ん?
リストがあるから要らなくね?
って思ってたのが大間違い。。。
不変性ようは変更不能です。
これ大事っすね。
後は、
メソッドがない。
しかしシーケンスオブジェクトなので、
下記のような操作は出来る。
>>> (1,2)+(3,4)
(1, 2, 3, 4)
>>> (1,2)*4
(1, 2, 1, 2, 1, 2, 1, 2)
>>> x = (1,2,3,4,5)
>>> len(x)
5
しかし、
>>> y = [1,2,3,4,5]
>>> y.reverse()
>>> y
[5, 4, 3, 2, 1]
こういうのは出来ないので、
>>> x.reverse()
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'tuple' object has no attribute 'reverse'
って怒られる。
なので、
一度タプルをリストに変換してから、
ソートやリバースする。
>>> l =list(x)
>>> l.sort()
>>> l
[1, 2, 3, 4, 5]
>>> l.reverse()
>>> l
[5, 4, 3, 2, 1]
それからタプルに変換する。
>>> t = tuple(l)
>>> t
(5, 4, 3, 2, 1)
おぉ〜戻ったっす。
後はタプルで大事そうな事が書いてあった。
リストはディクショナリのキーになれないが、
タプルはなれる。
これも覚えておかないとなぁ〜。
- Posted at:
- 2007/12/10 22:17:53
- 0 Comments
- 0 TrackBacks
- Tags:
- Python
- Trackback:
- http://kishi-r.com/2007/12/10/python_vol7/trackback/
pythonを勉強中 vol.6
オブジェクトの集合のリスト
これもかなり頻繁に使うものだなぁ〜。
Pythonの基礎からで無く、
いきなりDjangoをやっているから
細かい事が解っていないと思うので
これも勉強しておく事にする。
リストとは
オブジェクトを一定の順序で並べたもの
と「初めてのPython」にも書かれている。
つまり左から右へ一定の順序で並べられたオブジェクトの集合。
二次元配列(リストのネスト)も作れる。
例えば通常リストを書くと下記のようになる。
>>> x = [1,2,3]
二次元配列で書く場合は下記になる。
>>> y = [[1,2,3],[4,5,6],[7,8,9]]
ふむふむ。
長さも確認してみる。
>>> len(x)
3
>>> len(y)
3
連結もしてみる。
>>> z = x + y
>>> z
[1, 2, 3, [1, 2, 3], [4, 5, 6], [7, 8, 9]]
今度はインデックス指定
>>> z[0]
1
>>> z[4]
[4, 5, 6]
スライシングで変更してみる。
>>> z[0:4]='hoge'
>>> z
['h', 'o', 'g', 'e', [4, 5, 6], [7, 8, 9]]
>>> z[0:4]=['hoge','hige']
>>> z
['hoge', 'hige', 'hoge', [7, 8, 9]]
次はソートしてみる。
>>> z.sort()
>>> z
[[7, 8, 9], 'hige', 'hoge', 'hoge']
リストに1つだけオブジェクトを追加する。
>>> z.append('more')
>>> z
[[7, 8, 9], 'hige', 'hoge', 'hoge', 'more']
末尾に要素を削除する。
>>> z.pop()
'more'
>>> z.pop()
'hoge'
末尾に要素を追加する。
>>> z.extend([1,2,3])
>>> z
[[7, 8, 9], 'hige', 'hoge', 1, 2, 3]
要素の順書を逆転させる。
>>> z.reverse()
>>> z
[3, 2, 1, 'hoge', 'hige', [7, 8, 9]]
特定の要素の削除
>>> del z[0]
>>> z
[2, 1, 'hoge', 'hige', [7, 8, 9]]
こう実際に試しているとPythonっていいなぁ〜って
思えてくる。
組み込みの関数がデフォルト充実しているなぁ〜。
今度はDjangoでは無く、
Pythonでテンプレートエンジンを使って、
何か軽く作ってみたいな。
![]() | 初めてのPython 第2版 オライリージャパン(2004-11)
オライリージャパン 新品価格:¥ 5,040 中古価格:¥ 4,100 ASIN:4873112109 |
- Posted at:
- 2007/12/08 23:07:04
- 0 Comments
- 0 TrackBacks
- Tags:
- Python
- Trackback:
- http://kishi-r.com/2007/12/08/python_vol6/trackback/
pythonを勉強中 vol.5
昨日は子供が怪我をしてしまい、
午後8時くらいから看病をしながら、
一緒に寝てました。
本当は寝付いたら、
起きて勉強したりするはずだったのに
起きたら朝6時だったorz
ビックリ!ってか起こしてよ。。。
そんなこんなで、
Pythonを勉強中vol.5
今日は
「raise」
をやってみる。
こいつの役割は、
「初めてのPython」を見てみると
プログラムの中で例外を故意に発生させる場合に使用する
ってな事が書いてある。
書き方が下記の通り
・ raise name
・ raise name, data
・ raise
実際にやってみる。
>>> try:
... raise IndexError, 'hoge'
... except IndexError:
... print 'index error'
... raise
...
index error
Traceback (most recent call last):
File "", line 2, in
IndexError: hoge
raiseで何も指定しない場合は、
直近(この場合では、raise IndexError, 'hoge')の例外を
発生させる事が出来る。
よってexceptブロックで捕まえているが、
そこの例外を処理していないのが解った。
その場合、raise IndexError, 'hoge'で
指定したデータ「hoge」が渡されているのも解った。
なるほどね。
「raise」以外にも「assert」も例外を故意に発生させるらしいので、一緒にやってみた。
書き方は下記の通り
assert test, data
これは、「raise」を使用した場合の下記と同じである。
if __debug__:
if not test:
raise AssertionError,
ん?
これはつまり if で test がFalseの場合にAssertionErrorって事かな?
なるほど。
こんな感じ
>>> x = 2
>>> assert x < 1, 'x must be negative'
Traceback (most recent call last):
File "", line 1, in
AssertionError: x must be negative
AssertionError: x must be negativeになってる。
ほぉ〜。
つまりxは2であり、1よりも大きいため例外処理の対象となっている。
assertは、
プログラマが自ら定めた条件が満たされているかを確かめるためのもの
らしいっす。
まぁ〜確かにタイプミスとかは自動的に検出されるから、
別にassertで例外処理をする必要もないもんね。
![]() | 初めてのPython 第2版 オライリージャパン(2004-11)
オライリージャパン 新品価格:¥ 5,040 中古価格:¥ 4,100 ASIN:4873112109 |
- Posted at:
- 2007/12/08 00:12:21
- 0 Comments
- 0 TrackBacks
- Tags:
- Python
- Trackback:
- http://kishi-r.com/2007/12/08/python_vol5/trackback/
Pythonを勉強中 vol.4
いや〜Lingrが繋がらない。。。
さて今日もPythonをやります。
今日は「try catch」です。
みんなのPythonには掲載されていなかったので、
以前yoshukiさんに頂いた「初めてのPython」を参考にしました。
これは例外処理なんかに使われる。
PHPにもありますね。
try、throw、catch
これは4には無く、5から追加された予約語っす。
Pythonでは、
try、except、else、finaly
っすね。
基本は、
try:
action()
except NameError:
.....
except TypeError:
.....
except:
.....
else:
.....
こんな感じらしい。
※初めてのPythonから引用っす。
気をつける事は、
elseの解釈と例外名を指定しないexceptですね。
簡単に自分の中で解釈すると、
まずは、例外が発生しなかった場合
1. tryでaction()を実行
2. 例外が発生しないので、elseを実行
次に指定した例外以外の例外が発生した場合
1. tryでaction()を実行
2. exceptを実行
※この場合elseは実行されない
最後にNameErrorが発生した場合
1. tryでaction()を実行
2. except NameErrorを実行
こんな感じかな?
elseはtryブロックの中に書くという方法もあるみたい
こんな感じ
try:
action()
# ここへelseの場合の処理を記述
except NameError:
.....
except TypeError:
.....
except:
.....
なるほどなぁ〜。
実際にやってみる。
>>> def type(x, y):
... print x + y
...
>>> try:
... type([0,1,2], "hoge")
... except NameError:
... print "NameError"
... except TypeError:
... print "TypeError"
... else:
... print "Complete"
...
...
TypeError
TypeErrorが発生されたので、
例外名TypeErrorを実行した。
exceptには4つ書き方があるみたい。
・except 例外名:
・except 例外名, value:
・except (例外名, 例外名):
・except (例外名, 例外名), value:
後は、finally
こいつはいわゆる「後処理」に使用されるみたい。
例えば、
ファイルを扱う処理の場合に必ずファイルをクローズするなど。
確かに必要。
このtryでの例外処理と一緒に使用されるのが、raise。
こいつもまた試してみないとなぁ〜。
![]() | 初めてのPython 第2版 オライリージャパン(2004-11)
オライリージャパン 新品価格:¥ 5,040 中古価格:¥ 4,100 ASIN:4873112109 |
- Posted at:
- 2007/12/04 22:18:58
- 0 Comments
- 0 TrackBacks
- Tags:
- Python
- Trackback:
- http://kishi-r.com/2007/12/04/python_vol4/trackback/
django-wordpress-adminを使ってみる
以前書いた記事
「MovableTypeのバックアップ」
にtokibitoさんからコメントを頂き知った
「django-wordpress-admin」
こいつを使って、
今のMovableTypeのブログをDjangoへ
移行しようと考えてみました。
django-wordpress-adminは
GoogleCodeで公開されています。
ここからどうぞ
でdjango-wordpress-adminの中身は、
django-wordpress-admin-read-only/
readme.txt
wordpress/
__init__.py
__init__.pyc
models.py
models.pyc
views.py
内容としては、
models.pyがWordPressのDB構成で書かれている。
実際に試してみた。
とりあえずは、
1. MovableTypeがDBを使っていないため、テキスト形式でバックアップ。
2. WordPressをインストール
3. MovableTypeのバックアップファイルをWordPressのDBへインポート
これすごい!ちゃんとインポートされる。すごく気持ちがいいw
4. WordPressに入れたデータをmysqldumpする。(CREATE文が入っているもの)
5. Djangoでプロジェクトを作成(今回は仮でweblogとする。)
6. アプリケーションを作成(今回は仮でblogとする。)
この後、
django-wordpress-admin-read-only/wordpress/以下をモデルの下へコピーし、
settings.pyでINSTALLED_APPSに「6」で追加したアプリケーションblogを追加。
他にもadminなんかも追加しておくので、
settyngs.pyのINSTALLED_APPSは下記のようになる。
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.markup',
'django.contrib.admin',
'weblog.blog',
)
それからsyncdbを叩くと、DBがちゃんと作成されない。。。。。
./manage.py sql blog
で確認してもちゃんとCreateTableしているのに。。。
で何が足りないか?
・ テーブル(wp_post2cat)
・ wp_postsテーブルのカラム(comment_status)
・ wp_postsテーブルのカラム(ping_status)
・ wp_postsテーブルのカラム(post_status)
・ wp_postsテーブルのカラム(post_password)
これが足りないorz
なので、
INSTALLED_APPSへはアプリを追加せずに実行する。
7. 「6」で追加したアプリケーションをコメントアウト
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.markup',
'django.contrib.admin',
# 'weblog.blog',
)
8. 先ほどsyncdbをしたので、一度DBをドロップしてから再作成。
9. mysqldumpをDBへ流し込む。
※ CREATE文が入っているものであれば、models.pyと同期が取れるので。
10. 「7」でコメントアウトしたアプリケーションのコメントアウトを外す。
11. django-wordpress-admin-read-only/readme.txtに書いてある通りにテーブル名を変更する。
ALTER TABLE `blog`.`wp_post2cat` RENAME TO `blog`.`wp_posts_categories`;
ALTER TABLE `blog`.`wp_link2cat` RENAME TO `blog`.`wp_links_categories`;
12. models.pyも11に伴い変更する。
47行目
categories = models.ManyToManyField(Category, db_table=u'%swp_link2cat' % WP_PREFIX, filter_interface=models.HORIZONTAL)
を下記に変更する。
categories = models.ManyToManyField(Category, db_table=u'%slinks_categories' % WP_PREFIX, filter_interface=models.HORIZONTAL)
122行目
categories = models.ManyToManyField(Category, db_table=u'%swp_post2cat' % WP_PREFIX, filter_interface=models.HORIZONTAL)
を下記に変更する。
categories = models.ManyToManyField(Category, db_table=u'%sposts_categories' % WP_PREFIX, filter_interface=models.HORIZONTAL)
これでadminへログインしてデータを確認する。
ちゃんと管理側でも確認出来た♪
後はviews.pyやテンプレートを作成すればOK.
でもWordPressをそのまま使えばって思うが、
Djangoで作ってみたい!!!ので作成する事に決定w
- Posted at:
- 2007/12/03 21:54:01
- 0 Comments
- 0 TrackBacks
- Trackback:
- http://kishi-r.com/2007/12/03/djangowordpressadmin/trackback/
Pythonを勉強中 vol.3
一日一つやっていこうと思っている、
「Python」の勉強のvol.3
今日は、
「for」を使って遊んでみる。
実際にどんな動きをするかを確認すると、
おもしろいなぁ~。
>>> x = ['dog', 'cat', 'lion']
>>> y = ['cow', 'pig', 'elephant']
>>> for i in x:
... i + '.jpg'
...
...
'dog.jpg'
'cat.jpg'
'lion.jpg'
こんな感じでやってみた。
次に連想配列的なものをやってみる。
>>> k = {}
>>> for i in range(len(x)):
... for j in range(len(y)):
... if (i == j):
... k[i] = x[i], y[j]
...
...
>>> k
{0: ('dog', 'cow'), 1: ('cat', 'pig'), 2: ('lion', 'elephant')}
for i in range(len(x)):よりもfor i, j in enumerate(x):
って書いたほうがオシャレらしい。
実際にやってみた。
>>> h = {}
>>> for i, j in enumerate(x):
... for k, l in enumerate(y):
... if i == k:
... h[i] = j, l
...
...
>>> h
{0: ('dog', 'cow'), 1: ('cat', 'pig'), 2: ('hige', 'hoge')}
おもしろい、おもしろい。
このままやればソースも読めるようになるだろう。
![]() | みんなのPython ソフトバンククリエイティブ(2006-08-22)
新品価格:¥ 2,940 中古価格:¥ 1,800 ASIN:479733665X |
- Posted at:
- 2007/12/03 12:57:24
- 0 Comments
- 0 TrackBacks
- Tags:
- Python
- Trackback:
- http://kishi-r.com/2007/12/03/python_vol3/trackback/
Pythonを勉強中 vol.2
今日は、
PHPには無い「lambda」を使ってみた。
これはおもしろい。
lambda 引数のリスト : 引数を使った式
がlambdaの書式。
※サンプルのコードは「みんなのPython」から抜粋
実際に試すにあたって、
lambdaを使わない場合が下記
>>> def cmp_len(a, b):
... return cmp(len(a), len(b))
...
>>> l = ["123", "12345", "12"]
>>> l.sort(cmp_len)
>>> l
['12', '123', '12345']
ちゃんとソートされている。
次にlambdaを使ってみる。
>>> l = ["123", "12345", "12"]
>>> l.sort(lambda a, b : cmp(a, b))
>>> l
['12', '123', '12345']
すげぇ〜1行で書ける。
みんなのPythonには下記の事が書かれていた。
便利だが可読性が悪い
ふむふむ。
ソートのように関数名を添える処理で利用し、
プログラムを簡潔に表記する目的で使われる。
なるほどね。
でもこれ使えたらかなり便利だと思うなぁ〜。
ちなみに今回使った関数で「cmp」というのがある。
これは、
第1引数と第2引数を比較する関数。
第1引数が小さい場合は、「-1」を返す。
両方の引数が等しい場合は「0」を返す。
第1引数の方が大きい場合は、「1」を返す。
ってかあらゆるオブジェクトが比較出来るみたい。
これもいいなぁ〜。
これは初めてのPythonに記述されていたっす。
やってみた。
>>> x = "dog"
>>> y = "lion"
>>> z = "cat"
>>> cmp(x, y)
-1
>>> cmp(y, x)
1
>>> cmp(x, z)
1
>>> cmp(len(x), len(z))
0
こんな感じ。
なるほど。
![]() | みんなのPython ソフトバンククリエイティブ(2006-08-22)
新品価格:¥ 2,940 中古価格:¥ 1,800 ASIN:479733665X |
- Posted at:
- 2007/12/02 23:25:08
- 0 Comments
- 0 TrackBacks
- Tags:
- Python
- Trackback:
- http://kishi-r.com/2007/12/02/python_vol2/trackback/




