Python 3.9が登場!

この記事を読むのに約3分かかります。

Python 3.9が登場!

昨年、世界中の開発者がPython3.8の改善に取り組んできました。 Python 3.9ベータ版はしばらく前から存在しており、最初の公式バージョンは2020年10月5日にリリースされました。

すべてのPythonバージョンには、新しい開発と改善された機能が含まれており、Python3.9も例外ではありません。

Python3.9の主な新機能は次のとおりです。

1. 辞書(マージと更新)演算子

辞書は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'}

2. 文字列のプレフィックスとサフィックスを削除

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()の方が正確な場合があります。

3. zoneinfoタイムゾーンモジュール

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

4. 組み込みのコレクションタイプは、タイプのヒントに使用されます

タイプヒントでは、「typing」から対応する大文字のタイプ(ListやDictなど)をインポートしなくても、組み込みのコレクションタイプ(listやdictなど)を汎用タイプとして使用できるようになりました。

def greet_all(names: list[str])-> None:for name in names:print("Hello", name)

5. トポロジカルソート

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']

6. 最小共通多重(LCM)

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

7. より強力なPythonパーサー

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

Python 3.9が登場!
なぜpythonが人気なのか
Pythonは短いクロール音楽です
Pythonはゆっくりと衰退しています
pythonは解釈された言語ですか?
pythonは解釈された言語ですか
Pythonは短世界の流行マップです
Pythonは短い_SVMテストです
pythonコードは大文字と小文字を区別しますか
pythonのイントロスペクションとは何ですか
pythonのオブジェクト指向とは何ですか
Python変数スコープとは
pythonのリスト内包表記とは何ですか
pythonに関数のオーバーロードはありますか
Pythonのディープコピーは完璧ではありません
Pythonの判断は空のインスタンス共有です
Pythonはクロスプラットフォームの言語コードです
Pythonの用途は何ですか
python言語は無料ですか、それとも有料ですか?
Pythonのすべてがオブジェクトです
pythonはデータマイニングに適していますか
pythonクローラーは簡単に習得できますか
Pythonマルチスレッド
Python CookBook
python言語のアルゴリズムはありますか
Python3辞書
Python3モジュール
python(you-get)
Python文字列
Pythonの基本
Python記述子
Pythonの基本2
python変数の範囲は何ですか
Python exec
Pythonノート
Python3タプル
CentOS + Python3.6 +
Python Advanced(1)
Pythonデコレータ
Python IO
Pythonマルチスレッド
pythonのid関数は何ですか
Pythonツールチェーン
Pythonの匿名関数とは何ですか
Python3リスト
Pythonマルチタスク-日常
Pythonの概要
pythonの紹介
Pythonアナリティック
Pythonの基本
python3のピップパスはどこにありますか
07.Python3関数
Pythonの基本3
Pythonマルチタスクスレッド
自習用pythonに適したシステム
python開発の見通しは何ですか
Pythonのシーケンステーブルとは
Python関数
python sys.stdout
pythonの数値は可変型ですか
python演算子