I ♥ WordPress

[時間割:Python]『みんなのPython』その6
2008/09/26 02:31 posted by kunkichi

はい、木曜は『Python』です。

先週はちょっとさぼってしまいましたが、実は前にも『はじめてのPython』の時にもあった「リファレンス」がやっぱりちょっとわかりにくかったので、まとめきれませんでした。

ということで、今週もう一度読み直してみたので、まとめてみます。

みんなのPython
みんなのPython
posted with amazlet at 08.08.21
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 50252


  • Pythonは参照渡しが基本。なので変数はオブジェクト(実体)と結びついている。
  • ただし数値、文字列などの「書き換え不能」なオブジェクトの場合は値渡し。 つまり、リスト、辞書などの「書き換え可能」なオブジェクトはリファレンスとなるので、オブジェクトを呼び出すようなメソッドを使うと、元の変数も変わってしまうので注意。>>> a=[1,2,3,4]
    >>> b=a
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3, 4]
    >>> a.append(5)
    >>> a
    [1, 2, 3, 4, 5]
    >>> b
    [1, 2, 3, 4, 5]
  • これを回避するためには、リストをリテラルで代入するか、リストのコピーを代入する。>>> a=[1,2,3,4]
    >>> b=[1,2,3,4]
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3, 4]
    >>> a.append(5)
    >>> a
    [1, 2, 3, 4, 5]
    >>> b
    [1, 2, 3, 4]
    リストのコピーを作るにはスライスを使う。>>> a=[1,2,3,4]
    >>> b=a[:]
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3, 4]
    >>> a.append(5)
    >>> a
    [1, 2, 3, 4, 5]
    >>> b
    [1, 2, 3, 4]
    辞書の場合はスライスは使えないのでcopyモジュールを使う。>>> a={1:"one",2:"two",3:"three"}
    >>> import copy
    >>> b=copy.copy(a)
    >>> a
    {1: 'one', 2: 'two', 3: 'three'}
    >>> b
    {1: 'one', 2: 'two', 3: 'three'}
    >>> a[4]="four"
    >>> a
    {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
    >>> b
    {1: 'one', 2: 'two', 3: 'three'}
  • copy関数は「浅い」コピー。多次元配列とか書き換え可能なオブジェクトを含む辞書などは「深い」コピー、deepcopy関数を使う。
  • 書き換え可能なオブジェクトを関数の引数として渡して関数内でそれを変更すると、関数の外でもオブジェクトが書き換えられるので注意。>>> def add_str(list):
    ...   list.append('added!')
    ...
    >>> a=[1,2,3,4]
    >>> add_str(a)
    >>> a
    [1, 2, 3, 4, 'added!']
  • 関数の引数デフォルト値に書き換え可能なオブジェクトを指定して関数内でそれを変更しても、デフォルト値の代入は1回しか行われないので注意。関数内の変更だけが繰り返される。>>> def add_str(list=[1,2,3]):
    ...   list.append('added!')
    ...   print list
    ...
    >>> add_str()
    [1, 2, 3, 'added!']
    >>> add_str()
    [1, 2, 3, 'added!', 'added!']
    >>> add_str()
    [1, 2, 3, 'added!', 'added!', 'added!']
    >>> add_str([1,2,3])
    [1, 2, 3, 'added!']
    >>> add_str([1,2,3])
    [1, 2, 3, 'added!']
    >>> add_str([1,2,3])
    [1, 2, 3, 'added!']
    >>> add_str()
    [1, 2, 3, 'added!', 'added!', 'added!', 'added!']

うーん、Perlでも参照渡しとか普通に使うし、Cで言うポインタも最近仕組みがわかってきたので意味は理解できるんやけど、やっぱりちょっと考えないとサッとイメージできないなぁ。ポインタが鬼門と言われるわけだ。

ちょこちょこスクリプト書いて体で覚えないとね。

[時間割:Python]『みんなのPython』その5
2008/09/14 21:59 posted by kunkichi

木曜日の『Python』の勉強結果をアップしてなかったので。ファイル処理から。

みんなのPython
みんなのPython
posted with amazlet at 08.08.21
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 50252


ファイル処理

  • openとかcloseとかほとんど他言語と変わらない。
  • ファイルオブジェクト。ファイルハンドルみたいなのと同じ。
  • ファイルオブジェクトに対してメソッドを使っていろいろ処理。
  • 1行づつ処理するには readlines()メソッドが便利。
    f = open("aaa","r")
    for i in f.readlines():
      i
  • ファイルオブジェクト自体をfor の対象にすることもできる。
    f = open("aaa","r")
    for i in f:
      i
  • 全部読み込む場合はread()メソッド、1行だけ読み込む場合はreadline()メソッドもあり。
  • 書き込みの場合はwrite()メソッド、シーケンスとかの場合はwritelines()メソッドもあり。
    f = open("aaa","r")
    f2 = open("bbb","w")
    for i in f.readlines():
       f2.write(i)
    f.close()
    f2.close()

スクリプトファイル

  • 拡張子は「.py」
  • SHEBANG。”#!/usr/bin/env python”とか。
  • pythonでは、関数とかは最初に宣言してmainをあとに書く感じなのね。シェルスクリプトっぽい。
  • ファイルを直接実行した時のみ実行、みたいな特殊なブロックもあり。
    if __name__ == '__main__':
      〜コード〜
  • コマンドライン引数には、sysモジュールを使うと、sys.argvに文字列のリストとして登録される。
    #/usr/bin/env python
     
    import sys
     
    print sys.argv
    # ./aaa.py aaa bbb
    ['./aaa.py', 'aaa', 'bbb']

ちょっとしたツールとして使うために必要な情報が揃ってきた感じです。

[時間割:Python]『みんなのPython』その4
2008/09/05 00:56 posted by kunkichi

木曜日は『Python』です。ループの続きから。

みんなのPython
みんなのPython
posted with amazlet at 08.08.21
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 50252


ループの続き

  • breakとかcontinueとかおなじ。
  • シーケンスは何でもforで使える。リストやら文字列やら。
  • 辞書とかの組み込み型メソッドにはシーケンスを返すようなメソッドとかがあるのでこの辺と組み合わせて。
  • whileもだいたい同じ。でもdo〜whileはない。do〜while的なのはbreakを使う。

関数

  • def 関数名 ([引数]):
  • もちろんインデント!
  • 関数の定義は呼び出しより前。ここはシェルっぽい。
  • 関数では変数のスコープが関数内のローカルとなる。
  • 関数呼び出し時に引数を変数名でキーワード指定すると順番を気にしなくてもよい。
  • デフォルト値の定義も普通。
  • 返り値も普通。リストや辞書も返せる。

まあこの辺はどの言語もだいたい一緒かな。

次回はいよいよファイル操作。

[時間割:Python]『みんなのPython』その3
2008/08/29 01:36 posted by kunkichi

木曜日は「Python」。

ちょうど WEB+DB PRESS vol.46で『[速習]Python』の特集があったので、まずはそれをさらっと読んでみました。

WEB+DB PRESS Vol.46
WEB+DB PRESS Vol.46
posted with amazlet at 08.08.28
技術評論社
売り上げランキング: 103


内容は、Javaとか経験のある開発者向けのPython紹介記事という感じで、Pythonの記法で他言語と違うところとか、あといきなりO/Rマッパー、テンプレートエンジン、フレームワークをさらっと紹介してあったり、とちょっと初心者には難し目の内容。

でもデータベースへ接続して一通りの作業をやってみたり、MVCな即席アプリ開発とか、初心者向けの本だとカバーできないような実践的なところまでざっくりまとめてあるので、なんとなく雰囲気がわかるのはいいね。

Pythonをある程度使えるようになった頃の自分が想像できたところで、続き。

みんなのPython
みんなのPython
posted with amazlet at 08.08.28
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 26951


条件分岐・比較演算子・論理演算子

  • 中カッコとかではなくて、
    • インデントでブロック定義。これぞPython
    • 条件にカッコはいらない
    • 分岐の記述の最後は:
  • switchないのか。Perlとおなじ。でも elsif じゃなくて elif
  • インタラクティブシェルの場合は、ブロックの最後は空行。でもネストされたifブロックの最後は空行いらないみたいだから、多分インタラクティブシェルだけのような気がする。あとで調べる。
  • &&とか||とかは使えない。and と or を使う。
  • 組み込み型(リストとか文字列とか)の比較もできる。リストの場合は要素も完全一致する場合のみTrue。
  • &&とか||とかは使えない。and と or を使う。
  • 文字列検索にはfind()メソッド。
    ex) if a.find(”STRINGS”) != -1:
  • 上の例にあるように、ifで指定する条件は「式」である必要がある
  • &&とか||とかは使えない。and と or を使う。
  • find()メソッド以外にもinとか使える。こっちのほうが良さげ
    ex) if “STRINGS” in a:
  • 文字列の”2″と数値の2は比較してもイコールにはならない。型キャストする。PHPerだとちょっと嵌りそう、これ。

