ホームページ  >  記事  >  バックエンド開発  >  Lao Qi から Python を学ぶのは楽しくもあり、不安もある繰り返しです

Lao Qi から Python を学ぶのは楽しくもあり、不安もある繰り返しです

WBOY
WBOYオリジナル
2016-06-16 08:41:261020ブラウズ

ああ、これは本当に素晴らしいプログラマーです。ただし、彼はただのいい人であり、偉い人ではありません。優れたプログラマーとはどのようなものでしょうか?彼は都会で隠棲している掃除僧です。

他のことについて話す前に、まずこれらの用語を理解してください:

ループ、 は、条件が満たされたときに同じコード部分を繰り返し実行することを指します。たとえば、while 文です。
反復、 は、リスト内の各項目に特定の順序で 1 つずつアクセスすることを指します。たとえば、for ステートメントです。
再帰、 は、それ自体を継続的に呼び出す関数の動作を指します。たとえば、有名なフィボナッチ数列をプログラムで出力します。
トラバーサル、 は、特定のルールに従ってツリー構造内の各ノードを訪問することを指し、各ノードは 1 回だけ訪問されます。
これら 4 つの不思議な響きの単語については、チュートリアルですでに触れられているループについて説明します。ネットで検索すると、ループと再帰を比較する記事がたくさんあります。さまざまな角度から比較してみます。ここでは今は比較せず、まず Python での反復を理解しましょう。忘れていなかったら、また時期が来たら比較してみます(笑)。

1 つずつ訪問します

Python では、オブジェクト内の各要素にアクセスするには、次のようにすることができます: (リストなど)

コードをコピー コードは次のとおりです:

>>> 最初
['q'、'i'、'w'、's'、'i'、'r']
>>> 最初の私:
... print i,
...
q i w s i r

この方法に加えて、次のこともできます:

コードをコピー コードは次のとおりです:

>>> lst_iter = iter(lst) #元のリストに iter()
を実装しました >>> lst_iter.next() #いちいち手動でアクセスする手間を省いてください
「q」
>>> lst_iter.next()
「私」
>>> lst_iter.next()
「わ」
>>> lst_iter.next()

>>> lst_iter.next()
「私」
>>> lst_iter.next()
'r'
>>> lst_iter.next()
トレースバック (最後の呼び出し):
ファイル「」、1 行目、
反復の停止

優秀なプログラマーとしての最高の資質は「怠惰」です。もちろん、このように 1 つずつ克服することはできません。

コードをコピー コードは次のとおりです:

>>> True の場合:
... print lst_iter.next()
...
トレースバック (最後の呼び出し): #実際にエラーが報告されていますが、そのエラーは以前と同じですか?どういう理由
ファイル「」、2 行目、
反復の停止

> >>> True の場合:
... print lst_iter.next()
...
q 私
w
s

r
トレースバック (最後の呼び出し): #最後の呼び出しを読み取った後、エラーを報告し、ループを停止します
ファイル「」、2 行目、
反復の停止
>>>


まず、上記で使用されている組み込み関数 iter() について理解しましょう。公式ドキュメントにはこれについて説明する段落があります。

コードをコピー コードは次のとおりです:

iter(o[, センチネル])
反復子オブジェクトを返します。最初の引数は、2 番目の引数の有無に応じて大きく異なります。o は、反復プロトコル (iter() メソッド) をサポートするコレクション オブジェクトである必要があります。シーケンス プロトコル (0 から始まる整数引数を持つ getitem() メソッド)。これらのプロトコルのいずれもサポートしていない場合、2 番目の引数 Sentinel が指定されている場合、o は呼び出し可能なオブジェクトである必要があります。この場合に作成された関数は、 next() メソッドを呼び出すたびに引数なしで o を呼び出します。返された値が Sentinel と等しい場合は StopIteration が発生し、それ以外の場合は値が返されます。

全体的な考え方は... (この記事を読んでいる読者の英語レベルは文書を読むレベルに達していると考えられるため、ここではいくつかの単語を意図的に省略しています。胸の谷がない場合は、しないでください)心配しないで、辞書か何かを見つけてください。)

翻訳はしませんが、主な内容を要約したいと思います:

戻り値はイテレータオブジェクトです
パラメータは、反復プロトコルに準拠するオブジェクトまたはシーケンス オブジェクトである必要があります
next()
と一緒に使用します。 「反復可能なオブジェクト」とは何ですか?一般に、for を使用して要素を 1 つずつ読み取ることができるオブジェクトを反復可能オブジェクトと呼ぶことがよくあります。したがって、for は反復ツールとも呼ばれます。いわゆる反復ツールは、反復オブジェクトの各要素を特定の順序 (左から右の順序) でスキャンできることを意味します。当然、for に加えて、リスト解析や in to などの他の反復ツールもあります。要素がシーケンスオブジェクトに属するかどうかを判断します。

それでは、先ほど紹介した iter() 関数はどうでしょうか?これは next() と組み合わせて使用​​され、上記の反復ツールの実装にも使用されます。 Python では、また他の言語でも、反復という用語は主に名詞の混乱のために比較的わかりにくいです。先ほど、反復を実現できるものは反復ツールと呼ばれると言いましたが、多くのプログラマーが好むのはこれらの反復ツールです。それをイテレータと呼びます。もちろん、これらはすべて中国語訳であり、英語はイテレータです。

上記のすべての例を見ると、for を使用して反復すると、最後に到達したときにエラーを報告せずに自動的に終了することがわかります。 iter()...next() を使用して反復する場合、最後のものが完了しても自動的に終了せず、下方向に継続しますが、その後に要素がないため、StopIteration と呼ばれるエラーが報告されます (このエラーの名前は「反復の停止」です。これはエラーではなく、明らかに警告です)。

