Learning Python

Apple - QuickTime - WWDC 2008 Keynote
http://events.apple.com.edgesuite.net/0806wdt546x/event/index.html
iTunes Store Podcast - WWDC 2008 Keynote Adress
http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=26717006&id=275834665

ちょっと遅れましたが、WWDC 2008 基調講演 (Podcast版) を iTunes でダウンロードして見ました。iPhone SDKにも挑戦しているので、iPhone はぜひ購入したいですね!

話は変わりますが、書籍

詳解 Objective-C 2.0

詳解 Objective-C 2.0

を購入しました。

以前、発売されていた

Objective-C Mac OS Xプログラミング

Objective-C Mac OS Xプログラミング

Objective‐C―MacOS Xプログラミング入門

Objective‐C―MacOS Xプログラミング入門

の2冊も持っています。

私は、以前説明されていた重複箇所は読んでいません。おおまかに

CHAPTER 6 ガーベジコレクション
CHAPTER 11 プロコトル
11-04 高速プロコトルと列挙子
CHAPTER 12 宣言プロパティとアクセサ

を読みました。特に11章の ‘高速列挙の実装例’ は大変参考になりました。基本的に

The Objective-C 2.0 Programming Language: Introduction to The Objective-C 2.0 Programming Language
http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html

を読んで理解していることが正しいのか、確認に利用しました。日本語の資料は貴重なので、持っていて損しないと思います。

また、以前ブログ [ id:KYoshiaki:20080413 ] で書いたように

Practical Common Lisp (Books for Professionals by Professionals)

Practical Common Lisp (Books for Professionals by Professionals)

を読んでいる途中だったのですが、前々から Python に興味があったので、洋書

Learning Python

Learning Python

を購入してみました。Python に関しては

みんなのPython

みんなのPython

を読んだ知識しかありませんし、ほとんど忘れてしまいました。

Learning Python (asin:0596513984) は基本を学ぶには最適な本だと思います。

みんなのPython (asin:479733665X) では理解できなかった while 文の else の動作が理解できました。(他の言語では、あまり見かけない動作です。)

while :

if : break
if : continue
else:

の条件が False になり while ループから抜ける時に が実行されます。
が True で break した後 while ループを抜ける場合は は実行されません。

インタラクティブシェル (対話型シェル) を利用して、試すと

>>> x=5
>>> while x:
...     print x
...     x=x-1
... else:
...     print 'exit'
...
5
4
3
2
1
exit
>>> 
>>> x=5
>>> while x:
...     print x
...     x=x-1
...     if x==2: break
... else:
...     print 'exit'
...
5
4
3
>>>

のような動作になります。同様に for 文にも else があります。

また、何度も object reference、変更可能 (mutable)、変更不可能 (immutable) の違いを説明されます。

例えば、インタラクティブシェル (対話型シェル) を使って説明すると

>>> L = [1, 2]
>>> M = L
>>> L = L + [3, 4]
>>> L, M
([1, 2, 3, 4], [1, 2])
>>> 

ここで
L = L + [3, 4]
は、L = [1, 2] + [3, 4] となり、L に新しく作成したオブジェクト [1, 2, 3, 4] を割り当てています。
その結果
L = [1, 2, 3, 4]
M = [1, 2]
になります。

>>> L = [1, 2]
>>> M = L
>>> L += [3, 4]
>>> L, M
([1, 2, 3, 4], [1, 2, 3, 4])

この場合 L += [3, 4] は L、M が参照しているオブジェクトに [3, 4] を追加しているので L、Mの結果は同じ [1, 2, 3, 4] になります。下の append、extend を利用した例も同じ動作です。

>>> L = [1, 2]
>>> M = L
>>> L.append(3)
>>> L.append(4)
>>> L, M
([1, 2, 3, 4], [1, 2, 3, 4])
>>> L = [1, 2]
>>> M = L
>>> L.extend([3, 4])
>>> L, M
([1, 2, 3, 4], [1, 2, 3, 4])
>>> 

Learning Python (asin:0596513984) は暇を見つけて、こつこつ読んでいます。現在、420 ページほど読みました。Practical Common Lisp (asin:1590592395) は最後まで読んでいませんが、Learning Python (asin:0596513984]) は読破したいですね!