はじめに
これらの新しい機能は、これまでの C/C++ にはなかったものであり、C/C++ はこのような単純だが強力な構文をサポートしていません。
II スライス
スライスというと、大根を切って、大根の特定の部分を取得することを想像できます。これは、ここでのスライスに非常に適切な比喩です。 Python のスライス操作は、リストまたはタプルの特定のセグメントを取得することです。
例えば、次のように定義されたリストがあります:
#define a list
l=['Luffy','Corey','Nancy','Jeffrey','Kyle','Avery','Jason' ,'Sunny ']
最初の 3 つの要素を取得するには、次の 2 つの方法があります:
>>> l[:3]
['Luffy', 'Corey', 'Nancy ']
> >> l[0:3]
['Luffy', 'Corey', 'Nancy']
つまり、0から始めれば省略できます。
2番目から4番目の要素を取得するコードは以下の通りです:
>>> l[1:5]
['Corey', 'Nancy', 'Jeffrey', 'Kyle']
最後から 2 番目の項目を最後の項目まで取得するコードは次のとおりです:
>>> l[-2:]
['Jason', 'Sunny']
知らずにリスト全体を取得します。リストの長さ 内容、コードは次のとおりです:
>>> l[:]
['Luffy', 'Corey', 'Nancy', 'Jeffrey', 'Kyle', 'Avery '、'ジェイソン'、'サニー ']
リスト全体の 2 つから 1 つを取り出します:
>>> l[::2]
['ルフィ'、'ナンシー'、'カイル', 'ジェイソン']
リストの最初の 6 項目のうち 2 つのうち 1 つを選択します:
>>> l[:5:2]
['ルフィ', 'ナンシー', ' Kyle']
実際には、以下に示すように、コードを編集するときに、ここでのスライス操作でリストを指す変数をリスト自体に置き換えることができます。 「コーリー」、「ナンシー」、「ジェフリー」、「カイル」、「エイブリー」、「ジェイソン」、「サニー」][:3]
[「ルフィ」、「コーリー」、「ナンシー」]
両方タプルや文字列はリストとみなすことができるので、上記の構文も使用できます。
三 リスト生成
リスト生成 (List CompRehensions) は、リストを作成するために Python に組み込まれている非常に強力な生成です。
最も単純な例では、1から10までのリストを作成したいのですが、これは
list(range(1,11))
のような単純なコード行で実行できます。しかし、より複雑なリストを生成する場合はどうでしょうか?
[1x1, 2x2, 3x3,...,10x10]のようなリストを生成するにはどうすればよいでしょうか?もちろん、ループを使用して実現できますが、コードが複雑すぎます。リスト生成を使用するには、次のコード行のみが必要です: [x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 偶数の2乗を足すだけなら複雑ではありません。 の後にif判定条件を追加するだけです。 forループ。
>>> [x*x for x in range(1,11) if x % 2 == 0]
2 つを使用することもできます-レベル ループ ,
>>> ['ABC' の x に対する x+y 'XYZ' の y]
たくさんのリスト生成式を書いてきたので、誰もがこの構文の起源を理解していると思います。実際には、通常の構文を逆にして、最も内側の計算を最初に行うことになります。たとえば、最後のリスト生成は、次の通常の構文として記述することができます:
for x in 'ABC':
print(x+y)
Four ジェネレータ
With生成的には、リストを直接作成できますが、メモリの制限を考慮すると、多数の要素を含むリストを作成することはできません。では、このときどうすればよいでしょうか。
Python にはジェネレーターと呼ばれる仕組みがあり、ジェネレーターを使用して後続の要素を計算できるため、すべての要素を一度に作成する必要はありません。ジェネレーターを作成するには、2 つの方法があります:
1 つ目の方法: リスト生成式の [] を () に変更してジェネレーターを作成します。
次のコードに示すように:
>>> g=(x for x in range(10))
>>> print(next(g))0
ジェネレーターの最初の要素を取得するには、g で次の関数を直接呼び出します。もちろん、for ループを使用して、次のステップでジェネレーター全体によって生成されたデータを走査することもできます。
第二の方法:計算方法が複雑すぎてリスト生成が実装できない場合は、関数で実装できます。リスト生成からジェネレーターに移行する場合と比較して、関数からジェネレーターに移行する場合も、最初に関数を記述してから、特定の位置に yield キーワードを追加するだけで済みます。
例えば、フィボナッチ数列を生成する関数は次のとおりです:
def fib(max):
n, a, b = 0, 0, 1
while n , A + B
N = N + 1
Return 'Done'
def fib(max):
n, a, b = 0, 0, 1
while n < max:
'
yield キーワードを含む関数は関数ではなくジェネレーターになります。ジェネレーターの実行フローは関数の実行フローとは異なることに注意してください。ジェネレーターは、yield に遭遇すると戻り、次回呼び出されたときに最後に返された yield から実行を継続します。
5 つのイテレーター
for ループで直接使用できるオブジェクトは、まとめて反復可能オブジェクトと呼ばれます: Iterable オブジェクトが Iterable オブジェクトであるかどうかを判断するには、isinstance() を使用します。ジェネレーターは、for ループだけでなく、next() を使用して走査することもできます。 next() 関数で呼び出すことができるオブジェクトを呼び出し、次の値を継続的に返します。総称してイテレーター (Iterator) と呼ばれます。
ここで、Iterable と Iterator を区別する必要があります。List、dict、str はすべて Iterable ですが、Iterator ではありません (iter() 関数を使用して Iterable を Iterator に変えることができます)。 Iterator は無限のデータ ストリームになる可能性があり、シーケンス全体の長さを事前に知ることはできません。これらの要件は Iterable では満たせません。
6 つの追記
ここで言及されているのは、私が Python でのみ学んだいくつかの新しいプログラミング機能です。間違いがある場合は、メッセージを残してください。 ! !
上記は Python の入門学習のための高度な機能の内容です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。