うちぱらららららr

プログラミングやその周辺のことを主に書きます。

Pythonのdocoptっていうライブラリが良さ

こんにちは〜〜〜, 筋肉痛中の@u_chi_ha_ra_です.

某韻を踏むアプリケーションを作っている際にコマンドライン引数の処理をなんかいい感じにやりたいな〜〜〜みたいな気持ちで適当に調べていたら良さげなものがあったので一応紹介です!w
韻を踏むやつ↓ github.com

main

github.com docopt—language for description of command-line interfaces
これです.(今更)

実行環境

OS : 
     Manjaro 17.0.2
version :
     pyenv 1.1.2-2
     python3.6

インストー

pip install docopt

でインストール.

使ってみる

__doc__ = """
Usage:
    hoge.py [-h] [--show] [--hello] N

Options:
    -h --help   show this help message 
    --show      show result
    --hello     Hello World
"""

from docopt import docopt

def main():
    args = docopt(__doc__)
    n = args["N"]
    
    if args["--show"]:
        print(n)
    if args["--hello"]:
        print("Hello World")

if __name__ == "__main__":
    main()
$ python hoge.py --hello
Hello World

$ python hoge.py --show hoge
hoge

$ python hoge.py
Usage:
    hoge.py [-h] [--show] [--hello] N

こんな感じで使えます.
使いやすい〜〜!

だいぶポ!wっとかけていい感じです

公式のUsageとかみるとわかりやすいはずです. 以上です.

最後

pythonCLIアプリケーションを書くときめっちゃ便利そうだなあと思いました.

python力をあげたいのでpythonCLIの何かをじゃんじゃん書いていきたいです ><

(ここで言うpythonはすべてpython3のことです)

Linuxbrewでpython3をinstallしようとするとunzipで怒られる.

タイトル通りです.

brew install python3

こうすると怒られます><

OSやLinuxbrewのversionはこんな感じです.

Description: Ubuntu 16.04.2 LTS  
Homebrew 1.2.2
Homebrew/homebrew-core (git revision 55e6d; last commit 2017-07-01)

エラー内容は以下の通り.

Error: Failure while executing: unzip -qq -q /home/user/.cache/Homebrew/python3--setuptools-32.2.0.zip

解決策(対応策)

linuxbrewでinstallされた(~/.linuxbrew/bin内の)unzipを消してもう一度installを進めるといけました.

うーむ()

多分他のunzipを使うやつでもエラー出ると思うので,毎回同じことするとかだとあれなので解決策知ってる方いたら教えてください><

Goのスライスの要素の削除について

Golangにスライスの要素を削除する関数がない

Goを書いているときにスライスの要素を消してやりたいぜ…みたいな感じで使いたくなり調べてみたら,Goにはスライスの要素を削除する関数がないということでした(ぱっと調べた感じ)

なので,簡単に実装してみました.

Hoge

index番号を指定して値を消すやつ(Pythonのpopてきな)

package main

import "fmt"

func pop(slice []int, search int) []int {
    result := []int{}
 
    for i, s := range slice {
        if i != search - 1 {
            result = append(result, s)
        }
    }
    return result
}

func main() {
    list := []int{0, 12, 3, 7, 5, 9}
    fmt.Println(list)

    list = pop(list, 2)
    fmt.Println(list)
}

Poyo

値を指定するとその値を消してくれるやつ(Pythonのremoveてきな)

指定した値がスライスに二つ以上ある場合はそいつらも消えます.

package main

import (
    "fmt"
)

func remove(slice []int, search int) []int {
    result := []int{}

    for _, v := range slice {
        if v != search {
            result = append(result, v)
        }
    }
    return result
}

func main() {
    list := []int{1, 2, 3, 4, 5, 6}
  fmt.Println(list)
 
  list = remove(list, 3)
  fmt.Println(list)
}

動かないとかここおかしいとかこうしたほうがいいよとか関数ありますとかあったら教えてくれるとうれしいです.

二分探索 ~hogehoge~

ほ GE 

新年あけましておめでとうございます().

新年初の記事です.

いつの間にか年が明けたと思ったら,新学期が始まっていました.かなしいですね.まあ,頑張っていきましょう.

今年は,文章力や語彙力などを上げるためになるべく記事を書いていこうと思います.

ぽよ

ふとアルゴリズムとデータ構造を勉強したいなとおもったのでいい感じに書いていこうと思います.なるべく続けていくぞ~~.

二分探索ってなんやねん

二分探索とは…

https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2

らしいです.

Sort済みの配列を半分にして真ん中の値をとり,探したい値より小さいか大きいかを判定してうぇ~~~ってしてそこからまた繰り返すみたいな感じですね.

実装

Python3で実装してみます.

def binary_search(list1, search):
    '''
    探索して見つかった場合は配列の番号を返し,
    見つからない場合はNoneを返す.
    '''
    low = 0
    high = len(list1) - 1

    while low <= high:
        mid = (low + high) // 2  #中央の値

        if search == list1[mid]: # 一致した場合
            return mid
        if search > list1[mid]: # 小さかった場合
            low = mid + 1
        else:                   # 大きかった場合
            high = mid - 1

    return None            # なかった場合

def main():
    print(binary_search(list(range(20)), 3))  #0~19の中に3があるか
    print(binary_search(list(range(20)), -1)) #0~19の中に-1があるか

if __name__ == '__main__':
    main()

わかりにくい場合は図をかきながらやってみるといいかもしれないです.

おわり

解説のはwikipediaに丸投げですね.
文章でいい感じに説明できるようになりたいです ><.

変なところやくそっぽいところがあったら教えてくれるとうれしいです><