読者は、iter()...next() 反復の機能にも注意を払う必要があります。反復オブジェクト lst_iter が最後まで反復されると、つまり各要素が片側で読み取られた後、ポインターは最後の要素の末尾に移動します。再度アクセスすると、ポインタは自動的に最初の位置に戻らず、最後の位置に留まるため、StopIteration が報告されます。再度開始する場合は、反復オブジェクトを再度入力する必要があります。ご覧のとおり、上記の反復オブジェクトを再割り当てした後は、続行できます。これは、for などの反復ツールでは使用できません。

ファイル反復子

現在、次の内容を含む 208.txt という名前のファイルがあります:

コードをコピー コードは次のとおりです:

qiwsir で Python を学びましょう。
無料のPython講座あります
ウェブサイトは次のとおりです:
http://qiwsir.github.io
言語は中国語です。

このファイルを操作するにはイテレーターを使用します。これは、ファイルに関する知識について説明したときにすでに実行しました。

にすぎません。

コードをコピー コードは次のとおりです:

>>> f = open("208.txt")
>>> f.readline() #最初の行を読む
「qiwsir.n で Python を学びましょう」
>>> f.readline() #2行目を読む
「無料のPythonコースがあります。n」
>>> f.readline() #3行目を読む
「ウェブサイトは次のとおりです」
>>> f.readline() #4行目を読む
'http://qiwsir.github.ion'
>>> f.readline() #5 行目を読み取ります。つまり、最後の行を読んだ後、この行の終わりに到達します
「その言語は中国語です。n」
>>> f.readline() #コンテンツはありませんが、エラーは報告されず、空が返されます。
''

上記のデモでは、readline() を使用して 1 行ずつ読み取ります。もちろん、実際の運用では、これを自動的に行わせる必要があります。

がより一般的に使用されます。

コードをコピー コードは次のとおりです:

>>> f の行: #この操作は上記の操作の直後に実行されます。主な観察を参照してください
... print line、#何も出力されません
...

このコードが何も出力しない理由は、前の反復の後、ポインターが最後に移動されたためです。これは反復の特性であるため、ポインタの位置に注意してください。

コードをコピー コードは次のとおりです:

>>> f = open("208.txt") #最初から始める
>>> f の行:
... 印刷行、
...
qiwsir で Python を学びましょう。
無料のPython講座あります
ウェブサイトは次のとおりです:
http://qiwsir.github.io
言語は中国語です。

このメソッドはファイルの読み取りによく使用されます。別の readlines() も使用できます。ただし、注意すべき点がいくつかあります。読者が注意すべき点を思い出せない場合は、ファイルでコースを復習できます。

上記の処理は next() を使って読み込むこともできます。

コードをコピー コードは次のとおりです:

>>> f = open("208.txt")
>>> f.next()
「qiwsir.n で Python を学びましょう」
>>> f.next()
「無料のPythonコースがあります。n」
>>> f.next()
「ウェブサイトは次のとおりです」
>>> f.next()
'http://qiwsir.github.ion'
>>> f.next()
「その言語は中国語です。n」
>>> f.next()
トレースバック (最後の呼び出し):
ファイル「」、1 行目、
反復の停止

next()を使用すると、各行の内容を直接読み取ることができます。これは、ファイルが自然な反復可能なオブジェクトであり、 iter() で変換する必要がないことを示しています。

さらに、反復を実装するには for を使用します。本質的には next() を自動的に呼び出しますが、この作業はこの時点で for に行われます。別名: for と呼ばれます。雷峰さん。

前述したように、リスト解析はリストを学習する際に、それをすでに理解している必要があります。それで、ファイルに使用できますか?試してみてください:

コードをコピー コードは次のとおりです:

>>> [ open('208.txt') の行ごとに ]
['qiwsir.n で Python を学ぶ'、'無料の Python course.n'、'Web サイトは:n'、'http://qiwsir.github.ion'、'言語は中国語です。n']

この時点で、読者はリスト解析に感動したのではないでしょうか?本当に力強くて強くて大きいです。

実際には、反復子は上記よりもはるかに単純です。Python では、この方法で反復可能なオブジェクトの要素を取得することもできます。

コードをコピー コードは次のとおりです:

>>> リスト(open('208.txt'))
['qiwsir.n で Python を学ぶ'、'無料の Python course.n'、'Web サイトは:n'、'http://qiwsir.github.ion'、'言語は中国語です。n']

>>> タプル(open('208.txt'))
('qiwsir.n で Python を学ぶ'、'無料の Python コースがあります。n'、'Web サイトは:n'、'http://qiwsir.github.ion'、'言語は中国語です。n')

>>> "$$$".join(open('208.txt'))
「qiwsir で Python を学びましょう。n$$$無料の Python コースがあります。n$$$Web サイトは次のとおりです。n$$$http://qiwsir.github.ion$$$言語は中国語です。n」

>>> a,b,c,d,e = open("208.txt")
>>>
「qiwsir.n で Python を学びましょう」
>>> 「無料のPythonコースがあります。n」
>>>c
「ウェブサイトは次のとおりです」
>>>
'http://qiwsir.github.ion'
>>>
「その言語は中国語です。n」

上記の方法は、単に読者に示すためのものであり、この方法で実行できることを理解する必要がありますが、必須ではありません。

付け加えると、辞書も反復処理できるので、自分で調べてみるとよいでしょう (実際、以前に for を使用して反復処理を行ったことがあるので、今回は調べて iter()...next() を使用して手動で実行してください。段階的に繰り返します)。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。