“A quitter never wins and a winner never quits” — Napoleon Hill
ガベージコレクションは、実行中のプログラムで将来アクセスできなくなるデータオブジェクトを見つけ、それらのオブジェクトによって使用されるリソース(特にメモリ)を再利用するプロセスです。自動ガベージコレクション用の言語-Java、C#、Python、およびほとんどのスクリプト言語。 Cはガベージコレクションのない言語です。プログラマーは、いつメモリを割り当てて再利用するかを知る必要があります。
前回の記事を参照してください:[1年間Pythonを学び、今回はようやく浅いコピーと深いコピーを理解しました](https://links.jianshu.com/go?to=https%3A%2F%2Fyuzhoustayhungry.github.io%2Fpost%2F%25E6%25B7%25B1%25E6%258B%25B7%25E8%25B4%259D%25E5%2592%258C%25E6%25B5%2585%25E6%258B%25B7%25E8%25B4%259D%2F)
Q:浅いコピーと深いコピーの違いは何ですか?
回答:
copy.copy(x)
とcopy.deepcopy(x)
の場合、浅いコピーは新しい複合オブジェクトを作成し、(可能な範囲で)元のオブジェクトで見つかったオブジェクトへの参照を挿入します。ディープコピーは、新しい複合オブジェクトを作成し、オブジェクトのコピーを元のオブジェクトに再帰的に挿入します。Q:イテレーターとジェネレーターの違いは何ですか?
イテレーター: __iter __()
および __next __()
メソッドを実装するオブジェクト。最初のメソッドは、イテレーターオブジェクト自体を返し、forステートメントとinステートメントで使用されます。最初のメソッドは、反復で次の値を返します。要素がこれ以上ない場合、 StopIteration
例外が発生します。
**ジェネレーター:**イテレーターを作成する簡単な方法は、キーワード yield
を使用します。ジェネレーターは、関数呼び出しスタックを使用して、イテレーターの状態を暗黙的に格納します。これにより、明示的なクラスと同じイテレーターを作成する場合に比べて、イテレーターの作成が簡単になります。また、読みやすさの向上にも役立ちます。
すべてのジェネレーターはイテレーターですが、その逆は正しくありません。特に、イテレーターは完全に成熟したクラスである可能性があるため、他の機能を提供できます。たとえば、上記の反復子クラスにメソッドを追加して反復制限を変更するのは簡単ですが、これはジェネレーターでは不可能です。
@
シンボルはデコレータの構文上の砂糖であり、割り当て操作を再度回避するために関数を定義するときに使用されます。
import time
def time_function(f):
def wrapper(*args,**kwargs):
begin = time.time()
result =f(*args,**kwargs)
end = time.time()print("Function call with argument {all_args} took ".format(
all_args="\t".join((str(args),str(kwargs))))+str(end - begin)+" seconds to execute.")return result
return wrapper
Lists[1, 4, 7, "apple", 4]
, Tuple(3.14, "PI", 2,43, "e")
**同じポイント:**はコンテナであり、さまざまなタイプのデータを格納でき、アクセス用にインデックスを付けることができます a [i]
**違い:**タプルは不変であり、インデックス a [i]
の値を変更したり、タプルから要素を追加/削除したりすることはできませんが、リストは変更できます。
不変性の利点:パフォーマンスの向上、コンテナの使いやすさ、スレッドの安全性。祖先はセット set
に配置してキー値として使用できますが、リストはできません。タプルの作成とアクセス速度はわずかに速く、メモリフットプリントは小さいです。
どちらも、関数で変数パラメーターを渡すために使用されます。 * arg
は、可変長パラメーターリストを渡すために使用されます。
args
と呼ばれることは重要ではありません-A
または varargs
と呼ばれることもあります。args
はイディオムです。*
通常のパラメータが続く必要があります2番目のパラメーター ** kwargs
は、可変数のキーワード引数を関数に渡すときに使用されます。
args
で参照されているパラメーターを呼び出すことは重要ではありません。Dまたはargdictと呼ぶこともできます。**
パラメータは、すべての通常の名前付きパラメータと *
パラメータの後に表示する必要がありますincrement_by_i =[lambda x: x + i for i inrange(10)]print(increment_by_i[3](4))
プログラムは、予想される7(= 3 + 4)の代わりに13(= 9 + 4)を出力します。これは、ループで作成された関数のスコープが同じであるためです。それらは同じ変数名を使用するため、すべて同じ変数* i *を参照します。これは、ループの最後では10であるため、13(= 9 + 4)になります。
目的の動作を実現する方法はたくさんあります。合理的な方法は、名前の競合を避けるために関数からラムダを返すことです。
関数の位置パラメーター、キーワードパラメーター、およびデフォルトパラメーターは何ですか。
Recommended Posts