찾다
백엔드 개발파이썬 튜토리얼컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

이 글은 컨테이너, 반복 가능한 객체, 반복자 및 생성기와 관련된 문제를 주로 소개하는 python에 대한 관련 지식을 함께 살펴보겠습니다.

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

추천 학습: python 비디오 튜토리얼

Python을 처음 배우기 시작했을 때 컨테이너, 반복 가능한 객체, 반복자, 생성기, 목록/세트/사전 파생 및 기타 여러 개념에 관해 유명 인사들이 이야기하는 것을 자주 들었습니까? , 사실 이것은 대기업들이 B인 척하기 위해 전문 용어를 사용하기 때문이 아니라 이러한 것들을 이해해야 합니다. 특히 Python의 데이터 구조 측면에서는 문자열, 목록 등의 기본을 아는 것만으로는 충분하지 않습니다.

오늘은 Python 기초를 한 단계 더 발전시킬 수 있도록 이해하기 어려운 Python의 컨테이너, 반복 가능 개체, 반복자 및 생성기 개념에 대해 설명하겠습니다!

1. 컨테이너

1. 컨테이너란?

Python에서 컨테이너는 여러 요소를 함께 구성하는 데이터 구조입니다. 컨테이너의 요소는 하나씩 반복적으로 얻을 수 있습니다. 직설적으로 말하면 그 기능은 이름과 마찬가지로 사물(데이터)을 저장하는 데 사용됩니다.

컨테이너는 실제로 존재하지 않습니다. 그것은 단지 인간이 만든 개념입니다. 단지 회원 연산자(in 또는 not in)와 함께 사용할 수 있습니다. 개체가 컨테이너 내부에 있는지 확인합니다.

물론 제가 만든 게 아닙니다. 정부에서 만든 것인데, 다른 사람이 이해하지 못하는 이상한 용어를 가르치고 있으니 걱정하지 않으셔도 됩니다. ... python 중앙 수도에서는 그렇게 부릅니다. 일반적인 컨테이너 유형에는 목록(list), 튜플(tuple), 문자열(str), 사전(dict) 및 집합(set)이 포함됩니다.

컨테이너의 데이터는 반복적으로 얻을 수 있으므로 새로운 개념인 반복 가능한 객체를 배워야 합니다.


2. 반복 가능한 객체

1. 반복 가능한 객체란 무엇인가요?

파이썬에서 반복 가능한 객체는 특정 데이터 유형을 참조하는 것이 아니라 요소를 저장하는 컨테이너 객체를 참조합니다.

즉, 컨테이너에 저장된 데이터가 없으면 반복 가능한 객체가 아닙니다. 모든 컨테이너가 반복 가능한 객체를 포함하지만 이에 국한되지는 않습니다.

두 가지 점에 주목하세요:

1.很多容器都是可迭代对象(容器包含了可迭代对象)。

2.一个可迭代对象是不能独立的进行迭代的,迭代是通过for来完成的,凡是可迭代对象都可以直接使用for循环进行访问。

for 루프는 누구나 익숙해야겠죠? for 루프가 어떻게 구현되는지 궁금한 적이 있습니까? 예를 들어, 이 for 루프 예제에서 목록의 모든 요소를 ​​출력할 수 있는 이유는 무엇입니까? 내부적으로 어떻게 구현되나요?

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

사실 for 루프는 두 가지 작업을 수행합니다.

1.使用 __iter__() 返回1个迭代器,迭代器在下面会讲,这里先知道有这么个东西。

2.使用 __next__() 获取迭代器中的每一个元素。

그러면 목록의 각 요소를 출력하는 데 for 루프가 필요하지 않습니다.

l = [1,2,3,4]# for i in l:#     print(i)ite =l.__iter__() #接收一下ietr()干了什么print(ite)  
#打印print(ite.__next__())    
#for循环干第2件事情的时候做的第1步print(ite.__next__())    
#for循环干第2件事情的时候做的第2步print(ite.__next__())   
 #for循环干第2件事情的时候做的第3步print(ite.__next__())    
#for循环干第2件事情的时候做的第4步

출력 결과:

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

it을 인쇄하는 코드 줄을 제거하면 for 루프 출력 목록의 각 요소와 실행 효과가 동일하다는 것을 알 수 있습니다. for 루프는 범위를 4회로 제한하지만 실제로는 __iter__()를 한 번 실행하고 4번 실행합니다. times_ _next__(), 즉 반복 객체에 액세스하는 for 루프의 본질은 이런 방식으로 달성됩니다.

또한 for 루프가 본질적으로 수행하는 두 가지 작업은 필수입니다. 즉, __iter__()가 반복자를 먼저 반환하지 않으면 __next()__는 요소를 얻을 수 없습니다. 앞서 언급한 두 가지 사항 중 두 번째는 반복 가능한 객체를 독립적으로 반복할 수 없다는 것입니다.

동일한 원리와 본질을 가진 두 가지 내장 함수가 있습니다. 일반적으로 내장 함수를 사용하는 것이 더 편리합니다. 최소한 밑줄을 너무 많이 쓸 필요는 없습니다.

