soy-curd's blog

へぼプログラマーです [https://twitter.com/soycurd1]

「Python文法詳解を詳解する会 - 第6回」に参加した

先週の木曜、「Python文法詳解を詳解する会 - 第6回」に参加した。会の名前の通り、Python文法詳解を詳解していく会だった。内容はデコレータ、イテレータ、ジェネレータ、というかんじで、自分的には、以下の文法に発狂感を覚えた。

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


def spam():
    sent_1 = yield u"1個めのyield" #....yieldが...代入...してる...!
    print(sent_1)
    sent_2 = yield u"2個めのyield"
    print(sent_2)
    yield u"3個めのyield"


gen = spam()
print(next(gen))
print(gen.send(u"1回目のsend"))
print(gen.send(u"1回目のsend"))

# output
# 1個めのyield
# 1回目のsend
# 2個めのyield
# 1回目のsend
# 3個めのyield

...どうやらyieldは式なので、"yield xx"っていうそれ自体が値を持てるらしい。だからyield的には、

「next( )されたか...じゃあこっちはをxxを投げるぞ!受け取ってくれ〜」

「お、send("hoge")されてるじゃん...さて、"hoge"を左項に渡しとくか...」

という雰囲気という理解。ジェネレータと外界との値のやりとりに使えるようだ。(しかし、この機能を使ったプログラムを制御できる自信はないなあ。。。)

というわけでpythonのお勉強をできたわけだけれど、びっくりしたのが、講師の方が「Python文法詳解」の著者だったことで、東京ってすごいなと思った。帰りには著者+他の参加者と一緒にビールも飲めたし、東京のコスパやばい。人生力高まった気持ち。

Python文法詳解

Python文法詳解

位置原光Zの名言をつぶやくbot作った

はじめに

位置原光Zのマンガに出てくる名言をつぶやくbotを作った。

概要

位置原光bot@hikaruzbot

このように、ふとした瞬間に位置原光の言葉をつぶやいてくれるため、とても癒やされる。

中身

python on heroku。tweepy使った。

おわりに

お気に入りの位置原先生の言葉があったら、リクエストください。つぶやかせます。

お尻触りたがる人なんなの

お尻触りたがる人なんなの

アナーキー・イン・ザ・JK (ヤングジャンプコミックス)

アナーキー・イン・ザ・JK (ヤングジャンプコミックス)

小説執筆補助ツールBungoo作った

github.com

とりあえず動いたのでgithubに上げておく。詳細は後ほど書く気がする。

マルコフ連鎖で前の文に似通った文字列を出力することで、小説っぽい文字列を生成するツールを作った。


f:id:soy-curd:20150502194914p:plain http://bungoo.herokuapp.com/Bungoo/

課題

現状、実行速度との兼ね合いで中島敦の「山月記」の文章しかリコメンドされない。リコメンドされたものをそのまま入力し続ければきっと山月記が完成するはず。

李陵・山月記 (新潮文庫)

李陵・山月記 (新潮文庫)

pythonのreduceについて

python複数の集合を以下のように作成して、

a = set([1,2,3])
b = set([2,3,4])
c = set([3,4,5])
set_list = [a, b, c]

これらの和集合を取り出す時、

x = reduce(set.union,set_list)    # {1, 2, 3, 4, 5}

みたいにreduceにunionを書けることを知った。どうしてもreduceで書きたい時は便利かもしれない。

プログラミングコンテストチャレンジブック買った

読み途中。各問題に対する解答例とC++ソースコードが載ってるので、暇なときにpythonに翻訳している。例えばしゃくとり法についてだと以下のようになる。

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

import sys

def main():
    print(syakutori())

# 総和がS以上となる
# 部分列の長さの最大値を求める
def syakutori():
    INF = sys.maxint

    n = 10                      # 数列aの長さ
    S = 15                      # 総和の最低値
    a = (5,1,3,5,10,7,4,9,2,8)  # 数列

    s = 0                       # 部分和の開始地点
    t = 0                       # 部分和の終了地点
    sum_x = a[0]                # 部分和の総和
    res = INF                   # 最小区間

    while(1):
        # tを伸ばしていく
        while(sum_x < S and t + 1 < n):
            t = t + 1
            sum_x = sum_x + a[t]

        if sum_x < S:
            break
        res = min(res, t - s + 1)

        # sを伸ばしていく
        s = s + 1
        sum_x = sum_x - a[s]

    return res

if __name__=='__main__':
    main()

やってると無限に時間が潰せるのでコスパが良い。

自分が今まで作ったプログラムを一覧にしてみた

自分が今まで作ったプログラムをまとめています。

soy-curd.hatenablog.com

続きを読む