14 Nov 2008

ノート: instant hacking

hetland.org : Instant Hacking

instant hackingという、pythonを使った、プログラム初心者のための、プログラミングのチュートリアルを読んだメモ。

最初 - Loops

Hello world から始まって、条件分岐やループなど。ここら辺は割愛。

Bigger Programs - Abstruction

抽象化の話。あるまとまった手続きをひとまとめにし、名前を付け、その名前で手続きを呼び出せるようにする。そうすることで、いろんな場所で手続きを使いまわせるし、同じことを何度も書く必要がなくなる。これを抽象化という。自前の関数を作ることも、抽象化のひとつである。

例として、小数点以下を切り捨てる関数があげられている。


def floor(number):
    result = 0
    while result <= number:
        result = result+1
    result = result-1
    return result
練習問題
  • ユークリッドの互除法を実装する。
  • ユークリッドの互助法とは、ふたつの整数の最大公約数を求めるアルゴリズム。
    • 整数aとbがある。(a > b)
    • aをbで割り、余りを求める。
      • 余りが0なら、bが最大公約数
      • 余りが0でないなら、aにb、bに余りをいれ、繰り返す
解答例

僕の解答

def gcd(a, b):
    if(a%b == 0)
        return b
    else
        return gcd(b, a%b)

示されていた模範解答

def euclid(a,b):
    while b:
        a,b = b,a % b
    return a

More About Functions

  • 関数を使って抽象化することを、procedual abstructionという
  • procedureとfunctionの違い
    • procedureは値を返さない。functionは返す
  • 関数の副作用的な有用性として、「環境を変化させる」という機能がある。
# The correct, but not-so-good way of doing it
age = 0

def setAge(a):
    global age
    age = a

setAge(100)
print age
# Prints “100”
    • setAgeはグローバル変数ageの値(環境)を変化させている。
  • 一方で、数学の関数のような「純粋な」関数は、
def square(x):
    return x*x
    • 入力値だけに依存している
    • 環境を変化させていない。
  • 1つめの例はprocedureに似ている
    • 値を返さない
    • 環境を変化させる
    • 「名詞」で呼び出す(squareなど)
  • 2つめの例は数学の関数のような(純粋な)関数
    • 値を返す
    • 環境は変化させない
    • 「命令」で呼び出す(setAgeなど)
  • もちろん、この2つは両極端な例で、この中間のような関数がよく使われる。

(この節は、言っていることはわかるんだけど、なぜこの内容にこれだけページを割いているのかがわからない。戻り値がなかったらプロシジャで、あったらファンクションだなんて、それほど大事なこととは思えないんだけど…。そのうち理解できる日がくるのを待つことにする。)

More Ingredients - Data Structure

# Calculate all the primes below 1000
# (Not the best way to do it, but…)

result = [1]
candidates = range(3,1000)
base = 2
product = base

while candidates:
    while product < 1000:
        if product in candidates:
            candidates.remove(product)
        product = product+base
    result.append(base)
    base = candidates[0]
    product = base
    del candidates[0]

result.append(base)
print result
    • range(a, b)はaからbまでの要素を持つリストを返す。要素にはaは含むがbは含まない( つまり、(a, b] )
    • 要素の追加は.append()、削除は.remove()、参照は[index]
    • del somelist[index] で、somelistのindex番目の要素を消す
      • (これは何?関数でもないし、リストのメソッドでもないし、演算子?)
    • 最後はリストのindexingとslicingのはなし。

More Abstraction ― Objects and Object-Oriented Programming

  • オブジェクト指向のはなし
  • こんな風にクラスを作れる
class Oven:
    def insertSpam(self, spam):
        self.spam = spam

    def getSpam(self):
        return self.spam

myOven = Oven()
    • メソッドの第一引数には、必ずselfを入れるのがポイント
    • インスタンスを作るときは、関数みたいに()をつけて変数に代入する

tips

  • 複数の変数に同時に代入
a,b = b,a % b
  • べき乗
radius**2

英語

abstruct
抽象化
prime
素数
ingradient
(重要な)要素