内置函数 iter() 的本质是 __inter__() ,也是返回一个迭代器。

内置函数 next() 的本质是 __next__(),也是有了迭代器之后获取元素。

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

결과가 완전히 동일하다는 것을 알 수 있습니다. 반복자(iterator)에 대해 이야기하자면, 반복자가 무엇인지 살펴보겠습니다.

3. Iterator

아마도 위의 for 루프 예제에서 볼 수 있을 것입니다.

只要是实现了__iter__()和__next__()的对象,就是迭代器,迭代器是一个可迭代对象。

总之,迭代器是有__iter__()生成,可以通过__next__()进行调用。

이 경우 Python의 기본을 배울 때 range()가 반복 가능한 객체라고 언급했기 때문에 전달할 수도 있습니다. __iter__()는 반복자를 생성합니다.

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석


4. 시퀀스

특별 글 [할당문]에서 시퀀스에 대해 다시 언급하겠습니다. 시퀀스는 리스트, 튜플, 문자열을 포함하는 추상적인 개념이기도 합니다. 그 자체로는 존재하지 않으며, 학습을 용이하게 하기 위해 만들어진 개념적 단어이기도 하다.

可迭代对象包含序列,既然序列包含了列表、元组和字符串,前面我们的例子中也涉及到 了,所以说序列可以被iter()和next()使用

序列可以分为有限序列和无限序列。有限序列就是有范围的,比如说range(10)就已经限定了范围,相反的,无限序列也就是没有限定范围的序列。

我们来生成一个无限序列,这里需要用到1个新模块itertools,itertools用于高效循环的迭代函数集合,它下面有一个方法count(),可生成迭代器且无范围,可以理解为无限迭代器。

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

通过这个例子我们可以看出来,只要执行一次,next()就会获取一次迭代器里面的内容并逐次获取,我这里只写了4个next(),你多写几次就会多输出几次。

像next()这种什么时候需要就什么时候调用的机制叫做懒加载机制,也叫懒汉式加载;

相反地就有饿汉式加载。比如for循环这种的,只要一执行就会把可迭代器里面的所有对象都获取。


五、列表推导式

列表推导式跟生成器有关,在讲生成器之前,需要先知道什么是列表推导式,列表推导式就是生成列表的一种方法,语法是这样的:

l = [i for i in 可迭代对象]

i表示要放进列表里的对象,for循环是一个式子。

比如我们用列表推导式来生成一个列表试试:

l = [i for i in range(5)]print(l)

运行结果:

[0, 1, 2, 3, 4]

运用列表推导式可以很方便地生成我们想要的列表。

同时它也有很多灵活的用法,比如在后面加上条件判断

l = [i for i in range(5) if 4<p>运行结果:</p><pre class="brush:php;toolbar:false">[0, 1, 2, 3, 4]

if后面的条件判断为真,则可以正常生成列表,如果为假,则列表推导式是无效的,此时的l将是一个空列表。

还有其他灵活的用法,比如操作前面的i,比如让i的数值全都翻2倍:

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

我们把迭代对象换一下,换成字符串,也同样可以输出,只是*在字符串里面表示重复操作符,所以效果变成了这样:

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

不仅如此,前面的i*2我们还可以用函数来进行操作,比如:

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

总而言之,列表推导式就是用来快速和自定义生成列表的一种方法,很灵活

那么有人可能会举一反三了,列表推导式都是用 [] 来进行操作的,那如果用()来操作行吗?它会不会生成一个元组?我们来看看:

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

[] 换成()之后,返回的是一个生成器generrator ,那么下面我们再来讲讲生成器:


六、生成器

生成器是真实存在于Python中的对象,与容器这种概念词是不同的,它是可以直接通过next()进行调用的。

1.生成器的第一种创建方法:生成器表达式

第一种创建方法跟列表推导式是差不多的,就是 [] 换成了():

l = (i for i in 可迭代对象)

比如我们来生成一个生成器,看看能不能用next()直接调用:

l = (i for i in "abcd")print(next(l))

运行结果:

a

可以看出,生成器是可以直接调用的。那么既然生成器可以被next()调用,那么生成器就是一个特殊的迭代器,是一个可迭代对象

2.生成器的第二种创建方法:yield

除了用上面那种方法创建生成器,还可以用yield来创建,方法如下:

yield 关键字

比如说我们用一个函数中包含yield来创建生成器:

def fun():
    a = 10
    while 1:
        a += 1
        yield a


b = fun()print(b)

运行结果:

<generator></generator>

结果就是生成了一个生成器,而且此时的函数fun()就已经不再是一个函数了,它是一个生成器,只要函数中出现了yield,函数就变成了生成器。

为什么while循环没有一直执行?先不着急,我们输出看看:

def fun():
    a = 10
    while 1:
        a += 1
        yield a


b = fun()print(next(b))print(next(b))print(next(b))

运行结果:

111213

我调用了三次,所以它就运行了三次,while循环虽然存在,但是却不起作用,是因为前面我们提过的懒汉式加载

什么时候需要了,什么时候用next()调用,就是懒汉式加载,不像饿汉式加载那样,提前生成了所有对象,如果这里换成for循环来完成,比如:

def fun():
    a = 10
    while 1:
        a += 1
        print(a)b = fun()

运行之后程序将会进入死循环,一直给a自加1,你可以试试看效果,这就是饿汉式加载提前生成了迭代器并调用了全部迭代器对象,饿汉式加载占用资源的放大镜

七、小结

今天讲的内容可能听起来比较枯燥,这也是没得办法的,有些东西第一次听可能有点”难以下咽“,见得多了之后就习惯了,你得强迫自己去试着接受和理解这些抽象的东西。

最后用一张图来总结一下它们的关系:

컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석

推荐学习:python教程

위 내용은 컨테이너, 반복 가능한 객체, 반복자 및 생성기에 대한 Python 상세 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 CSDN에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
파이썬 목록을 어떻게 슬라이스합니까?파이썬 목록을 어떻게 슬라이스합니까?May 02, 2025 am 12:14 AM

slicepaythonlistisdoneusingthesyntaxlist [start : step : step] .here'showitworks : 1) startistheindexofthefirstelementtoinclude.2) stopistheindexofthefirstelemement.3) stepisincrementbetwetweentractionsoftortionsoflists

Numpy Array에서 수행 할 수있는 일반적인 작업은 무엇입니까?Numpy Array에서 수행 할 수있는 일반적인 작업은 무엇입니까?May 02, 2025 am 12:09 AM

NumpyAllowsForVariousOperationsOnArrays : 1) BasicArithmeticLikeadDition, Subtraction, A 및 Division; 2) AdvancedOperationsSuchasmatrixmultiplication; 3) extrayintondsfordatamanipulation; 5) Ag

