ノート: 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のはなし。
- list[-n]だと後ろからn番目の要素
- list[2:4]だと、2番目から4番目の2要素
- この辺の話は、An Informal Introduction to Python ― Python v2.6 documentationに詳しい。stringとlistの節を参照
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
- (重要な)要素