Pythonの学びメモと自分へのtips
C++と同様に、setは、重複を許さずに、ソートされる。
ちなみに、「*」をつけると、生データを抜ける。
1 2 3 4 5 6 7 |
def main(): data = set([1,4,6,8,4,2,5]) print(*data) # 1 2 4 5 6 8 if __name__ == "__main__": main() |
オブジェクトも同様に、重複は許さずに、メモリの値を見てソートされる模様。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class Test: def __init__(self, num): self.__test = num @property def show_ini_num(self): return self.__test def main(): test1 = Test(3) test1_1 = test1 test2 = Test(1) test3 = Test(5) # <__main__.Test object at 0x000002387C59BDF0> # <__main__.Test object at 0x000002387C59BFD0> # <__main__.Test object at 0x000002387C59BF70> data_set = set([test1,test1_1,test2,test3]) # <__main__.Test object at 0x000002387C59BFD0> # <__main__.Test object at 0x000002387C59BFD0> # <__main__.Test object at 0x000002387C59BF70> # <__main__.Test object at 0x000002387C59BDF0> data_list = [test1,test1_1,test2,test3] print(*data_set) print(*data_list) if __name__ == "__main__": main() |
key入力の受けつけかた
方法①
1 |
user_in = input() |
方法②
1 |
user_in = sys.stdin.readline().strip() |
readlineは末尾の改行文字も読み取ります。
inputも同じように末尾の改行文字を読み取りますが、除去します。
特殊メソッド
__アンダーバーが2つで囲まれているもの__
ジェネレーター: yieldの実行手順
下記のようにyieldが沢山ある場合の実行順序、私は当初よく分からなかったです。
コツはyieldはreturn文と同じ扱い、という認識でしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import sys def gen_com(): while True: n = yield input("tell me your name:") print("y6") yield f'こんにちは、{n}さん!' print("y8") yield f'こんbannは、{n}さん!' if __name__ == '__main__': gen = gen_com() print(12, gen) print(13, sys.getsizeof(gen)) i = 0 for name in gen: print("name",name) res = gen.send(name.upper()) # 全て大文字化 print(res) print("i", i) i += 1 |
上記の場合は、下記のような実行結果になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
12 <generator object gen_com at 0x0000023B6F0CD970> 13 112 tell me your name:jj name jj y6 こんにちは、JJさん! i 0 y8 name こんbannは、JJさん! tell me your name:kk kk i 1 y6 name こんにちは、Noneさん! y8 こんbannは、Noneさん! i 2 tell me your name:jh name jh y6 こんにちは、JHさん! i 3 y8 name こんbannは、JHさん! tell me your name: |
for name in gen:の部分で、gen_com関数が実行されます。
その戻り値である、最初のyieldがinput(“tell me your name;”)を返します。
input関数の結果がnameに入ります。
そして、20行目で大文字化されたnameがgen_com関数に渡され、
次のyieldである、f’こんにちは、{n}さん!’
1 2 |
print("y6") yield f'こんにちは、{n}さん!' |
が返されます。
ここまでは、割と追いやすいと思います。
さて、gen_com関数は無限ループなので、main関数のfor文が回ります。
なので、for name in gen:の部分で、gen_com関数が実行されます。
この時は、
1 2 |
print("y8") yield f'こんbannは、{n}さん!' |
つぎのyieldである、yield f’こんbannは、{n}さん!’が戻されます。
なので、name こんbannは、JJさん!
が表示されます。
そして、
1 |
res = gen.send(name.upper()) # 全て大文字化 |
が実行されます。この時の戻り値は、最初のyieldに戻り、
1 |
n = yield input("tell me your name:") |
が実行されます。
さて、再びgen_com関数は無限ループなので、main関数のfor文が回ります。
なので、for name in gen:の部分で、gen_com関数が実行されます。
この時も先ほどと同様の流れで、次のyieldが返されますので、
1 2 |
print("y6") yield f'こんにちは、{n}さん!' |
が返されます。
・
・
・
というものをずっと繰り返していきます。
yield from命令
ジェネレーターの中で別のジェネレータを呼びだし、すべて値を列挙の後、自分自身のyieldを実行することができる。
requirements.txtについて
モジュールをインストールするときに使用する。
例えば、↓のように書く。
1 2 3 4 |
base58==1.0.3 ecdsa==0.13 Flask==1.0.2 requests==2.21.0 |
その後に、該当ディレクトリで、↓を実行。
1 |
pip3 install -r .\requirements.txt |
Windowsにおいては、管理者権限で実行した方がエラーが少ない(権限的に)
標準出力で辞書データを良い感じに出す方法
1 2 3 4 5 6 |
def pprint(dics): for i, dic in enumerate(dics): print(f'{"="*25} Dic{i} {"="*25}') for k, v in dic.items(): print(f'{k:15}{v}') print(f'{"*"*50}') |