今日メインコンテンツ
- 追加:三眼鏡操作
- F-文字列
- イテレータ
- ジェネレータ
追加:三眼鏡操作
- 三眼操作(三項演算子)構造:
表达式1 if 条件表达式 else 表达式2
c = a if a > b else b
実装プロセス:
- 条件が適切Cに割り当てられている場合、条件の分析
- 条件は右のCをbに代入されますされていない場合
a = 10 b = 20 c = a if a > b else b # 三目运算 print(c) 运行结果: 20
、F-文字列
- 我々が述べたように、F-文字列の前に、python3.6のバージョンよりも詳細に話するのは非常に簡単で、今日、出力をフォーマットするために使用することができます
フォームのF-文字列:
f"xxxx{传入的变量}xxxx"
(推奨f
)F"xxxx{传入的变量}xxxx"
(推奨しませんF
)
name = "zxd" age = 23 print(f"姓名:{name} 年龄:{age}") 运行结果: 姓名:zxd 年龄:23
引用あなたは括弧が必要な場合は
{}
、2つの{{}}
代表print(f"{{'a'}}") # 用两个大括号表示 运行结果: {'a'}
必要なときに引用符は、常に2つの単一引用符を使用
''
表しprint(f"{{'a'}}") # 用单引号表示 运行结果: {'a'}
パラメータは、3つのヘッド式に渡すことができます
a = 10 b = 10 print(f"{a if a > b else b}") 运行结果: 10
第二に、イテレータ
(A)イテラブル
私は、反復可能オブジェクトが何であるかを、私たちは、イテレータの前に反復可能オブジェクトを見てみましょうと言いますか?
- 値は反復可能である被験者であってもよいです
s = "12345" lst = [1, 2, 3, 4, 5] dic = {1: 1, 2: 2, 3: 3} ....... # 这些都是可迭代对象
- 彼らの共通の特徴は、forループである能力であります
s = "12345" lst = [1, 2, 3, 4, 5] dic = {1: 1, 2: 2, 3: 3} for el in s: print(el) for el in lst: print(el) for el in dic: print(el)
公定法の反復可能オブジェクトを表示します。
- オブジェクトが持っているかどうかを確認
__iter__()
する方法を限り、オブジェクトを使用して、この方法があるので、すべてのイテレート可能オブジェクトであり、 dir()
あなたは、オブジェクト関数法のすべてを見ることができます
lst = [1, 2, 3, 4, 5] print("__iter__" in dir(lst)) 运行结果: True
- オブジェクトが持っているかどうかを確認
特長の反復はオブジェクトがあります。
- 時間の概念のための空間(スペースをたっぷりと時間を節約するために)
- 利点:
- 柔軟、各反復は、オブジェクトがあり、独自のメソッドを持っています
- あなたは直接の要素の数を表示することができます
- 値を繰り返すことができます
- 短所:
- 合計メモリ
用途:大きなメモリ空間、推奨されるより少ないデータよりもイテレート可能オブジェクト
(B)イテレータ
- メモリ(ユニークな利点を)保存中反復子は、唯一の反復(缶の値)を継承し、オブジェクトの反復のエンティティであることが理解されるであろう
- ファイルハンドルがイテレータです
イテレータ生成方法:
- 両者の同じ効果を生成する方法
iter(可迭代对象)
- 反復可能オブジェクトを生成するIterator
- 印刷は反復子アドレスです
lst = [1, 2, 3, 4, 5] l = iter(lst) print(l) 运行结果: <list_iterator object at 0x0000020BAFCEA940>
可迭代对象.__iter__()
- 反復可能オブジェクトを生成するIterator
- 印刷は反復子アドレスです
lst = [1, 2, 3, 4, 5] l = lst.__iter__() print(l) 运行结果: <list_iterator object at 0x000002490EFDA8D0>
イテレータ値
- イテレータの最大の特徴は、イテレータの値にイニシアチブを取らない場合、イテレータはあなたが価値与えることはありません、不活性メカニズムですが、またために慣性機構からメモリを節約できます
next(迭代器)
lst = [1, 2, 3, 4, 5] l = iter(lst) print(next(l)) print(next(l)) print(next(l)) print(next(l)) print(next(l)) 运行结果: 1 2 3 4 5
迭代器.__next__()
lst = [1, 2, 3, 4, 5] l = lst.__iter__() print(l.__next__()) print(l.__next__()) print(l.__next__()) print(l.__next__()) print(l.__next__()) 运行结果: 1 2 3 4 5
- 関数値が値だけダウン反復子順次に値を取るたびに、値は、多くの要素のみ倍の次数であることができるどのようにイテレータを繰り返すことができず、エラーが最大数を超えます
lst = [1, 2, 3, 4, 5] l = lst.__iter__() print(l.__next__()) print(l.__next__()) print(l.__next__()) print(l.__next__()) print(l.__next__()) print(l.__next__()) 运行结果: 1 2 3 4 5 StopIteration
イテレータの特徴:
- (スペースを節約するための時間をたっぷりと)宇宙コンセプトのための時間
- 保存メモリ
- 不活性メカニズム
- 値は、だけでなく、前後、上下することができ
forループの性質はイテレータです
- 例外をキャッチ:値はイテレータイテレータの要素数を超えた場合、それによってwhileループを終了し、呼び出すとStopIteration例外を捕捉します
lst = [1, 2, 3, 4, 5] l = iter(lst) while True: try: print(next(l)) except StopIteration: # 捕获异常 break
同じイテレータの値が、変数に割り当てられた内部位置の値を記録する反復子は、変数は、最後のアドレス値と位置を指します
lst = [1, 2, 3, 4, 5] l_iter = iter(lst) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) # l_iter指向取值记录位置 运行结果: 1 2 3 4 5
l_iter
すべての値のアドレスを指すイテレータ、l_iter
ポイント値上の位置- あなたが以前のすべての価格を買うたびに何かを購入するために知人によって理解することができます
同じイテレータの値は、反復子は、各アドレス指定の後にゼロからスタートすることと等価である最初からすべての値の値を割り当てた場合、内部位置の値を記録し、その都度う
lst = [1, 2, 3, 4, 5] print(next(iter(lst))) print(next(iter(lst))) print(next(iter(lst))) print(next(iter(lst))) print(next(iter(lst))) print(next(iter(lst))) # 每次都从头开始取值 运行结果: 1 1 1 1 1
- 割り当てないたびませ
func()
ダイレクトアドレッシング、ヘッドからの値に始めています - 知人として理解することができない、毎回あなたがオリジナルのあるものを購入します
- 割り当てないたびませ
アプリケーション:データの膨大なメモリを少量、イテレータを使用することをお勧めします
(C)は、2つの間の関係
- イテレータが反復可能である必要があり、反復可能オブジェクトは必ずしもイテレータありません
- イテレータができる
iter(可迭代对象)
と可迭代对象.__iter__()
取得します
第三に、発電機
(A)発電機とは何ですか
Builderの基本的イテレータ
ジェネレーターは独自のを書くためのイテレータであるが、唯一のイテレータを通じて
iter()
機能を取得しますオブジェクト生成は、コードを介して、データ変換によって達成されていません
- リストイテレータに変換しますが、リストはまだメモリにロードされ、それは地方のメモリ効果を満たしていませんでした
lst = [1, 2, 3, 4, 5] l_iter = iter(lst) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) 运行结果: 1 2 3 4 5
- Builderで真に州のメモリを実現
def func(): yield 1 yield 2 yield 3 yield 4 yield 5 f_gen = func() print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) 运行结果: 1 2 3 4 5
(B)ジェネレータ
ファンクション・ジェネレータを介して実行
- 機能を初めて目
def func(): print(1) return 1 print(func()) 运行结果: 1 1
- 機能
return
置き換えは、yield
発電機となり
def func(): print(1) yield 1 print(func()) 运行结果: <generator object func at 0x000001B27042C50>
- 関数が定義されている場合は、括弧内の関数名が呼び出し元の関数、および発電機が定義されている場合、関数名がた括弧されたメモリアドレスジェネレータ
yield
:- 収率はタプルに格納され、複数の値を返すことができ
- さまざまなデータ型は、歩留まりを返すことができます。
- 収量は、より多くのを書いて実行することができることができます
- ロケーション記録可能な収率を行います
- 利回り、デフォルトの戻りなしの背後にあるコンテンツを記述しないでください
- 収量だけ下方ではなく、往復、使い捨て値
値のジェネレータ
next(生成器)
def func(): yield 1 yield 2 yield 3 yield 4 yield 5 f_gen = func() print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) 运行结果: 1 2 3 4 5
生成器.__next__()
def func(): yield 1 yield 2 yield 3 yield 4 yield 5 print(func().__next__()) print(func().__next__()) print(func().__next__()) print(func().__next__()) print(func().__next__()) 运行结果: 1 2 3 4 5
ネイチャーBuilderは反復子なので、イテレータのすべての特性を持っています
- (スペースを節約するための時間をたっぷりと)宇宙コンセプトのための時間
- 保存メモリ
- 不活性メカニズム
- 値は、だけでなく、前後、上下することができ
同じ発電機に値が、変数に割り当てられた位置の値を記録する収率は、変数は、最後のアドレス値と位置を指します
def func(): yield 1 yield 2 yield 3 yield 4 yield 5 f_gen = func() print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) print(next(f_gen)) # f_gen指向生成器地址和yiele记录的位置 运行结果: 1 2 3 4 5
割り当てられている場合と同じ値に発電機、収率は、各時間値の先頭から、位置の値を記録する毎にゼロからスタートした後のアドレスに対応する値であります
def func(): yield 1 yield 2 yield 3 yield 4 yield 5 print(next(func())) print(next(func())) print(next(func())) print(next(func())) print(next(func())) # 每次都从头开始取值 运行结果: 1 2 3 4 5
降伏値は1により戻すことができるイテラブルさらなる目的である場合
yield from
def func(): yield from [1, 2, 3] yield from [4, 5, 6] print(next(func())) print(next(func())) print(next(func())) print(next(func())) print(next(func())) print(next(func())) 运行结果: 1 2 3 4 5 6
四、3区別
(A)イテラブル
- それは限りとして使用することができます
__iter__()
方法オブジェクトは反復可能です - イテレータとジェネレータはイテレート可能オブジェクトです
(B)イテレータ
- そこにあれば、オブジェクトのメモリアドレスを見る
iterator
イテレータです - これは、所有している
__iter__()
と__next__()
、リリース方法はイテレータです
(C)ジェネレータ
- そこにあれば、オブジェクトのメモリアドレスを表示する
generator
発電機であります - あなたは使用することができる
send()
方法をその発電機