python 備忘録

## python バージョン確認 
```
python -V
```
## pip 一覧
```
pip freeze
pip list
```
https://note.nkmk.me/python-pip-list-freeze/

### 警告が出るとき
```
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
```
パッケージをグローバルインストールすることでパッケージがコンフリクトするリスクがあることの警告。
→ pip installには<b>グローバルインストール</b>(デフォルト)と--userをオプションに付ける<b>ローカルインストール</b>が存在する。
そのまま放っておけばインストールが開始される。

## コメントアウト
```py
# 1行コメントアウト シャープ
'''
複数行
コメントアウト
シングルクォーテーション3つ
'''
```

## pythonファイル実行
```
cd /設置場所
./ファイル名.py
```
## 関数の呼び出し
|説明|備考|
|----|----|
|python3 -c "import ファイル名; ファイル名.関数名()"|ファイル名に拡張子(.py)は不要<br>パラメータはシングルクォーテーションで囲うこと|
```

python3 -c "import PythonFileName; PythonFileName.DefName('para1','para2')"

```
## 関数定義
```def_test.py
def sample():
  print "def_test"
sample()
```
### 注意 NameError
関数を定義前に呼び出すとNameErrorが発生する
```NameError_test.py
# NameError: name 'sample' is not defined
sample()
def sample():
  print "def_test"
```
## ダンダー  \_\_name\_\_
|説明|\_\_name\_\_ の中身|ファイル名|
|----|----|----|
|呼び出す側|\_\_main\_\_|sample01.py|
|呼び出される側|sample02|sample02.py|

```
python sample01.py
```
```sample01.py
import sample02
def main():
	sample02.function()
if __name__ == "__main__":
	print("sample01 __name__ → " + __name__ )
    #sample01 __name__ → __main__
	main()
```
```sample02.py
def function():
    print("sample02 __name__ → " + __name__ )
    #sample02 __name__ → sample02
```

## 文字列
### 長さ
```py
w="こんにちは"
print(len(w))

#結果:5
```
### 切り取り
|こ|ん|に|ち|わ|。|
|----|----|----|----|----|----|
|0|1|2|3|4|5|
|-6|-5|-4|-3|-2|-1|
```py
w="こんにちは"
print(w[0])
print(w[1:2])
print(w[-3:])

#結果
#こ
#んに
#ちわ。
```
## if
```
if 条件式1:
    print("条件式1が真の時に実行する文")
elif 条件式2:
    print("条件式1が偽で条件式2が真の時に実行する文")
elif 条件式3:
    #何もしない場合は「pass」がないと「IndentationError」が発生する
    pass
else:
    print("すべての条件式が偽のときに実行する文")
```
|比較|記述|備考|
|----|----|----|
|完全一致（等価）|==, !=||
|部分一致| in, not in||
|前方一致・後方一致（先頭・末尾）| startswith(), endswith()||
|文字列の大小関係（順番）| <, <=, >, >=||
|正規表現パターンにマッチ| re.search(), re.fullmatch()|print(re.search('a', 'a-b-c'))※|

<b>※ trueなら「re.Match object; span=(x, x), match='xxx'」 ,falseなら「None」が返されるが、if文でも使用可能</b>

参考文献

https://www.javadrive.jp/python/if/index1.html

https://note.nkmk.me/python-str-compare/

## for
### 回数指定
```py
for i in range(3):
    print("test:" + str(i))
# test:0 test:1 test:2

words = ['a', 'b', 'c']
for w in words:
    print ("test:" + w)
# test:a test:b test:c
```

### TypeError
string型 と int 型 を連結すると TypeErrorが発生する
→ str(i) とすることでキャストできる。
```python
print("test" + i)
```
## replace
```py
str = 'aaa ddd ccc'
print(str.replace('ddd', 'bbb'))
# aaa bbb ccc
```
### 正規表現で置換
```py
str = 'testStr'
print(re.sub('test*','replaceSample', str))
#replaceSample
```
re.sub('正規表現','置換文字',適用する文章)





## split
```py
str = 'aaa|ddd|ccc'
print(str.split('|'))
#['aaa', 'ddd', 'ccc']

print(str.split('|')[0])
#aaa
```
## try catch 
### 例外全て
```python
def sample():
    try:
        raise Exception
    except:
        traceback.print_exc()
        print('Error')
```

### 特定の例外+例外全て
```python
def sample():
    try:
        #raise Exception
        raise ValueError("error!")

    except ValueError as e:
        print('ValueError:', e)
    except:
        traceback.print_exc()
        print('Error')
```
### ポイント
|項目|説明|備考|
|----|----|----|
|traceback.print_exc()|エラー時のスタックトレースを表示する||


## ファイル読み込み
```py
#closeは自動で処理される
with open("book.txt", "r") as fileread:
  print(fileread.read())
```

## ファイルの書き込み　w:新規作成＆上書き

```py
with open('ファイル名','w')as f
    f.write('文字列')
```

## subprocessの戻り値を加工してファイル書き込み
```py
with open('myfile.txt', 'w')as f:
    cp = subprocess.run(['free'], encoding='utf-8', stdout=subprocess.PIPE)
    #freeコマンドの結果をcsv形式に変換
    cp.stdout = (re.sub(' +',',',cp.stdout))
    print(cp.stdout)
    f.write(cp.stdout)
```

### 正規表現の置換
re.sub('正規表現','置換文字',適用する文章)
 
https://qiita.com/YuichiTanaka007/items/ab408c4860d2f433b7f3#%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A7%E7%BD%AE%E6%8F%9B

## subprocessの結果をファイルに書き込み

```py
import subprocess

with open('out.txt', 'w') as fp:
  subprocess.run(['ls', '-1'], stdout=fp)
```
詳細

https://qiita.com/YuichiTanaka007/items/ebab08b733feff259b51

## シングルトン実装
```py
    singleton = None
    def __new__( cls, *args, **kwargs ):
        #1回目のクラス生成（クラスインスタンスが無ければ作成する）
        if cls.singleton == None:
            cls.singleton = super().__new__( cls )
        #クラスのインスタンスを返す
        return cls.singleton
```
https://lightgauge.net/language/python/8546/