コマンドライン引数

スクリプトのコマンドライン引数は、sys モジュールの argv に格納されている。

import sys

print sys.argv

実行結果:

^o^ > python argv.py foo bar baz
['argv.py', 'foo', 'bar', 'baz']

見てのとおり、sys.argv の最初の要素はスクリプト名で、コマンドライン引数は2番目以降。Rubyと違うのでちょっと注意だな。

関数

関数の定義には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

前のエントリで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には次の組み込み型がある。

  • 整数
  • 浮動小数点
  • 文字列
  • ユニコード文字列
  • リスト
  • タプル
  • 辞書(ディクショナリ)
  • set(集合)
  • bool(真偽値)

文字列とユニコード文字列の違いはそのうち。リストは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])

Pythonはじめた

さて、ブログを書くのはおよそ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”]