Pythonの新しい割り当て代入表現3.8


Python 3.8は驚くべきことではありませんa bag of new features . このポストでは、私が本当に待っていたものだけを提示したいです:代入式!

問題
新しい解決策を見るときはいつも、問題を理解しなければなりません.
このコードをとりましょう
def f(s):
  result = s
  # ... do some stuff
  return result

def g():
  return True # for the sake of the example

t=input()
if f(t) and g():
  p = f(t)
  # do something with p
ここでは少なくとも2つの問題を識別できます.
  • 我々は、我々が書いたようにコード重複を持っているf(s) 同じ論理ブランチの一部です
  • 何が明白ですが、それはさらに悪いです、我々はちょうど書いていません、しかし、我々は二度F(s)を呼びます.同じ入力を持つと仮定しても、常に同じ出力を持っているので、関数は決定的であり、純粋であるかもしれません.どのような場合は、高価な計算をトリガ?さて、我々は2回それを行う.
  • 解決策があります、我々はF(s)を1度前に呼び出すことができますif ブロックし、変数の結果を保存!
    def f(s):
      result = s
      # ... do some stuff
      return result
    
    def g():
      return True # for the sake of the example
    
    t=input()
    p = f(t)
    if p and g():
      # do something with p
    
    それよりいいですか.まあ、それは異なります.
    一方で、あなたはビットを入力しますf(s) 高価な場合は、その高価な関数呼び出しを排除、それは素晴らしいです!
    一方で、外部にアクセス可能な変数があるif あなたがそれを使用したかったブロック.これは安全でないかもしれません.あなたの変数を検索するために長い連鎖コマンドを受け取る何かへのリファレンスとして作成することを想像してください.
    しかし、それを使用する前に、妥当性チェックをしたい.
    ifブロックの外に変数を作成する場合は、妥当性チェックを行う前に、後でその変数を使用したい場合(おそらく悪ふざけかもしれません)、再度妥当性検査を行わなければなりません.
    Python 3.8およびPEP 572 あなたはおそらく、常にそのような問題のために望んだ究極のソリューションを提供します.
    変数を作成するにはif ブロック全体がスコープである式.それは素晴らしいですか?このようなことができます.これまでの例で続けてください.
    def f(s):
      result = s
      # ...
      return result
    
    def g():
      return True # for the sake of the example
    
    t=input()
    if p:=f(t) and g():
      # do something with p
      print(p)
    
    全体でif 「ブロック」とはelse も含まれます.一般化するには、代入式で割り当てられた変数のスコープが現在のスコープになります.if、if、ifの場合、関数全体であれば、関数全体です.
    私も多くのように私は今ではリストの理解を簡素化することができますが好きです.次の例を見てください.
    inputs = [1, 2, 3, 56, 78, 42, 36, 54, 35, 99]
    numbers_and_int_square_roots = {k: int(math.sqrt(k)) for k in inputs if int(math.sqrt(k)) == math.sqrt(k)}
    print(*numbers_and_int_square_roots.items())
    
    それで、我々は数のリストを取ります、そして、我々は整数の正方形であるものを保ちたいです、そして、我々も彼らの二乗と非二乗の価値を保ちたいです.私たちは二度と平方根を計算する必要があります!
    私がその発電機式で平方根を保存することができるならば!おお、見よ、今できる.
    inputs = [1, 2, 3, 56, 78, 42, 36, 54, 35, 99]
    numbers_and_int_square_roots = {k: v for k in inputs if (v:=int(math.sqrt(k))) == math.sqrt(k)}
    print(*numbers_and_int_square_roots.items())
    
    それは私にちょうどクールです!以下の入力、少ない計算、高速実行!
    あなたはどう思いますか.

    結論
    Python 3.8 紹介assignment expressions これは、我々が我々が常に望んでいた場所で新しい変数を作成することができますが、決して使用できない方法で.おそらく、この新しい機能を使用する最善の方法は、新しい変数をif また、そのブロックのスコープで使用します.
    詳細については、仕様を読むことができますhere .
    オンライン通訳として、あなたが使うことができる瞬間this .
    そして、あなたがpython 3をインストールしたいならば.8ローカルでは、参照することができます
    ハッピーコーディング!
    この記事は私の元に掲載されているblog . あなたが私の最新の記事を受け取ることに興味があるならばsign up to my newsletter および.