ガリレオシリーズの9冊目。全て読んでいたつもりが、読み忘れていた一冊でした。
これで全ての謎が解けたと思ったところで、もう一段ロケットエンジンに点火するように物語が展開していくところがすごいですね。
9月には映画が公開されるとのこと、どのように映像化されているのか楽しみです。
「Pythonエンジニア育成推進協会監修 Python実践レシピ(4) - Mae向きなブログ」の続きです。
ipdb を使ったデバッグをするときに、同じディレクトリに以前作成したdecorator.py
があると、これが悪さをしているようでした。decorator.py
をリネームすると動作するように。
アルゴリズムの違いによる性能差を測るときなどに使いそうなのでメモ。以下は、foo()
関数を10回(number
回)呼んだときにかかる時間を計測している。以下を実行すると、1.045367584
と表示された。
import time import timeit def foo(): time.sleep(0.1) print(timeit.timeit('foo()', globals=globals(), number=10))
cryptography
は、暗号化、復号を提供するライブラリである。RSAを使用する場合、より深い知識を身につけたうえで使用することが推奨されている。
1から50までの和を1~10, 11~20, 21~30, 31~40, 41~50の5つのタスクに分けて実行する。それぞれのタスクは、sec
秒かかるようにしている。
import asyncio from time import time async def part_of_sum(f, t, sec): await asyncio.sleep(sec) # 時間がかかる処理 return sum([i for i in range(f, t+1)]) async def main(): start = time() tasks = [ asyncio.create_task(part_of_sum( 1, 10, 3)), # 1から10までの和を3秒かけて求める asyncio.create_task(part_of_sum(11, 20, 2)), # 11から20までの和を2秒かけて求める asyncio.create_task(part_of_sum(21, 30, 1)), # 以下、同様 asyncio.create_task(part_of_sum(31, 40, 5)), asyncio.create_task(part_of_sum(41, 50, 4)) ] results = await asyncio.gather(*tasks) print(f"{sum(results)}") print(f"time: {time() - start}") asyncio.run(main())
それぞれの部分を求めるのに、3秒+2秒+1秒+5秒+4秒かかるので、逐次処理だと15秒かかることになるが、実行してみると5秒で実行できていることから、並行処理ができている。
1275 time: 5.002140998840332
こんなことは現実ではあり得ないというストーリーですが、だからこそ小説を読む楽しみがあるんだろうと思います。最後はいい感じで物語を終えることができたので読後感は良かったですが、本作品を通して、虐待の問題など考えなければならないですね。
来年度の行事予定の雛形などを作成するときに、祝日を調べる必要があるのですが、Pythonの勉強がてら作ってみました。
来年(2023年)は、土曜と祝日が重なる日が3回ありますね。ちょっと損した気分です。
% python holidays.py -y 2023 2023/01/01(Sun) 元日 2023/01/02(Mon) 元日 振替休日 2023/01/09(Mon) 成人の日 2023/02/11(Sat) 建国記念の日 2023/02/23(Thu) 天皇誕生日 2023/03/21(Tue) 春分の日 2023/04/29(Sat) 昭和の日 2023/05/03(Wed) 憲法記念日 2023/05/04(Thu) みどりの日 2023/05/05(Fri) こどもの日 2023/07/17(Mon) 海の日 2023/08/11(Fri) 山の日 2023/09/18(Mon) 敬老の日 2023/09/23(Sat) 秋分の日 2023/10/09(Mon) スポーツの日 2023/11/03(Fri) 文化の日 2023/11/23(Thu) 勤労感謝の日
「Pythonエンジニア育成推進協会監修 Python実践レシピ(3) - Mae向きなブログ」の続きです。
RequestsはPythonでWebスクレイピングを行う際の定番ツール。
>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r <Response [200]> >>> r.text '{\n "args": {}, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate, br", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.27.1", \n "X-Amzn-Trace-Id": "Root=1-6296bdfc-46a5dc44551a4801724bfd6b"\n }, \n "origin": "172.29.0.1, 219.103.2.254", \n "url": "http://httpbin.org/get"\n}\n' >>> r.url >>> r.ok True >>> r.json() {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.27.1', 'X-Amzn-Trace-Id': 'Root=1-6296bdfc-46a5dc44551a4801724bfd6b'}, 'origin': '172.29.0.1, 219.103.2.254', 'url': 'http://httpbin.org/get'}
HTMLのclass属性は、Pythonの予約語との衝突を防ぐためclass_='class名'
のように末尾に_
を指定する。
>>> from bs4 import BeautifulSoup >>> from urllib import request >>> soup = BeautifulSoup(request.urlopen('https://www.python.org')) >>> soup.find_all('h1') [<h1 class="site-headline"> <a href="/"><img alt="python™" class="python-logo" src="/static/img/python-logo.png"/></a> </h1>, <h1>Functions Defined</h1>, <h1>Compound Data Types</h1>, <h1>Intuitive Interpretation</h1>, <h1>Quick & Easy to Learn</h1>, <h1>All the Flow You’d Expect</h1>] >>> soup.find_all('h1', class_='site-headline') [<h1 class="site-headline"> <a href="/"><img alt="python™" class="python-logo" src="/static/img/python-logo.png"/></a> </h1>] >>> soup.find_all('h1', attrs={'class': 'site-headline'}) [<h1 class="site-headline"> <a href="/"><img alt="python™" class="python-logo" src="/static/img/python-logo.png"/></a> </h1>]
doctestを使った方法はシンプルでいいですね。
""" 与えられた引数について、a / b を行う関数です >>> div(5, 2) 2.5 """ def div(a, b): """ 答えは小数で返ってきます >>> [div(n, 2) for n in range(5)] [0.0, 0.5, 1.0, 1.5, 2.0] """ return a / b
以下、実行結果です。-m doctest -v
をつけて実行すると、doctest.testmod()
を書いていないコードのdoctestをコマンドラインで実行できる。
% python sample_doctest.py % python -m doctest -v sample_doctest.py Trying: div(5, 2) Expecting: 2.5 ok Trying: [div(n, 2) for n in range(5)] Expecting: [0.0, 0.5, 1.0, 1.5, 2.0] ok 2 items passed all tests: 1 tests in sample_doctest 1 tests in sample_doctest.div 2 tests in 2 items. 2 passed and 0 failed. Test passed.
説明力とは大まかに言って、次の3つの力によって構成されているとのこと。
とくに「要約力」の凄さを実感したのは、ハイデッガーの『存在と時間』で言いたかったことを、小学校4年生にわかるように齋藤孝先生が説明した以下の文。本当に説明力がある人は、相手が小学生だろうが、ビジネスパーソンだろうが、どんな人に対しても上手い説明ができるという例示にもなっていますね。
「人間というのは時間がとても大事な生き物でです。なぜなら、人間の生きる時間は限られているからです。 他の動物は生きて、生きて、結果、死ぬわけで、そんなに死ぬいことばかりを考えているわけではありませんが、人間は『自分がいつか死ぬ』ということをわかって生きているところが違います。 死を意識して生きているからこそ、いずれ死ぬのであれば、もう少し充実して生きようとか、もっと全力を尽くして生きようとか、そういうふうになるのが本来の人間の姿ではないかというふうに言ったのが、ハイデッガーなのです」
時間感覚については、「意味の含有率」が高い話し方というフレーズが印象的。15秒単位のなかにどれだけの意味が詰め込まれているかが大事とのこと。「15秒なのにこんなに詰まっている」という、砂金がたくさん入った砂のような話し方(これも例示)を目指したいですね。