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

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

WBOY
WBOY앞으로
2022-04-08 19:06:091852검색

이 글은 컨테이너, 반복 가능한 객체, 반복자 및 생성기와 관련된 문제를 주로 소개하는 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.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제