“
この記事を読むのに約3分かかります。
”
Python 3.9が登場!
昨年、世界中の開発者がPython3.8の改善に取り組んできました。 Python 3.9ベータ版はしばらく前から存在しており、最初の公式バージョンは2020年10月5日にリリースされました。
すべてのPythonバージョンには、新しい開発と改善された機能が含まれており、Python3.9も例外ではありません。
Python3.9の主な新機能は次のとおりです。
辞書はPythonの最も基本的なデータ構造の1つであり、Pythonバージョンの反復により、パフォーマンスは継続的に最適化されています。
Python3.9では、マージ( |
)および更新( | =
)演算子が dict
クラスに追加されました。これらの更新により、既存の dict.update
および{** d1、** d2}
メソッドが完了します。
辞書をマージする従来の方法:
>>> pycon ={2016:"Portland",2018:"Cleveland"} #辞書1>>> europython ={2017:"Rimini",2018:"Edinburgh",2019:"Basel"} #辞書2
# 方法1
>>>{**pycon,**europython}{2016:'Portland',2018:'Edinburgh',2017:'Rimini',2019:'Basel'}
# 方法2
>>> merged = pycon.copy()>>>for key, value in europython.items():... merged[key]= value
...>>> merged
{2016:' Portland',2018:'Edinburgh',2017:'Rimini',2019:'Basel'}
これらの方法はどちらも、元のデータを変更せずに辞書を組み込んでいます。辞書1の「クリーブランド」は、マージされた辞書2の「エディンバラ」によって上書きされていることに注意してください。
辞書1を更新することもできます。
>>> pycon.update(europython)>>> pycon
{2016:' Portland',2018:'Edinburgh',2017:'Rimini',2019:'Basel'}
新しいバージョンのPythonでは、merge( |
)とupdate( | =
)の2つの新しい辞書演算子が導入されています。 |
を使用して2つの辞書をマージし、 | =
を使用して辞書を更新できます。
>>> pycon ={2016:"Portland",2018:"Cleveland"}>>> europython ={2017:"Rimini",2018:"Edinburgh",2019:"Basel"}>>> pycon | europython #マージ
{2016:' Portland',2018:'Edinburgh',2017:'Rimini',2019:'Basel'}>>> pycon |= europython #更新
>>> pycon
{2016:' Portland',2018:'Edinburgh',2017:'Rimini',2019:'Basel'}
d1 | d2
と {** d1、** d2}
は同様の機能を持っています。どちらも辞書をマージして結合を取得するために使用されます。同じキーが検出されると、後者が前者を上書きします。
|
を使用する利点の1つは、辞書のようなタイプに適しており、マージ後に元のタイプを保持することです。
>>> from collections import defaultdict
>>> europe =defaultdict(lambda:"",{"Norway":"Oslo","Spain":"Madrid"})>>> africa =defaultdict(lambda:"",{"Egypt":"Cairo","Zimbabwe":"Harare"})>>> europe | africa
defaultdict(<function<lambda> at 0x7f0cb42a6700>,{'Norway':'Oslo','Spain':'Madrid','Egypt':'Cairo','Zimbabwe':'Harare'})>>>{**europe,**africa}{'Norway':'Oslo','Spain':'Madrid','Egypt':'Cairo','Zimbabwe':'Harare'}
|=
役割は、 .update()
と同様に、辞書を更新することです。
>>> libraries ={..."collections":"Container datatypes",..."math":"Mathematical functions",...}>>> libraries |={"zoneinfo":"IANA time zone support"}>>> libraries
{' collections':'Container datatypes','math':'Mathematical functions','zoneinfo':'IANA time zone support'}
|=
更新には、辞書のようなデータ構造を使用することもできます。
>>> libraries |=[("graphlib","Functionality for graph-like structures")]>>> libraries
{' collections':'Container datatypes','math':'Mathematical functions','zoneinfo':'IANA time zone support','graphlib':'Functionality for graph-like structures'}
Python 3.9では、 .removeprefix()
と .removesuffix()
を使用して、それぞれ文字列の先頭または末尾を削除できます。
>>>" three cool features in Python".removesuffix(" Python")'three cool features in'>>>"three cool features in Python".removeprefix("three ")'cool features in Python'>>>"three cool features in Python".removeprefix("Something else")'three cool features in Python'
.strip
メソッドも可能であると言う人もいますが、このメソッドは誤って削除されます。
>>>" three cool features in Python".strip(" Python")'ree cool features i'
ご覧のとおり、明らかに末尾のpythonを削除したいのですが、先頭の-Thの一部も削除されています。
したがって、 .removeprefix()
と .removesuffix()
の方が正確な場合があります。
zoneinfoはpython3.9で新しく導入されたモジュールであり、zoneinfoはInternet Assigned Numbers Agency(IANA)タイムゾーンデータベースにアクセスできます。 IANAは、データベースを年に数回更新します。これは、タイムゾーン情報の最も信頼できるソースです。
zoneinfoを使用すると、データベース内の任意のタイムゾーンを説明するオブジェクトを取得できます。
>>> from zoneinfo import ZoneInfo
>>> ZoneInfo("America/Vancouver")
zoneinfo.ZoneInfo(key='America/Vancouver')
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # 夏の時間
>>> dt =datetime(2020,10,31,12, tzinfo=ZoneInfo("America/Los_Angeles"))>>>print(dt)2020-10-3112:00:00-07:00>>> dt.tzname()'PDT'>>> #標準時
>>> dt +=timedelta(days=7)>>>print(dt)2020-11-0712:00:00-08:00>>>print(dt.tzname())
PST
タイプヒントでは、「typing」から対応する大文字のタイプ(ListやDictなど)をインポートしなくても、組み込みのコレクションタイプ(listやdictなど)を汎用タイプとして使用できるようになりました。
def greet_all(names: list[str])-> None:for name in names:print("Hello", name)
Python 3.9は、トポロジカルソートを実行するための関数を提供する graphlib.TopologicalSorter
クラスを含む新しいモジュールgraphlibを追加します。
>>> dependencies ={..."realpython-reader":{"feedparser","html2text"},..."feedparser":{"sgmllib3k"},...}...>>>from graphlib import TopologicalSorter
>>> ts =TopologicalSorter(dependencies)>>>list(ts.static_order())['html2text','sgmllib3k','feedparser','realpython-reader']
Pythonは、2つの数値の最大共通除数(GCD)関数を計算するために長い間使用されてきました。
>>> import math
>>> math.gcd(49,14)7
最小共通倍数(LCM)は、最大共通除数(GCD)に関連しています。LCMは、GCDに従って定義できます。
>>> def lcm(num1, num2):...if num1 == num2 ==0:...return0...return num1 * num2 // math.gcd(num1, num2)...>>>lcm(49,14)98
Python 3.9では、独自のLCM関数を定義する必要がなくなり、最も一般的でない倍数を計算する関数が追加されました。
>>> import math
>>> math.lcm(49,14)98
Python 3.9の最も優れた機能の1つは、日常のプログラミングでは気付かない機能です。これは、パーサーの更新です。パーサーは、Pythonインタープリターの基本コンポーネントです。最新バージョンでは、パーサーが再構築されています。
Pythonは以前、LL(1)パーサーを使用してソースコードを解析ツリーに解析していました。 LL(1)パーサーは、一度に1文字を読み取り、バックトラックせずにソースコードを解釈するパーサーと考えることができます。
新しいインタープリターは、LL(1)ではなく、PEG(式の文法の解析)に基づいています。新しいパーサーのパフォーマンスは古いパーサーのパフォーマンスに匹敵します。新しい言語関数を設計する場合、PEGはLL(1)よりも柔軟性があります。
標準ライブラリ全体で、PEGパーサーはわずかに高速ですが、より多くのメモリを使用します。実際、新しいパーサーを使用する場合、パフォーマンスを認識することは困難です。
参照:realpython、pythonドキュメント
推奨読書
1
[ Pythonがswitchステートメントをサポートしないのはなぜですか? ](http://mp.weixin.qq.com/s?__biz=MzIzNzA4NDk3Nw==&mid=2457741065&idx= "sn = 2a44ea68909191d695bb4b018e2df947&chksm = ff448f57c8330641262bf5155c2fa04946d88d16
2
[ Linux!なぜ彼はこんなに強力なシステムを一人で書いたのに、中国はそれができないのでしょうか? ](http://mp.weixin.qq.com/s?__biz=MzIzNzA4NDk3Nw==&mid=2457741059&idx=1&sn=db9004aa4d26a165a9a55dc0542b221a&chksm=ff448f5dc833064b52ff88988562a111aff3909b893
3
[ すばらしいトリック:サーバーのテキストをsshのローカルコンピューターにコピーします](http://mp.weixin.qq.com/s?__biz=MzIzNzA4NDk3Nw==&mid=2457741049&idx=2&sn=c91ec7250cb3a41b2d9f924dc3014090&chcksm= )
4
[ 超完成! Pythonの200の標準ライブラリを整理しました](http://mp.weixin.qq.com/s?__biz=MzIzNzA4NDk3Nw==&mid=2457741042&idx=1&sn=5c25ce6562e1611691d59499c8db3a89&chksm=ff78eaccenebc26d26df78eacc
Recommended Posts