Python3.6.3チュートリアル写経20171106
4.7.2 キーワード引数~4.7.5 ラムダ式をやった。
以下メモ
- 下記のような関数が書ける(argumentsは可変長引数、keywordsは可変長キーワード引数)
def cheeseshop(kind, *arguments, **keywords): print("-- Do you have any", kind, "?") print("-- I'm sorry, we're all out of", kind) for arg in arguments: print(arg) print("-" * 40) for kw in keywords: print(kw, ":", keywords[kw])
- リストをアンパックして関数に引数として渡せる(アンパックとは、リストの要素を前から順番に、仮引数に渡すこと)
def person(name, age): print(name, 'is', age, 'years old.') p = ['taro', 20] person(*p) # アンパック
- 辞書をアンパックして関数に引数として渡せる(このときは、キーワードを指定して引数をに値を渡していると考えられる)
def person(name, age): print(name, 'is', age, 'years old.') p = {'name': 'taro', 'age': 20} person(**p) # アンパック
- ラムダ式は、「lambda x: x + 1」という記法
# タプルのリストをタプルの2番目でソート a = [(1, 'kuma'), (2, 'neko'), (3, 'inu')] a.sort(key=lambda pair: pair[1]) a [(3, 'inu'), (1, 'kuma'), (2, 'neko')]
Python3.6.3チュートリアル写経20171104
Python チュートリアル — Python 3.6.3 ドキュメントを写経してる。 4.7.1 デフォルトの引数値までやった。
以下メモ。
- PythonのREPLはpythonよりもipythonの方が便利
- for文にelse節があり、breakするとelse節は実行されない
- 文字列はイミュータブル
- リスト、辞書はミュータブル
- 文字列はシングルクォート'で囲むか、ダブルクォート"で囲むか、ダブルクォート3つで囲む
- 文字列をシングルクォートで囲むときには、ダブルクォートをエスケープする必要がなくなり、ダブルクォートで囲むときには、シングルクォートをエスケープする必要がなくなる
- 文字列をダブルクォート3つで囲むとき、文字列内の改行がそのまま改行になる。また、"""に隣接しなければ、ダブルクォートをエスケープしなくても大丈夫っぽい
- for文内でリストを変更するときには、「for x in my_list[:]:」のようにしてリストをコピーする必要あり
- デフォルト引数は1回しか評価されなくて、リストや辞書などのイミュータブルなデフォルト引数は、関数呼び出しごとに変化してしまう。
ベイジアンネットワーク
身の回りでベイジアンネットワークなどの言葉をよく聞くようになった。 ベイジアンネットワークは、ビッグデータを解析して、ある現象が発生したときに、何が原因かを確率的に抽出する手法のようだ。
僕としては、このような手法に対して、本当にうまくいくのかな、と少し懐疑的だ。 原因を抽出するときに、プログラムは、おそらく、原因A1、原因A2、…、原因ANに対して、確率分布を出力するのだろう。 ところが、これらの原因の集合そのものは、人間があらかじめ用意してあげる必要があるのではないか。
また、この手法では、原因をノードとするネットワークを作るらしいのだが、ネットワーク構造を決めるアルゴリズムがあるらしい。
懐疑的でありつつも、わからないことばかりで、興味がわいてくる。
ab=0ならばa=0またはb=0
a, bは体の元とする.
すなわち .
のとき, aの乗法の逆元をとすると, 左から掛けて, となり, が成り立つ. よって,
同様に, のとき, .
以上より, .
メモ
Kings of convenienceで検索してたら、見つけたピアニストさんのブログ。
Pianist - Miki Ambo
エッセイが面白そう。
Haskellで凸包を求めるGraham Scanアルゴリズムを実装する
夏休みなので、Haskellのリハビリのために、「Real World Haskell」を読んでいます。 3章の練習問題に、平面上の点の集合の凸包を求めるGraham scanアルゴリズムを求めよ、という問題があります。
以下のように書きました。まだ、あまりテストしていません。 この本でQuick Checkを学んでテストしてみようと思います。
import Data.List data Point2D = Point2D { x::Int, y::Int } deriving (Eq, Show) data Direction = CounterClockWise | ClockWise | Collinier deriving (Eq, Show) -- 線分abの延長線上に点cがあるならば、Collinier -- 線分abの延長線の左側に点cがあるならば、CounterClockWise -- 線分abの延長線の右側に点cがあるならば、ClockWise -- ベクトルabとベクトルbcの外積のz座標の符号で上記を判定する direction :: Point2D -> Point2D ->Point2D -> Direction direction a b c | crossProductZ > 0 = CounterClockWise | crossProductZ < 0 = ClockWise | otherwise = Collinier where crossProductZ = abx * bcy - aby * bcx where abx = (x b) - (x a) aby = (y b) - (y a) bcx = (x c) - (x b) bcy = (y c) - (y b) -- 平面上の点の集合の凸包をGraham Scanアルゴリズムで求める convexHull :: [Point2D] -> [Point2D] convexHull xs = convexHullSub ys where ys = [p] ++ sortForGrahamScan p pRemoved ++ [p] where p = startPoint xs pRemoved = filter (\x->x/=p) xs convexHullSub :: [Point2D] -> [Point2D] convexHullSub (a:b:c:xs) | direction a b c == CounterClockWise = a:(convexHullSub (b:c:xs)) | otherwise = convexHullSub (a:c:xs) convexHullSub xs = xs -- 平面上の点をソートする -- 点pとソートする点を通る直線とx軸の成す角度の昇順でソートする sortForGrahamScan :: Point2D -> [Point2D] -> [Point2D] sortForGrahamScan p xs = sortBy compareAngle xs where compareAngle a b | cosVal a < cosVal b = GT | otherwise = LT where cosVal point = (fromIntegral pointX) / sqrt (fromIntegral (pointX * pointX + pointY * pointY)) where pointX = (x point) - (x p) pointY = (y point) - (y p) -- 点pを求める -- 点pはy座標が最小の点の中で、x座標が最小の点である startPoint :: [Point2D] -> Point2D startPoint xs = head (sortByCoordinates xs) where sortByCoordinates = sortBy compareXY where compareXY a b | (y a) < (y b) = LT | (y a) > (y b) = GT | (x a) < (x b) = LT | otherwise = GT
Markdownによるプレゼンテーション用スライド作成
0. 環境
ArchLinux
1. Pandocのインストール
sudo pacman -S pandoc
2. reveal.jsのインストール
git clone https://github.com/hakimel/reveal.js.git
3. スライドのMarkdownファイル作成
vim slide.md
4. Pandocによる変換
pandoc -t revealjs -s slide.md -o slide.html
slide.htmlは、git cloneしたreveal.jsディレクトリと同じディレクトリに配置します。
5. 確認
firefox slide.html