Python の高階関数とは

関数型言語、関数型プログラミングについて少し興味があり昨日今日と少し調べて解説記事などを眺めていました。その中で出てきた高階関数というのは Python でもあったなと思い、調べておきます。

高階関数とは「関数を引数に取ったり、戻り値として関数を返したりするような関数」のことを指します。何となく map とか reduce とかそういう感じかなと思ったのですがそれらに限定されるものではないですね。

「パーフェクト Python」にあった例を試してみます。 まず、普通に for ループで書く場合はこうなります。

# 素直にループで書く
def pick_odd(seq):
    ret = []
    for item in seq:
        if item % 2 == 1:
            ret.append(item)
    return ret

# シーケンスを作成
seq = [x for x in range(30)]

# 結果を表示
print ...
more ...

Python tkinter でクリップボードのデータを扱う

先日 VBScript で作ったツールとほぼ同じものを Python でも作ってみました。

というか、もともとは Python で書いたちょっとしたスクリプトがあってそれをもう少し発展させたものが欲しいというのが出発点でした。 最初は Python で実現できないかなとやっていたのですが、自分だけでなく社内で共用する可能性を考えると Windows マシンなら標準で動く VBScript の方が適していると思ってそちらに舵を切ったのです。

で、Python でも調べていて、クリップボードのデータを扱うのには tkinter を使うのが手軽そうでした。

import tkinter

root = tkinter.Tk()

# ウィンドウの表示を抑制
root.withdraw()

# クリップボードから読み込み
cb = root.clipboard_get()

こんな感じで OK でした。クリップボードにデータをセットするのも root.clipboard_append() でできるらしいのですが、私の環境ではうまくいきませんでした。

more ...

Python でユーザーからの入力を受け取る

ちょっとした作業用のスクリプトなどで実行するたびにキーボードからの入力を受け取って処理に使いたい場合があります。 Python 3.x では input() という関数で簡単に実現できます。ちなみに Python 2.x では raw_input() でした。括弧の中に表示したいプロンプトを書いて、左辺に変数を置いて代入すれば OK です。

#!/usr/bin/env python
#-*- coding: utf-8; -*-

import os

def main():
    input_data = input("type your name: ")
    result = 'Your name is ' + input_data
    print(result)


if __name__ == '__main__':
    main()

都度処理内容を変更したい場合など、ちょっとした対話形式のインターフェイスも作れそうですね。

more ...

Python Tkinter を使ってみる

Python で GUI プログラムを作る Tkinter を触ってみます。 標準モジュールだと聞いたので import Tkinter としたところエラーになりました。少しググると Python 3.x からは tkinter と小文字になっていると読んだので import tkinter としてみるとやはりエラー。

>>> import tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/ython3.3/tkinter/__init__.py", line ...
more ...

Python で素数を数え上げる

Project Euler で素数(prime number)を求める必要があったので考えて何とかやってみました。 ググってしまえばすぐに先人の素敵なプログラムを参照できるところですがそれだと自分の勉強にならないので何も見ずに考えたところ、以下のようになりました。

#!/usr/bin/env python
#-*- coding: utf-8; -*-

import sys

argvs = sys.argv
arg = int(argvs[1])

def old_primes(arg):
    counter = 0
    primes = [2]
    def is_prime(arg):
        nonlocal counter
        counter += 1
        if arg % 2 == 0:
            return False
        else:
            for i in range(3, arg ...
more ...

Python watchdog でファイル監視して自動処理

仕事の関係でテキストファイルを html ファイルに変換する処理を日常的に繰り返していて、Python で書いた変換するスクリプトを毎分実行するということをやっていました。その目的としてはそれで事足りていたのですが、別件でもファイルの更新を検知して処理したいなーと思っていたものがあり、たまたま Qiita で watchdog の使用例を書いた記事を見つけたのでやってみることにしました。

会社で使っている Python のスクリプトを全部(といってもそんなに数はないですが)3.x 系で統一しようと思っているので 3.x 系の virtualenv 環境でインストールしたところエラーになりました。下記のような参考になりそうな情報もあったのですが、私の環境ではうまくいかなかったので 2.x 系の環境に入れました。

基本的に Qiita の記事および公式ドキュメントのサンプルそのままです。ChnageHandler というクラスの中で on_modified とか on_created などのメソッドを定義してそこに処理を書きます。下記のコードだとこのスクリプトを置いているディレクトリにある something.txt についての ...

more ...

Python 現在時刻を表示する(文字列のフォーマット)

日時や時刻を数値データとして取得するだけではなく文字列として表示するやり方について書いてみます。datetime オブジェクトの strftime() メソッドを使います。

strftime() は引数にフォーマット文字列を取ります。公式ドキュメントに詳細な説明があるのでそれを見ながら %Y などの指定子を組み立てていきます。

import datetime
d = datetime.datetime.today()
print('d.strftime():', d.strftime('%Y/%m/%d %H:%M:%S'))
d.strftime(): 2014/04/02 01:12:16

個人的にはこれを覚えておけば大体大丈夫かなという気がしています ...

more ...

Python 現在時刻を表示する

スクリプトを書いていて現在時刻を表示したいことがあります。Python では datetime モジュールによって簡単に実現できるのでメモしておきましょう。

import datetime
d = datetime.datetime.today()
print('d:', d)
d: 2014-04-01 23:31:39.463726

datetime.datetime.today() というメソッドで現在の日時を取得できました。もうひとつ datetime.datetime.now() というメソッドもあり、こちらは引数にタイムゾーンを指定できるようです。何も指定しなければ today() の方と同じものが返ってきます。

now = datetime.datetime.now()
print('now:', now)
now: 2014-04-01 23:31:41.464821

これらの戻り値の型は datetime.datetime オブジェクトで ...

more ...