Python覚え書き
パーフェクトPythonの昨日の続き。 初めてのPythonなどを参考にメモしてます。
with/asステートメント
try/finallyステートメントの代替として設計されたもの。 異なる点として、より幅広い用途に対応できるオブジェクトのプロトコルをサポートしている点が異なる。
基本的な使い方
with expression [as variable]: with block
expressionにはコンテキスト管理プロトコルをサポートするオブジェクトを戻すコード が入り、asを用いると、variableには何らかの値が代入される。 このとき、variableに代入されるのはコンテキスト管理プロトコルをサポートするオブジェクトではないことに注意。 このオブジェクトは、withブロックが開始され前に「前処理」をすることもあるし、終了後に、「後処理」をすることもある。
具体的な処理
with open("path/to/something") as f:
とした場合に、openはファイルオブジェクトを返し、それがfに代入される。 ファイルオブジェクトは、コンテキスト管理プロトコルをサポートしているため、 withブロックを抜けたら、自動的にファイルはクローズされる。
ちょっと紛らわしかったけど、要するに、expressionは評価された値じゃなくて、 オブジェクトを返して、asが使われていたら変数にオブジェクト代入するよっていう代物か。
コンテキストマネージャ
with/asの使い方は理解したけど、コンテキストマネージャって何だろう。 これは、初めてのPython見ても記述が見当たらなかった。
今まで整理した内容から考えると、ある操作をするときの状況・文脈で必ず行いたい前処理や後処理を 定義したもののことを言うのかな??
ちょっとここらへんまだ曖昧です。
とりあえず、独自のコンテキストマネージャを定義することができることは理解した。
クロージャ・高階関数
クロージャ
すでに存在しない外側のスコープに属する変数を保持しているオブジェクトのこと。
def outer(): x = 88 # 外側の変数 def inner(): print x # 外側の変数を参照 return inner # 内側の関数オブジェクトを返す action = outer() # 関数呼び出し。innerオブジェクトを返す。 action() # 関数呼び出しにて、88と表示。
すでに存在しない、つまりはaction()を呼び出した際に、outer()は既に存在しないが、 inner()はouter()の変数xの値を保持している、ということ。
基本的にネストされた関数はわかりづらくなりやすいので、避けた方が無難ぽい。
高階関数
こっちは昨日の理解でよさげ。 なので、apply関数とか、map関数とかをサンプルに記述する。
def func(x, y, z): return x + y +z apply(func, (2, 3, 4,)) # 9と出力 list = [1, 2, 3, 4] def inc(x): return x + 10 map(inc, list) # [11, 12, 13, 14]と出力
apply関数は関数オブジェクトと引数を渡すことで、関数を実行してくれる。 map関数は、関数オブジェクトとシーケンス型のオブジェクトを渡すことで、 一つ一つの要素に関数を適用して、リストを生成する。
デコレータ
とりあえず、以下のリンクを見る。
(デコレータ) 別の関数を返す関数で、通常、 @wrapper 構文で関数変換として適用されます。 デコレータの一般的な利用例は、 classmethod() と staticmethod() です。 デコレータの文法はシンタックスシュガーです。次の2つの関数定義は意味的に同じものです:
def f(...): f = staticmethod(f) @staticmethod def f(...):
とりあえずここまでは理解。 具体的なサンプルコードを見てみる。 以下のリンクを見てみる。
具体的なサンプルコードはリンク先を見てもらうとして、 要するにデコレータっていうのは、関数本体に手を入れることなく、何か別の事をやって欲しいと思ったときに、 それ専用のクロージャを作ってあげて、何かごにょごにょして、ハイじゃあ元の関数さんあなたの仕事してねって 感じの処理か。
それぞれの関数内で、ごにょごにょする関数を呼び出してもいいけど、@関数名でデコレートしとけば、 見た目奇麗になるでしょ、てな感じで今は理解しておこう。 (ここら辺からだいぶ適当になる、かも)
ディスクリプタ
参考にしたリンク先
ディスクリプタ HowTo ガイド
Python を支える技術 ディスクリプタ編 #pyconjp
__get__,__set___,__delete__
上記、3つのメソッドを定義したオブジェクトのこと、、、、
とまではわかったけど、それ以降は全然理解できない。
ちゃんとPythonにおけるクラスとかの仕組みを理解しないとだめな気がする。 ということで、もいっかい勉強し直してからここは戻ってこよう。
メソッド関連の話もそれからということで。
昨日今日とPythonの学習してきたけど 今まで言語の表面的な部分しか全然触ってきてなかったんだなと痛感しました。
それでも内部的な仕組みに少しでも触れることができたので、 今後とも精進していきたいです。
パーフェクトPythonメモ
Pythonの勉強を再開しようと思って買ってみました。
とりあえず、言語仕様の部分まではさらっと読んでみて、
知らないとこ、分からないところをメモっとく。
- withというか、コンテキストマネージャとはなんぞや とりあえず、前処理・後処理てきなやつをやってくれるのか。
- クロージャ 関数内部で定義され、かつ、外側の関数のローカル変数を参照している関数のこと。 とりあえず、外側の関数抜けても内側の関数内の変数は残ってるよくらいの理解なので、 再度整理が必要かな。
- 高階関数 関数の引数に関数や、また、戻り値に関数を返す関数のこと。 関数の細分化が可能。 例えば、数値の集合から奇数のみを取り出して、リストにする際に、 奇数を判定する関数(評価関数)と、評価関数を用いてリスト生成する関数を作成するなど。
- 関数デコレータ これがイマイチ理解できてないので、後で整理。 記法はJavaのアノテーションなんだけど、そもそもJavaのアノテーションもわかってないから、 全く関係ないかも。
- 多重継承 個人的にはなんか厄介な気がするんだけど、なんで採用したんだろ??
- インスタンスアロケータ メリットというか、使いどころがイマイチ想像できない。
- ディスクリプタ セッターゲッター用のデコレータが準備されているみたいだけど、 それとの違いがまだ分かんない。
- クラスメソッド、スタティックメソッド Javaと混同するから整理必要。
とりあえずざっと読んでみて気になったので、明日調べなおします。
明日でお正月休みが終わりかーはやかったなー 今年の目標とかたてよう。
Heroku+bottleを使ってみた。
Python - Heroku×bottleを使って4分33秒でWebアプリを公開する - Qiita
リンク先を参考にやってみた。
さすがに慣れてない部分があったので、5分でできなかったけどすぐにリリースまでできた。
まじでHerokuすごい。
リンク先にも書いてあったけど、Webサービスをリリースするってだいぶハードルが下がってきているんだと実感した。
商用とかエンタープライズ用とかでも耐えられるのかはわからないけど、
個人レベルのWebサービスをリリースするんだったら、全然構わないんじゃないかな。
以下、ちょっと詰まったところのメモ
①bottleのインストール
②ソース編集
③依存ライブラリの一覧作成
という手順でやるべきところを、
①ソース編集
②依存ライブラリの一覧作成
という手順でやってしまったため、Herokuにデプロイしても、
application errorでHello Worldが出力されなかった。
bottleをインストールして再度デプロイしてもまだだめだったので、
なんでかなーっと思ったら、③の依存ライブラリの一覧にbottleってあったっけ??
と思い確認。
bottleらしきライブラリの記述ないじゃん...とおもいつつ、
再度③の手順を実施して、再度デプロイしたら、見事できました。
pip freeze > requirements.txt
でやっていることとして、今の環境にインストールされているパッケージの一覧を取得して、txtファイルに保存している...って感じらしく、別の環境ではこのtxtファイルを参照して、ライブラリを準備するらしい。
まだまだ全然知らない事が多いので、Heroku、もっと勉強したいです。
Gitを触ってみた。
Git入門:Git初学習者のための効率的な学習方法を考えてみた – PAYFORWARD
これに沿ってみて、学習している最中。
takanabe/introduction-to-git · GitHub
とりあえず、ここまでやってみた感想。
業務でCVSを触ったことがあって、そのときはEclipse経由でリポジトリとのやりとりをしていたから、コマンドラインからの操作はちょっと疲れた。
ただ、CVSでの操作をしていたときにわけもわからずやっていた操作が、
今となってみるとこういうことやっていたんだなーと理解できた。
マージとかなんでHEADに移って実行しないといけないんだ??とか。
個人的に、GitのHEADは単なるポインタで、今作業しているブランチを指している、
という説明には非常に納得を持てた。
今の職場はメインフレームで開発していて、コードのバージョン管理なんて無いに等しくて、マージなんて手打ちで実行している状況だから、メインフレームの世界でもこういうツールが導入されたら開発効率があがるんじゃなかろうか。
そういや、来年度あたりからSVNでソース管理するみたいなこといってたから、
案外近いうちに導入されるのかも。
まぁ、使いこなせるかどうかは人次第な部分はあるけど。
一気にやったので後半の複数人でのリモートリポジトリの操作とかざっと見になっちゃったので、また気が向いたら見直そう。
あとは、GitHubのアカウントも作ってみたので、何か作ったらそっちにあげてみよう。
最近、ツールとか環境構築周りのことばっかりやってるから、コードも書かんと。
年末年始にまとまった休みがとれるから、その期間で何か作れたらなぁー
virtualenvとか、pythonzの整理
Djangoのチュートリアルをやったときに使用したvirtualenvとか、pythonzについて整理しておく。
virtualenvとは
異なるバージョンのpythonを用いて開発したい場合に、そのバージョン、パッケージ専用の開発環境を構築するためのツール。
例えば、2.x系と3.x系のバージョンで開発したいときに、システムに両方をインストールして使用することはできないから、virtualenvを用いて、各バージョン毎の開発環境を構築する、みたいな使い方が可能。
ざっくりとした表現だけど、各バージョン毎のpythonを適当なディレクトリに置いておいて、自分の使いたいプロジェクトではこのpythonで、みたいなことをコマンドで指定して使うっていうイメージなのかな。
とりあえず、コマンド操作とか使い方さえ慣れてしまえば、非常に便利そう。
virtualenvの仕組み的なことを書いてるブログを備忘録として貼っておく。
今の自分には全てはわからないけど、これくらいは理解したい。
virtualenv - def __mopemope__(self, *args, **kwargs):
こっちは基本的な使い方とか
pythonzとは
virtualenvが開発環境の仮想化を手出すけるものであれば、こっちはpythonのバージョン管理やインストールを簡単に実行できますよっていうツール。
easy_installとかpipとかと一緒なのかな??
ここらへんのバージョン管理とかパッケージ管理とかの仕組みがよくわかってないから、時間あったらちょっと整理してみよう。
home_brewとかもよくわかってないし。
よくわかんないけど、ブログとか見てるとそうやってるからやっとけばいいだろうという状態を抜け出したい。
というわけで、参考になりそうな記事を。
Python パッケージ管理技術まとめ (pip, setuptools, easy_install, etc)
デュアルディスプレイ、作業とか快適なんだけど、
心なしか首とか目が疲れる。
慣れの問題であればいいんだけど。。。
デュアルディスプレイ
にしてみたら、世界が変わった、、、、、、、、気がした。
ただ、ブラウザ、エディタ、ターミナル等々一度に見れる物が増えたので、
非常に作業がしやすいです。
Djangoチュートリアル(1)
転職したい!!
→ Web周りやりたい!!
→ でもCOBOLしか仕事してない!!
→ なんか作ってアピールできるものがあれば!!
→ よくわからんけど、Herokuでアプリ無料であげられるっぽい!!
→ 言語とかどうしよう!!
開発環境周りは下の参考サイト見て構築しました。
よくわかんない事してましたが、とりあえず開発できる環境までは構築できたので、
詳しい事は後々勉強していこうと思います。
インストールしたDjangoのバージョンが1.9とかだったので、チュートリアルは英語の方を見てやってます。
バージョンが異なると日本語訳の手順では上手くいかないところがあるので。
とりあえず、チュートリアルの2回目まではやってみた。
なんだかわかったような、わからないようなふわっとした感じ。
とりあえずの感想としては、DBを強く意識した作りになっていて、
python的な表現であまりSQLとか意識しない(させない??)作りだと感じた。
以前、業務でJSPとサーブレット(いまどき珍しいと思うのだけど)でごりごり
DBとやりとりしてJSPで結果表示するWebページを作ったのだけど、そのときは
SQLをごりごり書いてたから、ちょっと不思議な感じ。
フレームワーク自体が楽にアプリ開発を進めるためのツール的な位置づけだと思うから、こういうのは慣れの問題なんだろうなぁ。
とりあえず、いったん今日はここまでで。
※参考にしたサイト
Mountain Lion環境への「virtualenv」と「pythonz」のインストール手順 + 利用方法 - Qiita
pythonz + virtualenv + virtualenvwrapper でPython開発環境を作ってみる on MacOSX10.8 | ふぃふメモ
The Web framework for perfectionists with deadlines | Django