Python

はてなキーワードしりとりを改造・その3

前回のコードは処理の流れ自体はほぼ満足のいくものだったのですが、main関数に直接記述している処理が多かったのでそれを減らすように書き直してみました。 コードがかなり長くなってしまったので今回はエントリの最後にコードを載せています。前回のコード…

はてなキーワードしりとりを改造・その2

前回のエントリに引き続きコメントでご教示いただいた内容を元にコードを書きなおしてみました。 # coding: utf-8 import urllib import urllib2 from xml.dom.minidom import parse def input_reader(text): """入力を受け取ってunicodeオブジェクトにして…

はてなキーワードしりとりを改造

先日掲載していたはてなキーワードしりとりをコメントで教えていただいた内容を参考に改造しました。一度問い合わせた単語を従来は2つのリストで管理していましたが辞書で行うように変更しました。さらにはてなキーワードAPIへのアクセスやXMLの解析を行う関…

はてなキーワードしりとりという物を作ってみました

引き続きPythonの勉強中です。 今回はurllibを使ってみたいと思い「はてなキーワードしりとり」なる物を作ってみました。 要ははてなキーワードに登録されている単語のみ使えるという単なるしりとりです。 ルール 使える単語は「はてなキーワード」に登録さ…

Google app engineと文字コード

→にも書いていますが当面の目標はGoogle app engineで何かしら作る事なのでSDKをダウンロードしてローカルで色々書いてみたりしています。基本の使い方についてはgoogleのページで説明されているのですがこれらは英語のチュートリアルをそのまま訳したものの…

JSON出力部分を改善しました

先日のエントリでCSV→JSON変換プログラムのJSON出力部分を完成しました、と書いたのですがコメントで改善できる点についてご教示頂いたので書きなおしました。処理面での改良点は2つで正規表現オブジェクトを作成する場所とcontinue文の追加です。 def jsonw…

0や空白の扱いを決めれるようにしてみた

先日から作成中のCSV→JSON変換プログラムですがCSVに空白が含まれている場合や、値が0の項目をどう扱うのかというオプションを付けてみました。今、以下のようなCSVファイルがあるとします。 ID, name, text, height, weight, sons, daughters 1, 夏子, どう…

イテレータをやっぱり分かってなかった話

