もちろんwhileループだってある。
cnt = 0
while cnt < 10:
print cnt
if cnt >= 6:
break
cnt += 1
break を使えば途中でループを抜け出せる。
実行結果:
^o^ > python while.py 0 1 2 3 4 5 6
takatoh's blog – Learning programming languages.
もちろんwhileループだってある。
cnt = 0
while cnt < 10:
print cnt
if cnt >= 6:
break
cnt += 1
break を使えば途中でループを抜け出せる。
実行結果:
^o^ > python while.py 0 1 2 3 4 5 6
forループは、「for 変数 in シーケンス」という形をしている。シーケンスとはリスト、タプル、文字列の総称みたいなもの。
リストでの例:
>>> for i in [1,2,3,4,5]: ... print str(i) + ":" + "Hello" * i ... 1:Hello 2:HelloHello 3:HelloHelloHello 4:HelloHelloHelloHello 5:HelloHelloHelloHelloHello
タプルの例:
>>> for t in ('Foo', 'Bar', 'Baz'): ... print t ... Foo Bar Baz
文字列でもいける:
>>> for c in "abcde": ... print c ... a b c d e
setだとどうか:
>>> for c in set(['a', 'b', 'c']): ... print c ... a c b
いけた。
Python での条件分岐。これも関数と同じくブロックをインデントであらわしている。
例は引数の大小で出力が変化する。
import sys
num = int(sys.argv[1])
if num < 10:
print "smaller than 10."
elif 10 < num:
print "bigger than 10."
else:
print "just 10."
引数は文字列なのでint関数を使って整数に変換している。
実行結果:
^o^ > python if.py 3 smaller than 10. ^o^ > python if.py 16 bigger than 10. ^o^ > python if.py 10 just 10.
スクリプトのコマンドライン引数は、sys モジュールの argv に格納されている。
import sys
print sys.argv
実行結果:
^o^ > python argv.py foo bar baz ['argv.py', 'foo', 'bar', 'baz']
見てのとおり、sys.argv の最初の要素はスクリプト名で、コマンドライン引数は2番目以降。Rubyと違うのでちょっと注意だな。
いわゆる無名関数。変数に代入して使う。
hello = lambda name: "Hello, " + name + "."
print(hello("Andy"))
実行結果:
^o^ > python lambda.py Hello, Andy.
関数の定義にはdefを使う。
def hamspamfactory(spams, hams):
print "Spam! " * spams
print "Ham! " * hams
hamspamfactory(3, 5)
print "--"
hamspamfactory(hams = 4, spams = 5)
特徴的なのは、関数定義のブロックを表すのにインデントを使うところ。インデントされた部分が関数の中身になる。あと、キーワード引数が使える。
実行結果:
^o^ > python function.py Spam! Spam! Spam! Ham! Ham! Ham! Ham! Ham! -- Spam! Spam! Spam! Spam! Spam! Ham! Ham! Ham! Ham!
引数のデフォルト値を指定することもできる。デフォルト値がある引数は省略が可能。
def foodfactory(times, foodname="Spam! "):
print foodname * times
foodfactory(3)
foodfactory(5, "Egg! ")
実行結果:
^o^ > python function2.py Spam! Spam! Spam! Egg! Egg! Egg! Egg! Egg!
辞書(ディクショナリ)はRubyで言うところのハッシュだと思えばいい。
リテラル表記は{と}で囲み、キーと値は:で区切る。
>>> d = {'a' : 'Andy', 'b' : 'Bill', 'c' : 'Charlie'} >>> d {'a': 'Andy', 'c': 'Charlie', 'b': 'Bill'}
また、dict関数を使って辞書(この場合はコピーになる)、リストのリスト、タプルのリストから作ることもできる。
print "from dictionary (copy):"
d1 = dict({"a":"Andy", "b":"Bill", "c":"Charlie"})
print d1
print "--"
print "from list of list:"
d2 = dict([['a', 'Andy'], ['b', 'Bill'], ['c', 'Charlie']])
print d2
print "--"
print "from list of tuple:"
d3 = dict([('a', 'Andy'), ('b', 'Bill'), ('c', 'Charlie')])
print d3
実行結果:
^o^ > python dict.py from dictionary (copy): {'a': 'Andy', 'c': 'Charlie', 'b': 'Bill'} -- from list of list: {'a': 'Andy', 'c': 'Charlie', 'b': 'Bill'} -- from list of tuple: {'a': 'Andy', 'c': 'Charlie', 'b': 'Bill'}
キーと値を追加するときはインデックスを使って代入すればいいが
>>> d = {'a':'Andy', 'b':'Bill'} >>> d {'a': 'Andy', 'b': 'Bill'} >>> d['c'] = 'Charlie' >>> d {'a': 'Andy', 'c': 'Charlie', 'b': 'Bill'}
削除するときはdel関数を使う。
>>> del d['b'] >>> d {'a': 'Andy', 'c': 'Charlie'}
前のエントリでset型のメソッドをいくつか書いたけど、どれも元のデータを変更しないメソッドだった。
もちろんもとのデータを変更するメソッドもある。
addとremoveがそれ。
>>> s = set([1,2,3,4,5]) >>> s set([1, 2, 3, 4, 5]) >>> s.add(6) >>> s set([1, 2, 3, 4, 5, 6]) >>> s.remove(3) >>> s set([1, 2, 4, 5, 6])
Pythonには次の組み込み型がある。
文字列とユニコード文字列の違いはそのうち。リストはRubyで言う配列、辞書はハッシュだと思えばよさそう。タプルはHaskellにもあるタプルだよね。
boolにはTrueとFalseがある。
で、面白いのはsetという型があること。これはちょっと珍しいと思う。少なくともRubyにもPerlにもHaskellにも(標準では)ない。
set型はset()関数で作れる。
>>> s1 = set([1,2,3,4,5]) >>> s2 = set([4,5,6,7,8]) >>> s1 set([1, 2, 3, 4, 5]) >>> s2 set([8, 4, 5, 6, 7])
set型のメソッドをいくつか:
和集合
>>> s1.union(s2) set([1, 2, 3, 4, 5, 6, 7, 8])
共通集合
>>> s1.intersection(s2) set([4, 5])
差集合
>>> s1.difference(s2) set([1, 2, 3])
対照的差集合(どちらか一方に含まれるもの)
>>> s1.symmetric_difference(s2) set([1, 2, 3, 6, 7, 8])
演算子もある:
>>> s1 | s2 set([1, 2, 3, 4, 5, 6, 7, 8]) >>> s1 & s2 set([4, 5]) >>> s1 - s2 set([1, 2, 3]) >>> s1 ^ s2 set([1, 2, 3, 6, 7, 8])
上の操作では、s1、s2そのものは変化しない。
>>> s1 set([1, 2, 3, 4, 5]) >>> s2 set([8, 4, 5, 6, 7])
さて、ブログを書くのはおよそ3年ぶりというわけだけど、別に3年間何もやってなかったわけじゃなくて相変わらずRubyのスクリプトは書いていたし、Javascriptを触ったり、Perlをかじったりしていた。
で、最近はだいぶ前に買った「みんなのPython」(今見たら2006年の初版だった)を引っ張り出してPythonを触っている。バージョンは 2.7.3。そろそろ主流はPython3に移りつつあるのかもしれないけど、さくらインターネットのPythonも2.7.3だし、まぁ古くてもいいよねってことで。
とりあえずは定番のHello, worldから。
print "Hello, world."
実行結果。
^o^ > python hello.py Hello, world.
[amazonjs asin=”479733665X” locale=”JP” title=”みんなのPython”]