python 自分用メモr3 ソート,decorator,mp3

##実行環境

* MacBook Air (11-inch, Mid 2012)
* JupyterLab (from Anaconda)
* Python 3.6.4

##参考
自動実行とshファイルについて
https://qiita.com/yuukiclass/items/53da5b284d695c5a5461
mp3再生
https://nwpct1.hatenablog.com/entry/2013/10/19/161008
cronにおける自動実行
http://make.bcde.jp/raspberry-pi/%E6%B1%BA%E3%81%BE%E3%81%A3%E3%81%9F%E6%99%82%E9%96%93%E3%81%AB%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B/
マージソートの概念
https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88

##Bubble sort

```py

def buble_sort(lst):
    for x in range(len(lst)):
        for y in range(x, len(lst)):
            if lst[x] > lst[y]:
                a = lst[x]
                lst[x] = lst[y]
                lst[y] = a
    return lst
```
1. 1つの要素とほか全ての要素を比べる。小さかったら入れ替える。
2. 調べたらバブルソートっていうらしい。

##Merge sort

```py
def merge_sort(lst):
    if len(lst) > 1:
        left = merge_sort(lst[:int(len(lst)/2)])
        right = merge_sort(lst[int(len(lst)/2):])
        lst = []
        while True:
            #どっちか空のとき
            if not left or not right:
                lst.extend(left if left else right)
                break
            if left[0] > right[0]:
                lst.append(right.pop(0))
            else:
                lst.append(left.pop(0))
    return lst
```
1. 自力のみでwikipediaのgifだけを参考に、できたら良かったね。途中でタイムパトロールに捕まる。ちょっと調べて再帰的にやるっぽいと知る。再帰ってなんだよ。頭の中で動かすたびに頭カンダタ。forでもwhileでもないループもあるんだよ。かなり時間かかった。
2. マージソートとは？　A. でかい箱をまず小さく小分けしていく。分けたら全体を２つずつに区切る。最初は要素2個同士を比較、２つ入る箱へ順番に入れる。全部入れ終わったら、要素2個もつ箱がいっぱいある。次はこの要素2つもつ箱同士で比較して、小さい順に要素が4つ入る箱に入れる。すると要素を4つもつ箱がけっこうできる。次は4つと4つの箱で比較。順番に8個の箱へ…。繰り返す。

蛇足：
他の人のコード探してるときに見つけたこれ。
https://qiita.com/woolon/items/4cff50de7e697cb2664f
動かない。言うべきか迷ったけど一年以上前だしなぁ。
python2とかだと動くのか？


##Decorator

```py
def decorater_func(func, x=1, y=1):
    
    def warp_func():
        a = [1,2,3,4]
        a.append(func(x,y))
        return a
        
    return warp_func

@decorater_func #2
def modf(x, y):
    return x+y

type(modf)
>>><function __main__.decorater_func.<locals>.warp_func>
```
1. pythonにおいて全てのものはobject。関数もobject。ゆえに関数を別の変数に割り当てることもできる。
2. 関数を引数にとって、関数を返すfunctionで、コードを追加したり包んだりできる。コードを追加される側の関数の上に、`@関数名`で追加できる。
3. FlaskとかDjangoとかフレームワークでよく使われる概念らしい。


##あとがき
terminal上で

```
afplay -r 1.5 -q 1 "再生したいmp3へのpath"
```
絶対パス渡せばmp3再生できるんすねぇ。`r`直後の数字変えると再生速度が変わる。1.5は1.5倍速度。限界は知らん。0.5倍速もできる。`q`はクオリティ、音質。とりあえず1でいいんだ。
これとpythonでアラームつくろおもたけど、調べたら上の文を記述したhoge.shファイルを作って、cron上で`00 9 * * * sh /Users/我輩の名前/Music/hoge.sh`やったほうが楽やった。
`.py`作っても結局cronに時間の指定が必要？
常駐しているアプリとかなら毎分`datetime.now()`をチェックするアプリを作ればいいのかな。常駐するアプリの作り方知らんけどな！

```py
import pygame, os, time, random
from datetime import datetime

mp3 = [x for x in os.listdir() if x[-4:]==".mp3"]
def wakeup(hour, minute):
    now = datetime.now()
    if now.hour == hour and now.minute == minute:
        pygame.mixer.init()
        pygame.mixer.music.load(random.choice(mp3))
        pygame.mixer.music.play(2)

if __name__=="__main__":
    hour = 8
    minute = 30
    d = hour - datetime.now().hour
    while True:
        wakeup(hour, minute)
        if d>1:
            time.sleep((d-1)*3600)
        if d<0:
            time.sleep((23+d)*3600)  
```
ゴリ押しでも多分なんとかなる。

##真・あとがき
浅いところで泳いでいたらいつの間にか遠くまで来ていたスタイルでどうぞ。
砂漠行きたい。星みたい。