先日から何度か書いていたコード(昨日も)に次のような記述をしていたのですが、基本中の基本の間違いをおかしていました(^_^;)下のように書いてたのですが def jsonwriter(tFileName, tDict, digitize=True): """write tDict to tFile as json if digitize=T…

昨日のエントリの補足+α

2013/2/23追記。 補足の補足になってしまいますがこの記事に関する訂正、補足記事を書きました→文字列がfloat型に変換可能かどうかを確認する正規表現について訂正と補足 - 主にプログラムを勉強するブログ 追記ここまで 昨日のエントリで、ある文字列がfloa…

isdigit()について

先日Pythonのisnan()はそもそも文字列を評価できないので文字列が数値に変換可能な形("10"とか"0.5"など)かどうかを判定できないということを書いたのですが、Pythonにはisdigit()という文字列が数字かどうかを判定する標準の関数がありました。 print "0".i…

関数化してみた

先日から作成しているcsvをjsonに変換するプログラムですが、これまでjson出力部分のみ関数で他はベタ書きだったのを機能ごとに関数に分割してみました。 # coding: shift_jis #CSVを読み込んでJSON化する import sys import codecs from collections import…

math.isnan()について

Python2.6以降にはmathモジュールにisnan()という関数が用意されているのですがこれはJavascriptのisNaNとはことなる働きをするものなのでちょっと嵌ってしまいました。JavascriptのisNaN()関数は何でも評価することができtrueかfalseが返されます window.al…

JSON出力部分を無理矢理書いてみた

昨日JSONライブラリを読んで改造しようかなと言ったばかりなのですが、私のスキルでは他人が書いたコードを読むのは自分で新たに書くより難度が高いと分かったので諦めて自作してみました。書き込む関数以外は省略しています。(全体はエントリの最後に) def …

ライブラリを読もうかな

私のPython処女作として作成したCSVをJSONに変換するプログラムなのですが、習作とはいえせっかく作るのだから実用できるものにしたいと思っています。修正したいポイントはいくつかあるのですがその中の一つが出力されるJSONファイルの中身の改行です。 現…

リストの内包表記

リストの内包表記はPythonの基本で避けて通れないものの一つのようです。 概念として新しいというよりはあくまで表記の問題なので無理矢理避けて通ろうかと思っていたんですが、コードを読む際にはどうしても必要なのでやはり避け切れませんでした。リストの…

PEP8に従うようにコードを整形してみた

以前書いたCSVをJSONに変換するプログラムをPEP8に従うように書きなおしてみました。昨日のエントリで書いた部分を一通り書きなおした後、その名もpep8という、コードが正しくPEP8に従っているかを確認してくれるツールを使って調べてみました。そうすると直…

PEP8というのがあるらしい

Pythonにはソースコードを読みやすくするためのコーディングスタイルを指南するPEP8というドキュメントがあるらしいです。私は超初心者なので自分のスタイルや書きやすい方法がまだありませんので今後は原則これに従うように書くことにします。 これまで書い…

lambda式

lambda式とは名前のない関数を返す式、Javascriptの無名関数のように使うことができるもの(似て非なるもの)、という感じでしょうか。というわけで無名関数を代入するやり方で関数定義してみる。 f = lambda x,y: x + y print f(3,4) #7 print f(5,8) #13 Jav…

クラスの超基礎4.継承

継承の概念をサポートしない言語機能はクラスと呼ぶに値しないとこちらのページでいわれているほど重要な要素である継承についてです。 継承を一言で言えばクラスを定義する時にメンバ変数とメソッドを他のクラスからコピーして、追加・変更のあるメンバのみ…

クラスの超基礎3.イテレータ

イテレートとはいわゆるfor文によるループ処理のことです。このエントリは自作のクラスでfor文によるループ処理を可能にする方法について、です。まずイテレータの仕組みなのですがこちらに詳しく解説されています。 >>> s = 'abc' >>> it = iter(s) >>> it …

クラスの超基礎2.特別なメソッド

昨日のエントリでも既に使っていますが"__init__""のような"__"で挟まれた名前のメソッドは特別な意味を持っています。"__init__"はインスタンスが作成される時に自動的に実行され、インスタンスを初期化するメソッドです。 class Test: def __init__(self,x…

クラスの超基礎

私はこれまでJavascriptしか勉強したことがないのでクラスの勉強をするに当たって、「クラスとは?」というところから始めなければなりません。 といっても、Javascriptの勉強の際にも「クラスベースの言語では〜」と言った記述をあちらこちらで目にしてきた…

global文について

今までそういったケースがなかったので気づいていなかったのですが、Pythonは型を指定せずに変数をいきなり登場させられるという仕組み上、関数内からグローバル変数に代入を行うには明示的な指示が必要です。 a = 0 def f(): a = 5 #このaはローカル変数 pr…

引数デフォルト値がリストの関数がおもしろい

こちらのページで重要な警告としてかかれている引数のデフォルトがリストの関数についてです。 def f(a, L=[]): L.append(a) return L print f(1) print f(2) print f(3) http://www.python.jp/doc/2.4/tut/node6.html これの実行結果は [1] [1, 2] [1, 2, 3…

便利なキーワード引数他、関数定義

先日のエントリで書いていたcsvをjsonに変換するプログラムでもよく理解しないまま使っていたのですがPythonの関数にはキーワード引数というのがあり、とても便利です。 キーワード引数は呼び出し時に使うもので定義は普通に行います。 def test(x = 2, y = …

enumerate()がPython風

先日書いていたCSVをJSONに変換するプログラムでfor文を使う際に for i in range(len(LIST)) という書き方を多用していましたが、リストのインデックスを使って処理をしたい場合enumerate()を使うのがPythonらしい書き方のようです。 a = [0,1,2,3,4] for i,…

Index Errorを扱う その2

昨日のエントリの続きです。リストにおいて外側のインデックスが参照された場合ある値を既定値として返す方法についてです。 Javascriptのように var a = [0,1,2,3,4]; window.alert(a[5] || "out"); // out みたいに書く方法がないかなと考えていたのですが…

Index Errorを扱う

先日作成したCSVをJSONに変換するプログラムをもっと実用的にしようと、各行の長さ(要素数)が等しくない場合の扱いを書いていました。改めてJavascriptの配列とPythonのリストは似ているようで違うなぁと感じたので整理を。Pythonのリストで要素数の外側のイ…

Eclipseをダウンロードしてみました

これまでPythonのコードはテキストエディタで書いていたのですが入力のアシストと構文チェックは欲しいと思い開発環境を導入することにしました。 Javascriptを書くのにEclipseベースのAptana Studioを使っていたこともありEclipseとPyDevをダウンロードして…

便利なOrderedDict

昨日のエントリで辞書のkeyがソートされないようにしたいと書いたのですがOrderedDictという順序付辞書を使うといいようです。 Pythonの辞書をfor in文でループすると処理される順番は処理系まかせなのですが、OrderedDictは作成された順が維持されます。こ…