ループ

  • インデントとか:はif文と同じ。
  • $i++とかない。Perlのforeachとかシェルスクリプトのforとかっぽい。
  • カウンタを指定するような場合はrange()関数。

インデントってやっぱり新鮮だなー。ちょっと長めのスクリプト書けるようになったら見やすさを味わってみたい。

[時間割:Python]『みんなのPython』その2
2008/08/21 23:02 posted by kunkichi

まだChapter1の途中です。数値、文字列ときて、そろそろプログラミングらしいデータの持ち方である、リストから。

みんなのPython
みんなのPython
posted with amazlet at 08.08.21
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 50252


リスト

  • いわゆる配列
  • 文字列も数値も一緒にリストに入れれる
  • スライス重要
  • 角カッコで定義。ex) a=[1,2,”aaa”,”bbb”]
  • インデックスにマイナスを使うと後ろから。
  • スライスは開始位置と終了位置+1で指定。ex) a[1:3] で [1,2]が返る。
  • スライスで返るのはリストなので注意
  • リスト同士を足すと連結。あと、リストに数値/文字列は足せない。足す時はリストで足す。append()メソッドで要素を追加、extendメソッドでリストを連結
  • リスト同士をかけると繰り返し。
  • リストは文字列と同じシーケンス型だけど、要素の置き換えは代入で可能。
  • del文で要素を削除
  • max()関数で最大、min()関数で最小の要素を取る。
  • sort()メソッドで照準ソート、reverse()メソッドで降順ソート。このメソッドはリストの並び自体を書き換える
  • 多次元配列は普通にOK

