Pythonを始めよう

別にみんぱい買ったというわけでもないんですが、学校のPCにpython入ってるし暇なので今からpythonの入門を始めます。でも手元にあるのは「やさしいLisp入門」…
とりあえず対話モードでHello, World!

>>> print "Hello, World!"
Hello, World!

ほげほげ。次リスト。これ何だろうと思ったらスライスだった。

>>> a = [1,2,3]
>>> a[:0]
[]
>>> a[:1]
[1]
>>> a[:2]
[1, 2]
>>> a[:3]
[1, 2, 3]
>>> a[0:]
[1, 2, 3]
>>> a[1:]
[2, 3]
>>> a[2:]
[3]
>>> a[3:]
[]
>>> a[1:0]
[]
>>> a[1:1]
[]
>>> a[1:2]
[2]
>>> a[1:3]
[2, 3]
>>> a[:-2]
[1]
>>> a[:-1]
[1, 2]
>>> a[1:-1]
[2]
>>> a[:2] = ["hoge"]
>>> a
['hoge', 3]
>>> a[:]
['hoge', 3]

rangeとかあるらしい。あー、Pythonはリスト操作が中心なのかな。

>>> range(3,4)
[3]
>>> range(3,2)
[]
>>> range(3,9)
[3, 4, 5, 6, 7, 8]
>>> range(3,0)
[]
>>> range(-1,0)
[-1]

関数定義。インデントしないとエラー。めんどくさい。

>>> def add(x, y):
...     return x + y
...
>>> add(1,3)
4

引数渡すときはカッコが絶対必要。なんてまともな言語なんだ。あれ、printは要らなかった気がするぞ…関数じゃないのかな。
キーワード引数がある。いらない。

>>> def add(x='x', y='y'):
...     return x+y
...
>>> add(y=3,x=1)
4

デフォルト引数あるんだろうか…

>>> def add(x=0, y=0):
...     return x+y
...
>>> add()
0

ある。キーワード引数とデフォルト引数一緒に使えるのかな。

>>> def add(x='x'=0, y='y'=0):
  File "<stdin>", line 1
    def add(x='x'=0, y='y'=0):
                 ^
SyntaxError: invalid syntax
>>> def add(x=0='x', y=0='y'):
  File "<stdin>", line 1
    def add(x=0='x', y=0='y'):
               ^
SyntaxError: invalid syntax

無理らしい。あれ、デフォルト引数が文字列だったらどうなるんだろう…

>>> def hoge(x = 'x'):
...     return x
...
>>> hoge()
'x'
>>> hoge(3)
3
>>> hoge(x=2)
2

デフォルト引数が文字列だったら特別扱いって感じなのかなあ。
次可変個引数。

>>> def hoge(*args):
...     n = 0
...     for x in args:
...             n += x
...     return n
...
>>> hoge(1,3,5,7,9)
25

for文書くのに苦労した。基本的に文の終わりには「:」が必要らしい。めめめめんどくさい。
無名関数あるのかなと思ったらあるらしい。lambda!lambda!

>>> noname = lambda x,y: x + y
>>> noname(3,5)
8

分かりやすい。
どうやらただの構文糖らしい。ということはdefによる関数定義も関数オブジェクトを返す?

>>> def add(x, y):
...     return x + y
...
>>> f = add
>>> f(3,5)
8

ok

>>> x = def add(x, y):
  File "<stdin>", line 1
    x = def add(x, y):
          ^
SyntaxError: invalid syntax

ふつーにダメー☆文が値を返すわけもないのだった。
噂のリスト内包表記。

>>> a = [n*n for n in range(3)]
>>> a
[0, 1, 4]

おー。こういうのDでもやりたいな。
面白いのでもう少し。

>>> [x*x for x in range(0,3) if x*x > 1]
[4]
>>> [x*y for x in range(1,4) for y in range(1,4)]
[1, 2, 3, 2, 4, 6, 3, 6, 9]

式とforとifしか使えない。一時変数もだめなので条件文に式の値が欲しいときはもう一度計算しないといけない。
式を指す特殊変数とかあってもいいかなと思ったけど無いところを見るに、需要は無いんだろう。
あとそういえばタプルがあるらしい。

>>> a = 1,2,3,4,5
>>> a
(1, 2, 3, 4, 5)
>>> x,y,z = a
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: unpack tuple of wrong size
>>> x,y,*z = a
  File "<stdin>", line 1
    x,y,*z = a
        ^
SyntaxError: invalid syntax

Rubyほど融通は効かない。つまりまとも。後者できないのは悲しいけど。

>>>()
()
>>>(3)
3
>>>(3,)
(3,)
>>>3,
(3,)

空のタプルは()。要素一個のタプルはつくれないの…?と思ったら(3,)は要素一個を意味してるらしいよ。せめて出力ぐらい(3)でいいじゃん!
尾昼休みになったのでおしまい。