ホームページ バックエンド開発 Python チュートリアル Python の range オブジェクトがイテレータであるかどうかについての議論

Python の range オブジェクトがイテレータであるかどうかについての議論

Apr 02, 2018 pm 02:28 PM
python

Iterator (反復子) は、Python 3 の遅延反復可能オブジェクト (lazy iterable) です。 では、range は反復子ですか?なぜ。

TLNR: Python 3 の Range オブジェクト (Python 2 の xrange オブジェクト) は遅延型ですが、Range オブジェクトはイテレーターではありません。はい、それは混乱しています。Pythonで反復因子と反復について話すとき、あなたはおそらく、範囲がイテレーターであるという誤解を繰り返すのを聞くでしょう。これは非常に重大な誤解だと思います。範囲オブジェクトがイテレータであると考えている場合、「イテレータがどのように機能するか」というメンタル モデルが十分に明確ではありません。ある意味、範囲とイテレータはどちらも「怠惰」ですが、まったく異なる方法で「怠惰」を実現します。


イテレーターとは何ですか?

Python では、反復可能オブジェクトとは反復可能なオブジェクトのことであり、イテレーターとは実際に反復処理を行うものです。

Iter-

ables

は反復可能です


イテレータを取得したら、それに対してできることは次の要素を取得することだけです:

要素がもうない場合、反復停止例外:

すべての反復子は反復可能オブジェクトです。つまり、反復子から反復子を取得できるため、反復子を反復処理できます:

Python の range オブジェクトがイテレータであるかどうかについての議論

イテレータはステートフルであることに注意してください。一度ループした後、再度ループしようとすると空になります:

Python の range オブジェクトがイテレータであるかどうかについての議論

Python 3 では、<code style="box-sizing: inherit;margin-right: 2px;margin-left: 2px;padding: 3px 4px;border-radius: 3px;"><span style="color: rgb(103, 103, 103);">enumerate、zip、reversed</span>列挙、zip、反転

およびその他のビルド-in 関数はイテレータを返します:

Python の range オブジェクトがイテレータであるかどうかについての議論

ジェネレータ (ジェネレータ関数またはジェネレータ式のいずれかから) は、イテレータを作成する簡単な方法です:

Python の range オブジェクトがイテレータであるかどうかについての議論

イテレータは怠惰なものであるとよく言います。 -time 反復可能オブジェクト。 「遅延」はループ内の項目のみをカウントするため、「使い捨て」は要素がイテレーターから「消費」されると、その要素は永久に失われるためです。


Rangetpython 3 の Range オブジェクト (Python 2 の XRANGE) は、他の反復オブジェクトと同様に強化オブジェクトとして使用できます:

, したがって、そこからイテレータを取得できます:

Python の range オブジェクトがイテレータであるかどうかについての議論

しかし、範囲オブジェクト自体はイテレータではないため、範囲オブジェクトに対して next を呼び出すことはできません:

Python の range オブジェクトがイテレータであるかどうかについての議論

イテレータとは異なり、範囲オブジェクトを「消費」せずに反復できます:

Python の range オブジェクトがイテレータであるかどうかについての議論

イテレータでこれを実行すると、2回目は何も取得されませんループ時の要素:

Python の range オブジェクトがイテレータであるかどうかについての議論

Zongshang、<code style="box-sizing: inherit;margin-right: 2px;margin-left: 2px;padding: 3px 4px;border-radius: 3px;"><span style="color: rgb(103, 103, 103);">zip</span><span style="color: rgb(103, 103, 103);">enumerate</span>, or <span style="color: rgb(103, 103, 103);">generator</span>zip,

<p style="box-sizing: inherit;margin-bottom: 20px;color: rgb(51, 51, 51);margin-left: 8px;margin-right: 8px;line-height: 1.75em;">列挙<span style="box-sizing: inherit;font-weight: 600;color: rgb(103, 103, 103);font-size: 20px;"></span></p>
、または generator<p style="box-sizing: inherit;margin-bottom: 20px;color: rgb(51, 51, 51);margin-left: 8px;margin-right: 8px;line-height: 1.75em;"> </p> オブジェクトが異なります。範囲オブジェクトはイテレータではありません。

では、範囲とは正確には何でしょうか?

Python の range オブジェクトがイテレータであるかどうかについての議論 range オブジェクトは、作成時に含まれるすべての数値を生成するのではなく、作成時に生成するという意味で「遅延」します。ループ内で必要な場合にのみ、これらの数値を返します。

ここに範囲オブジェクトとジェネレーター (反復子) があります:

Python の range オブジェクトがイテレータであるかどうかについての議論

ジェネレーターとは異なり、範囲オブジェクトには長さがあります:

🎜🎜🎜🎜🎜🎜🎜 : 🎜🎜

Python の range オブジェクトがイテレータであるかどうかについての議論

イテレータとは異なり、状態を変更せずに要素が含まれているかどうかを尋ねることができます:

Python の range オブジェクトがイテレータであるかどうかについての議論

範囲オブジェクトの説明が必要な場合は、それらを呼び出すことができます <code style="box-sizing: inherit;margin-right: 2px;margin-left: 2px;padding: 3px 4px;border-radius: 3px;"><span style="color: rgb(103, 103, 103);">懒序列</span>遅延シーケンス、範囲はシーケンス (たとえば、リスト、タプル、文字列など)を含みますが、メモリ内のコンテンツは含まれていませんが、代わりに計算を実行して質問に答えます。

Python の range オブジェクトがイテレータであるかどうかについての議論


この違いが重要な理由