辞書

  • ハッシュと同じ
  • 中カッコで定義。コロンでキーと値を組み合わせる。ex) a = {”key1″:”value1″,”key2″:”value2″ }
  • 取り出す時は角カッコ ex) a[’key1′]
  • 要素の削除とか追加はリストと同じっぽい
  • キー一覧を取得するにはkeys()メソッド。
  • キーの存在確認はhas_key()メソッド。

タプル

  • リストとの違いは書き換え不可ということだけ?
  • 丸カッコで定義
  • 取り出しはリストと同じ。
  • スライスでタプルとして取り出せる
  • タプル同士の足し算は可能。ただし新しいタプルに。
  • タプルの利点は辞書のキーとして使える。リストは無理。

組み込み型まとめ

  • コレクション型・・・複数の要素をまとめるもの。
    • シーケンス型(文字列、リスト、タプル)
    • マップ型(辞書)
  • 変更可否
    • 文字列、タプル → 不可
    • リスト、辞書 → 可能
  • これらの型キャストもできる。

うーん、なんとなく、リストとか辞書とか、あとそれを取り出すときとかの囲み記号がPerlとかと違うのがちょっと覚えにくい。そう考えるとPHPって単純なんだけどパッと見ではわからんってのがなー。

でも個人的にプログラミングのキモの一つは、リストとか辞書みたいな、「配列」「ハッシュ」の使い方だと思ってるので、ここはしっかり覚えないと。

[時間割:Python]『みんなのPython』開始
2008/08/17 22:55 posted by kunkichi

週末は「復習」の予定なのだけど、今週末は多忙&体調不良でダウン、、、木曜日の「Python」の時間のまとめだけもう書いていたのでアップします。

ちなみに、前にも初めてのPython 第2版で勉強したことがあったのだけど、途中で軽く挫折、、、orz。

どうも完璧主義的にやろうというのはよくないね。多少なりともプログラミングやってればある程度わかってることでも、「きちんとまとめないと」という気持ちから実例入れたりしてちゃんとまとめようというのはやっぱり無理。ブログに書くだけでも時間かかって面倒で続かないなー、僕の場合。

