Pythonのお勉強3回目

みんなのPython』を使っての読書会の2回目。


今回は時間が1時間弱と短かったので範囲は少し短めの P.109 〜 P.127
ではいってみよう。

pythonスクリプトファイル

  • 拡張子は.py
  • 先頭行にpython実行ファイルを指定できる。

Windowsではpython.exeのあるディレクトリをPATHにする。
つまり普通にインストーラーを使ってインストールをした場合、
C:\python25
をPATHに通す。binというディレクトリは無い。

  • スクリプトファイル内ではブロック内に空行を記述できる。

インタラクティブシェルでは空行を入れるとそれまでを実行した。

入力関数raw_input()

raw_input()を呼ぶと入力待ち状態になり、
改行コードを入力するとそれまでの入力値を返してプログラムに戻る。

print raw_input()
> hoge[Enter]
hoge

戻り値はString型となる。


戻り値と数値の演算はできない

print raw_input() + 1
>5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects


# intに変換すると計算できる
print int(raw_input()) + 1
>5
6


len関数を使ってサイズを出力してみるとバイト数が表示された事から、
文字列はユニコード文字列ではなく通常の文字列。

print len(raw_input())
>あああああ
10

__name__組み込み変数

スクリプトファイルを直接実行した場合のみ初期値は"__main__"。
再代入する事もできる。

式と文

基本的には戻り値のあるものが式で無いものが文。
文には複数行のブロックからなるものがある。(ifやwhileなど)


戻り値のない関数呼び出し(宣言じゃない)は式ではなく文となる。
戻り値のない関数というのがどういう事かわからない。
sortなどの何も返さないようなものは文という事か。

>>>[5,4,3].sort()

>>>print [5,4,3].sort()
None

>>>a = [5,4,3].sort()
>>>a
None

普通にsortを呼び出すと何も表示されないがprintを伴うとNoneという値が返ってくる。
代入もできるのでやはり値を返していそうな気がするが。
前後の文脈によって式になったり文になったりするものという理解であってるだろうか?

オブジェクトのコピー

  • copyモジュールのcopy関数を使う。

copy()はshallow copyなので参照値のみがコピーされる。

import copy
a = [1,2,3]
b = copy.copy(a)
b
# [1,2,3]


リストはシンタックスシュガーでスライスを使うことでもコピーができる。

a = [1,2,3]
b = a[:]
b
# [1,2,3]

スライスの開始と終了を省略することで最初から最後までという意味になる。
短く書けるが少しトリッキーすぎるかも。


copyモジュールのdeepcopyメソッドを使うとオブジェクトの内部を辿って複製してくれる。

関数のデフォルト引数

これが今回一番驚いた。
関数のデフォルト引数は静的に値を保持する。

def foo(cnt = 0)
  cnt += 1
  print cnt

foo()
# 1
foo()
# 2
foo(10)
# 10
foo()
# 4

すごい挙動だ。。。


これと同じような挙動をJavaScriptで書くとこんな感じかな

var foo = (function() {
  var cnt = 0;
  return function() {
     alert(arguments[0]++ || cnt++);
  }
})();

とりあえず、処理がわかりにくくなる事は間違いない。
結論:引数を書き換える処理はやってはいけない。



今回はあまり進まなかったから、次回はがんばって進まないと。