オブジェクトがイテレータであることを説明すると、このオブジェクトに対して iter 関数が呼び出されるときに、 (定義により) 常に同じオブジェクトを取得します:

Python の range オブジェクトがイテレータであるかどうかについての議論

次の関数はすべての反復子で呼び出すことができるため、このオブジェクトで次の関数を呼び出せることを確認してください:

Python の range オブジェクトがイテレータであるかどうかについての議論

そして、それを反復処理すると、これらの要素がイテレータから消費されることがわかりますが、この機能が (特別な方法でイテレータを処理するために) 役立つ場合があります:

Python の range オブジェクトがイテレータであるかどうかについての議論

「遅延反復可能オブジェクト」と「反復子」の違いは微妙なように思えるかもしれませんが、これらの用語は意味が異なります。 「遅延反復可能オブジェクト」は非常に一般的な用語であり、特別な意味はありませんが、「反復子」という言葉は、非常に特殊な動作を持つオブジェクトを意味します。

🎜


概要

オブジェクトをループできることがわかっている場合、それは反復可能なオブジェクト (iterable) です。

ループしているオブジェクトがループ中に計算されることがわかっている場合、それは遅延反復可能 (lazy iterable) です。

次の関数に何かを渡すことができることがわかっている場合、それはイテレーター (最も一般的な遅延反復可能オブジェクト) です。

「使い果たす」ことなく複数回ループできる場合、それはイテレータではありません。次の関数に何かを渡せない場合、それはイテレータではありません。 Python 3 の range オブジェクトはイテレータではありません。 範囲オブジェクトについて他の人に指示する場合は、「イテレータ」という言葉を使用しないでください。これは非常に混乱を招くため、他の人が「イテレータ」という言葉を乱用する可能性があります

関連する推奨事項:

イテレータの詳しい説明

Pythonの反復可能オブジェクトとイテレータオブジェクトの理解

Rangeオブジェクト

以上がPython の range オブジェクトがイテレータであるかどうかについての議論の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python:ゲーム、GUIなど Python:ゲーム、GUIなど Apr 13, 2025 am 12:14 AM

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

Debian Readdirが他のツールと統合する方法 Debian Readdirが他のツールと統合する方法 Apr 13, 2025 am 09:42 AM

DebianシステムのReadDir関数は、ディレクトリコンテンツの読み取りに使用されるシステムコールであり、Cプログラミングでよく使用されます。この記事では、ReadDirを他のツールと統合して機能を強化する方法について説明します。方法1:C言語プログラムを最初にパイプラインと組み合わせて、cプログラムを作成してreaddir関数を呼び出して結果をinclude#include#include inctargc、char*argv []){dir*dir; structdireant*entry; if(argc!= 2){(argc!= 2){

Pythonと時間:勉強時間を最大限に活用する Pythonと時間:勉強時間を最大限に活用する Apr 14, 2025 am 12:02 AM

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

Nginx SSL証明書更新Debianチュートリアル Nginx SSL証明書更新Debianチュートリアル Apr 13, 2025 am 07:21 AM

この記事では、DebianシステムでNGINXSSL証明書を更新する方法について説明します。ステップ1:最初にCERTBOTをインストールして、システムがCERTBOTおよびPython3-Certbot-Nginxパッケージがインストールされていることを確認してください。インストールされていない場合は、次のコマンドを実行してください。sudoapt-getupdatesudoapt-getinstolcallcertbotthon3-certbot-nginxステップ2:certbotコマンドを取得して構成してlet'sencrypt証明書を取得し、let'sencryptコマンドを取得し、nginx:sudocertbot - nginxを構成します。

debian opensslでHTTPSサーバーを構成する方法 debian opensslでHTTPSサーバーを構成する方法 Apr 13, 2025 am 11:03 AM

DebianシステムでHTTPSサーバーの構成には、必要なソフトウェアのインストール、SSL証明書の生成、SSL証明書を使用するWebサーバー(ApacheやNginxなど)の構成など、いくつかのステップが含まれます。 Apachewebサーバーを使用していると仮定して、基本的なガイドです。 1.最初に必要なソフトウェアをインストールし、システムが最新であることを確認し、ApacheとOpenSSL:sudoaptupdatesudoaptupgraysudoaptinstaをインストールしてください

DebianのGitlabのプラグイン開発ガイド DebianのGitlabのプラグイン開発ガイド Apr 13, 2025 am 08:24 AM

DebianでGitLabプラグインを開発するには、特定の手順と知識が必要です。このプロセスを始めるのに役立つ基本的なガイドを以下に示します。最初にgitlabをインストールすると、debianシステムにgitlabをインストールする必要があります。 GitLabの公式インストールマニュアルを参照できます。 API統合を実行する前に、APIアクセストークンを取得すると、GitLabのAPIアクセストークンを最初に取得する必要があります。 gitlabダッシュボードを開き、ユーザー設定で「アクセストーケン」オプションを見つけ、新しいアクセストークンを生成します。生成されます

Apacheとは何ですか Apacheとは何ですか Apr 13, 2025 pm 12:06 PM

アパッチはインターネットの背後にあるヒーローです。それはWebサーバーであるだけでなく、膨大なトラフィックをサポートし、動的なコンテンツを提供する強力なプラットフォームでもあります。モジュラー設計を通じて非常に高い柔軟性を提供し、必要に応じてさまざまな機能を拡張できるようにします。ただし、モジュール性は、慎重な管理を必要とする構成とパフォーマンスの課題も提示します。 Apacheは、高度にカスタマイズ可能で複雑なニーズを満たす必要があるサーバーシナリオに適しています。

See all articles