ということで、今回は気になったところだけまとめるっていうのを全体的な方針としてやってます。
気分一新、本も買えました。オライリーのが悪いわけではなくて、気分的な問題。初めてのPython 第2版は持ち歩くのも大変だし(笑)

みんなのPython


Chapter1から。

数値

  • 整数同士の計算は整数で返される(例:1/2は0)
  • 整数と浮動小数点数を組み合わせて計算すると精度の高い方、つまり浮動小数点数で返される(例:1.0/2は0.5)
  • ++とか–は使えない。+=とか-=使う。

文字列

  • 複数の文字の配列みたいな感じ。Cっぽい。
  • マルチバイト文字を使う場合はunicode文字列を使う。
  • シングルクォート、ダブルクォート、トリプルクォート。
  • どの場合でも変数展開されない。
  • トリプルクォートがヒアドキュメントみたいな感じ。
  • 連結は+、繰り返しは*。数値演算みたく書ける。
  • int()、float()、str()とかで型キャスト。
  • 関数とメソッド。
  • 配列みたくインデックスで文字を取り出せる。
  • でも配列みたく置き換えれない。文字列は配列じゃないから。replaceメソッド使う。

同じこと勉強するにも本によって流れが違うし、片方だけではわからなかったこととか、両方読んですっきりすることもあるね。「多読」がいいのはこういうことか。

[Python勉強日記:005] 文字列 その1
2007/11/12 23:33 posted by kunkichi

わー、いきなり放置状態!(爆)

いやー、ほんと忙しいのですよ、最近。帰ってきてもブログ更新するエネルギーがなくて、土日も基本的には何もせず完全に引きこもり状態(笑)

これではいかん、ということで、がんばって進めます。今日は『文字列』。

(more…)

眠い、、、
2007/11/08 13:40 posted by kunkichi

新しい職場は少し遠めなので朝が早くて夜は早く眠くなります。

しかも障害対応中で忙しくてPython勉強日記がかけません。早く続きを、、、

閑話休題。

PS3 FAN || PS3システムソフトウェア Ver2.00の内容が明らかに

はてなのホッテントリで見たとき、PS3のファンがファームウェアで改善されると普通に思ったのはやっぱりこの業界にいるからですか、そうですか、

ということで、Python勉強日記は週末にまとめてポスト予定。

[Python勉強日記:004] 変数の扱い
2007/11/06 00:08 posted by kunkichi

さて、週末少しお休みしたので続きを。今日は第5章の文字列まで読み終わっただけど、ブログが追いつきません!!!

ということで、とりあえず、前回の数値のお話の続きでちょっと変数のお話。

変数の扱い

まず、以下の例。

>>> a = 3

よくある代入の例だけど、PerlやPHPと同じく、Pythonでは

  • 変数や型をいちいち宣言しなくても良い。こういうのは値からダイナミックに判断されて型がつけられる。ただし、前回の例を踏まえると、整数とか浮動小数点数とかは気をつけないといけないね。
  • つまり、変数は型情報とかを持たない。あくまでも値であるオブジェクト自身がその情報を持っている。

ということ。まあPerlやPHPに慣れてればあんまり気にしなくていいところ。

で、上記例の式の場合に、どのように内部処理が行われるかをスライドで説明してみる。うふふ、SlideShareを使ってみたかったのです(笑)。

ということで、あくまでもリンクされているってところがポイント。これまでは、メモリ上に指定した変数の領域があってその中に値が入っているっていうイメージがあったのだけど、そういうことじゃないみたい。なんかCでいうポインタっぽいのかな。

さらにも一つ例。

ということで、代入するたびにオブジェクトが生成されるというわけ。これを言い換えると、オブジェクトの値自体は変更できないということ。

ただし、一部のものについては、オブジェクトの値を変更することができるらしいのだけど、これはまだ先の話らしいので、とりあえず今の段階ではPythonのオブジェクトの値は変更できない、変数はあくまでもオブジェクトへのリファレンスということで理解しておきます。

明日は文字列です。

週末
2007/11/04 01:50 posted by kunkichi

たった今決めたのだけど、週末はお勉強お休みにします(爆)

まあこの辺が読者のいないブログの気楽なところ(笑)

このページの先頭へ