파이썬으로 데이터 분석에 어레이가 어떻게 사용됩니까?파이썬으로 데이터 분석에 어레이가 어떻게 사용됩니까?May 02, 2025 am 12:09 AM

Arraysinpython, 특히 Stroughnumpyandpandas, areestentialfordataanalysis, setingspeedandefficiency

목록의 메모리 풋 프린트는 파이썬 배열의 메모리 풋 프린트와 어떻게 비교됩니까?목록의 메모리 풋 프린트는 파이썬 배열의 메모리 풋 프린트와 어떻게 비교됩니까?May 02, 2025 am 12:08 AM

ListSandnumpyArraysInpythonHavedifferentmoryfootPrints : ListSaremoreFlexibleButlessMemory-Efficer, whilumpyArraySareOptimizedFornumericalData.1) ListSTorERENFERENCESTOOBJECTS, OverHeadAround64ByTeson64-BitSyStems.2) NumpyArraysTATACONTACOTIGUOU

실행 파이썬 스크립트를 배포 할 때 환경 별 구성을 어떻게 처리합니까?실행 파이썬 스크립트를 배포 할 때 환경 별 구성을 어떻게 처리합니까?May 02, 2025 am 12:07 AM

ToensurePythonScriptTscriptsBecorrectelyRossDevelopment, Staging and Production, UsethesEStrategies : 1) EnvironmberVariblesForsimplesettings, 2) ConfigurationFilesforcomplexSetups 및 3) DynamicLoadingForAdAptability

파이썬 어레이를 어떻게 슬라이스합니까?파이썬 어레이를 어떻게 슬라이스합니까?May 01, 2025 am 12:18 AM

Python List 슬라이싱의 기본 구문은 목록 [start : stop : step]입니다. 1. Start는 첫 번째 요소 인덱스, 2.Stop은 첫 번째 요소 인덱스가 제외되고 3. Step은 요소 사이의 단계 크기를 결정합니다. 슬라이스는 데이터를 추출하는 데 사용될뿐만 아니라 목록을 수정하고 반전시키는 데 사용됩니다.

어떤 상황에서 목록이 배열보다 더 잘 수행 될 수 있습니까?어떤 상황에서 목록이 배열보다 더 잘 수행 될 수 있습니까?May 01, 2025 am 12:06 AM

ListSoutPerformArraysin : 1) DynamicsizingandFrequentInsertions/Deletions, 2) StoringHeterogeneousData 및 3) MemoryEfficiencyForsParsEdata, butMayHavesLightPerformanceCosceperationOperations.

파이썬 어레이를 파이썬 목록으로 어떻게 변환 할 수 있습니까?파이썬 어레이를 파이썬 목록으로 어떻게 변환 할 수 있습니까?May 01, 2025 am 12:05 AM

TOCONVERTAPYTHONARRAYTOALIST, USETHELIST () CONSTUCTORORAGENERATERATOREXPRESSION.1) importTheArrayModuleAndCreateAnarray.2) USELIST (ARR) 또는 [XFORXINARR] TOCONVERTITTOALIST.

See all articles

핫 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.