백엔드 개발 파이썬 튜토리얼 跟老齐学Python之让人欢喜让人忧的迭代

跟老齐学Python之让人欢喜让人忧的迭代

Jun 16, 2016 am 08:41 AM
반복

哦,这就是真正牛X的程序员。不过,他也仅仅是牛X罢了,还不是大神。大神程序员是什么样儿呢?他是扫地僧,大隐隐于市。

先搞清楚这些名词再说别的:

循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。
遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。
对于这四个听起来高深莫测的词汇,在教程中,已经涉及到了一个——循环(loop),本经主要介绍一下迭代(iterate),看官在网上google,就会发现,对于迭代和循环、递归之间的比较的文章不少,分别从不同角度将它们进行了对比。这里暂不比较,先搞明白python中的迭代。之后适当时机再比较,如果我不忘记的话,哈哈。

逐个访问

在python中,访问对象中每个元素,可以这么做:(例如一个list)

复制代码 代码如下:

>>> lst
['q', 'i', 'w', 's', 'i', 'r']
>>> for i in lst:
...     print i,
...
q i w s i r

除了这种方法,还可以这样:

复制代码 代码如下:

>>> lst_iter = iter(lst)    #对原来的list实施了一个iter()
>>> lst_iter.next()         #要不厌其烦地一个一个手动访问
'q'
>>> lst_iter.next()
'i'
>>> lst_iter.next()
'w'
>>> lst_iter.next()
's'
>>> lst_iter.next()
'i'
>>> lst_iter.next()
'r'
>>> lst_iter.next()
Traceback (most recent call last):
  File "", line 1, in
StopIteration

做为一名优秀的程序员,最佳品质就是“懒惰”,当然不能这样一个一个地敲啦,于是就:

复制代码 代码如下:

>>> while True:
...     print lst_iter.next()
...
Traceback (most recent call last):      #居然报错,而且错误跟前面一样?什么原因
  File "", line 2, in
StopIteration

>>> lst_iter = iter(lst)                #那就再写一遍,上面的错误暂且搁置,回头在研究
>>> while True:
...     print lst_iter.next()
...
q                                       #果然自动化地读取了
i
w
s
i
r
Traceback (most recent call last):      #读取到最后一个之后,报错,停止循环
  File "", line 2, in
StopIteration
>>>

首先了解一下上面用到的那个内置函数:iter(),官方文档中有这样一段话描述之:

复制代码 代码如下:

iter(o[, sentinel])
Return an iterator object. The first argument is interpreted very differently depending on the presence of the second argument. Without a second argument, o must be a collection object which supports the iteration protocol (the iter() method), or it must support the sequence protocol (the getitem() method with integer arguments starting at 0). If it does not support either of those protocols, TypeError is raised. If the second argument, sentinel, is given, then o must be a callable object. The iterator created in this case will call o with no arguments for each call to its next() method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value will be returned.

大意是说...(此处故意省略若干字,因为我相信看此文章的看官英语水平是达到看文档的水平了,乳沟没有,也不用着急,找个词典什么的帮助一下。)

尽管不翻译了,但是还要提炼一下主要的东西:

返回值是一个迭代器对象
参数需要是一个符合迭代协议的对象或者是一个序列对象
next()配合与之使用
什么是“可迭代的对象”呢?一般,我们常常将哪些能够用for来一个一个读取元素的对象,就称之为可迭代的对象。那么for也就被称之为迭代工具。所谓迭代工具,就是能够按照一定顺序扫描迭代对象的每个元素(按照从左到右的顺序),显然,除了for之外,还有别的可以称作迭代工具,比如列表解析,in来判断某元素是否属于序列对象等。

那么,刚才介绍的iter()的功能呢?它与next()配合使用,也是实现上述迭代工具的作用。在python中,甚至在其它的语言中,迭代这块的说法比较乱,主要是名词乱,刚才我们说,那些能够实现迭代的东西,称之为迭代工具,就是这些迭代工具,不少程序员都喜欢叫做迭代器。当然,这都是汉语翻译,英语就是iterator。

看官看上面的所有例子会发现,如果用for来迭代,当到末尾的时候,就自动结束了,不会报错。如果用iter()...next()迭代,当最后一个完成之后,它不会自动结束,还要向下继续,但是后面没有元素了,于是就报一个称之为StopIteration的错误(这个错误的名字叫做:停止迭代,这哪里是报错,分明是警告)。

看官还要关注iter()...next()迭代的一个特点。当迭代对象lst_iter被迭代结束,即每个元素都读取一边之后,指针就移动到了最后一个元素的后面。如果再访问,指针并没有自动返回到首位置,而是仍然停留在末位置,所以报StopIteration,想要再开始,需要重新再入迭代对象。所以,列位就看到,当我在上面重新进行迭代对象赋值之后,又可以继续了。这在for等类型的迭代工具中是没有的。

文件迭代器

现在有一个文件,名称:208.txt,其内容如下:

复制代码 代码如下:

Learn python with qiwsir.
There is free python course.
The website is:
http://qiwsir.github.io
Its language is Chinese.

用迭代器来操作这个文件,我们在前面讲述文件有关知识的时候已经做过了,无非就是:

复制代码 代码如下:

>>> f = open("208.txt")
>>> f.readline()        #读第一行
'Learn python with qiwsir.\n'
>>> f.readline()        #读第二行
'There is free python course.\n'
>>> f.readline()        #读第三行
'The website is:\n'
>>> f.readline()        #读第四行
'http://qiwsir.github.io\n'
>>> f.readline()        #读第五行,也就是这真在读完最后一行之后,到了此行的后面
'Its language is Chinese.\n'
>>> f.readline()        #无内容了,但是不报错,返回空。
''

以上演示的是用readline()一行一行地读。当然,在实际操作中,我们是绝对不能这样做的,一定要让它自动进行,比较常用的方法是:

复制代码 代码如下:

>>> for line in f:     #这个操作是紧接着上面的操作进行的,请看官主要观察
...     print line,    #没有打印出任何东西
...

这段代码之所没有打印出东西来,是因为经过前面的迭代,指针已经移到了最后了。这就是迭代的一个特点,要小心指针的位置。

复制代码 代码如下:

>>> f = open("208.txt")     #从头再来
>>> for line in f:
...     print line,
...
Learn python with qiwsir.
There is free python course.
The website is:
http://qiwsir.github.io
Its language is Chinese.

这种方法是读取文件常用的。另外一个readlines()也可以。但是,需要有一些小心的地方,看官如果想不起来小心什么,可以在将关于文件的课程复习一边。

上面过程用next()也能够读取。

复制代码 代码如下:

>>> f = open("208.txt")
>>> f.next()
'Learn python with qiwsir.\n'
>>> f.next()
'There is free python course.\n'
>>> f.next()
'The website is:\n'
>>> f.next()
'http://qiwsir.github.io\n'
>>> f.next()
'Its language is Chinese.\n'
>>> f.next()
Traceback (most recent call last):
  File "", line 1, in
StopIteration

如果用next(),就可以直接读取每行的内容。这说明文件是天然的可迭代对象,不需要用iter()转换了。

再有,我们用for来实现迭代,在本质上,就是自动调用next(),只不过这个工作,已经让for偷偷地替我们干了,到这里,列位是不是应该给for取另外一个名字:它叫雷锋。

前面提到了,列表解析也能够做为迭代工具,在研究列表的时候,看官想必已经清楚了。那么对文件,是否可以用?试一试:

复制代码 代码如下:

>>> [ line for line in open('208.txt') ]
['Learn python with qiwsir.\n', 'There is free python course.\n', 'The website is:\n', 'http://qiwsir.github.io\n', 'Its language is Chinese.\n']

至此,看官难道还不为列表解析所折服吗?真的很强大,又强又大呀。

其实,迭代器远远不止上述这么简单,下面我们随便列举一些,在python中还可以这样得到迭代对象中的元素。

复制代码 代码如下:

>>> list(open('208.txt'))
['Learn python with qiwsir.\n', 'There is free python course.\n', 'The website is:\n', 'http://qiwsir.github.io\n', 'Its language is Chinese.\n']

>>> tuple(open('208.txt'))
('Learn python with qiwsir.\n', 'There is free python course.\n', 'The website is:\n', 'http://qiwsir.github.io\n', 'Its language is Chinese.\n')

>>> "$$$".join(open('208.txt'))
'Learn python with qiwsir.\n$$$There is free python course.\n$$$The website is:\n$$$http://qiwsir.github.io\n$$$Its language is Chinese.\n'

>>> a,b,c,d,e = open("208.txt")
>>> a
'Learn python with qiwsir.\n'
>>> b
'There is free python course.\n'
>>> c
'The website is:\n'
>>> d
'http://qiwsir.github.io\n'
>>> e
'Its language is Chinese.\n'

上述方式,在编程实践中不一定用得上,只是向看官展示一下,并且看官要明白,可以这么做,不是非要这么做。

补充一下,字典也可以迭代,看官自己不妨摸索一下(其实前面已经用for迭代过了,这次请摸索一下用iter()...next()手动一步一步迭代)。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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 Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

AI 기술로 반복 가속화: Zhou Hongyi의 관점에서 본 대형 모델 전략 AI 기술로 반복 가속화: Zhou Hongyi의 관점에서 본 대형 모델 전략 Jun 15, 2023 pm 02:25 PM

올해부터 360그룹 창업주 저우훙이(周洪伯)는 모든 공개 연설에서 한 가지 주제를 빼놓을 수 없었다. 바로 인공지능 대형 모델이다. 그는 한때 자신을 "GPT 전도사"라고 불렀으며 ChatGPT가 달성한 혁신에 대해 칭찬을 아끼지 않았으며 AI 기술 반복의 결과에 대해 확고히 낙관했습니다. 자신을 표현하는 데 능숙한 유명 기업가인 Zhou Hongyi의 연설은 종종 재치 있는 발언으로 가득 차 있기 때문에 그의 '설교'도 많은 화제를 불러일으켰고 실제로 대형 AI 모델의 불씨에 연료를 추가했습니다. 그러나 Zhou Hongyi에게는 오피니언 리더가 되는 것만으로는 충분하지 않습니다. 외부 세계는 그가 운영하는 회사인 360이 이러한 새로운 AI 물결에 어떻게 대응하는지에 더 관심을 갖고 있습니다. 실제로 Zhou Hongyi는 360 내에서 이미 모든 직원을 대상으로 변화를 시작했으며 지난 4월 모든 직원과 360의 모든 직원을 요청하는 내부 서신을 발행했습니다.

루프와 반복의 모험: Python 코드의 모험 루프와 반복의 모험: Python 코드의 모험 Feb 19, 2024 pm 08:48 PM

루프 및 반복: 프로그래밍의 핵심 개념 루프 및 반복은 프로그램이 일련의 명령을 반복적으로 실행할 수 있도록 하는 프로그래밍의 필수 개념입니다. 루프는 반복 횟수를 명시적으로 지정하는 데 사용되는 반면, 반복은 컬렉션이나 데이터 구조의 요소를 반복하는 데 사용됩니다. 루프 유형 루프에는 세 가지 주요 유형이 있습니다. 1. for 루프 for 루프는 반복 횟수를 알고 있을 때 코드 블록을 실행하는 데 사용됩니다. 구문은 다음과 같습니다: for(초기화; 조건; 증가/감소) {//반복적으로 실행되는 코드 블록} 예를 들어 다음 for 루프는 1부터 10까지의 숫자를 인쇄합니다. for(inti=1;i

Java에서 역순으로 TreeMap을 반복합니다. Java에서 역순으로 TreeMap을 반복합니다. Aug 21, 2023 pm 01:05 PM

TreeMap은 NavigableMap 인터페이스를 구현하는 JavaCollectionFramework 클래스입니다. 이는 맵의 요소를 트리 구조로 저장하고 키-값 쌍을 정렬된 순서로 저장하는 효율적인 방법을 제공합니다. 즉, 항상 오름차순으로 요소를 반환합니다. 그러나 Java는 TreeMap을 내림차순으로 탐색하는 여러 가지 방법을 제공합니다. 이번 글에서는 TreeMap을 역순으로 탐색하는 방법을 살펴보겠습니다. Java에서 역순으로 TreeMap을 반복합니다. 다음 방법을 사용하여 TreeMap의 요소를 역순으로 인쇄합니다. TreeMap.descendingMap() 메서드 사용 TreeMap.de 사용

PHP 언어 개발에서 반복 재귀 트랩 방지 PHP 언어 개발에서 반복 재귀 트랩 방지 Jun 10, 2023 pm 12:24 PM

PHP 언어 개발에서 반복 및 재귀 트랩 방지 반복 및 재귀는 프로그래밍에서 두 가지 다른 프로세스 제어 방법으로, 실제 애플리케이션 시나리오와 개발자의 코딩 습관에 따라 달라집니다. PHP 개발에서는 반복과 재귀를 사용하는 것이 일반적이지만 비효율적인 코드, 오류 및 기타 문제로 이어지는 함정이 있을 수도 있습니다. 따라서 반복 재귀 함정을 피하기 위해서는 개발 과정에서 몇 가지 기술에 주의를 기울여야 합니다. 반복 및 재귀 소개 반복 및 재귀는 동일한 코드 블록을 여러 번 실행하는 데 사용되는 루프 구조입니다. 반복의 기본 아이디어

Python 3.x에서 파일 반복을 위해 fileinput 모듈을 사용하는 방법 Python 3.x에서 파일 반복을 위해 fileinput 모듈을 사용하는 방법 Jul 29, 2023 pm 11:45 PM

Python3.x에서 파일 반복을 위해 fileinput 모듈을 사용하는 방법 Python 프로그래밍에서는 파일 내용 읽기, 파일 내용 쓰기 등과 같은 파일을 조작해야 하는 경우가 많습니다. 여러 파일을 처리할 때 fileinput 모듈을 사용하면 파일 반복 작업을 쉽게 수행할 수 있습니다. 이 기사에서는 Python3.x에서 파일 반복을 위해 fileinput 모듈을 사용하는 방법을 소개하고 코드 예제를 제공합니다. fileinput 모듈은 Python 표준 라이브러리입니다.

처음부터 jQuery 반복을 구현하는 방법 알아보기 처음부터 jQuery 반복을 구현하는 방법 알아보기 Feb 29, 2024 am 09:45 AM

jQuery 반복을 처음부터 구현하는 방법을 배우려면 특정 코드 예제가 필요합니다. jQuery는 웹 개발에 널리 사용되는 인기 있는 JavaScript 라이브러리입니다. 그 중 반복(iteration)은 jQuery에서 일반적으로 사용되는 작업 중 하나입니다. 반복을 통해 요소 집합을 탐색하고 해당 작업을 수행할 수 있습니다. 이 글에서는 반복의 기본 원리와 구체적인 코드 예제를 중심으로 jQuery 반복 구현을 처음부터 배우는 방법을 소개합니다. 1. 반복의 기본 원칙 jQuery에서 반복의 구현은 주로 다음 사항에 의존합니다.

루프 문을 사용하여 Java에서 반복 계산을 구현하는 방법 루프 문을 사용하여 Java에서 반복 계산을 구현하는 방법 Oct 18, 2023 am 10:40 AM

루프문을 사용하여 Java에서 반복 계산을 구현하는 방법 프로그래밍에서는 반복적인 계산이나 작업을 수행해야 하는 경우가 많습니다. 이때 루프문은 중요한 역할을 합니다. Java에는 for 루프, while 루프 및 do-while 루프의 세 가지 형태의 루프 문이 있습니다. 이러한 루프 문은 반복 계산을 구현하는 데 도움이 됩니다. 즉, 여러 루프를 통해 원하는 결과에 점차적으로 접근할 수 있습니다. 다음에서는 이러한 루프 문을 사용하여 Java에서 반복 계산을 구현하는 방법을 자세히 소개하고 해당 코드 예제를 제공합니다.

Python 루프 및 반복: 유사점과 차이점에 대한 포괄적인 분석 Python 루프 및 반복: 유사점과 차이점에 대한 포괄적인 분석 Feb 19, 2024 pm 02:54 PM

루프 및 반복: 개념 분석 루프는 코드 블록이 지정된 횟수만큼 또는 특정 조건이 충족될 때까지 반복적으로 실행될 수 있도록 하는 제어 구조입니다. Python은 for 루프, while 루프 및 do-while 루프를 포함하여 다양한 루프 유형을 제공합니다. 반면, 반복은 시퀀스의 요소를 순서대로 순회하는 과정을 나타내는 추상적 개념입니다. Python은 반복을 구현하기 위한 반복자 및 생성기와 같은 도구를 제공합니다. 루프 대 반복: 유사점과 차이점 실행 메커니즘: 루프는 실행 흐름을 명시적으로 제어하는 ​​반면, 반복은 반복자 객체를 통해 암시적으로 수행됩니다. 상태 관리: 루프는 자체 상태(예: 카운터 또는 조건)를 유지하는 반면 반복기는 상태 관리를 캡슐화합니다. 사용 시나리오: 루프는 고정된 횟수만큼 반복되어야 하는 시간에 적합하거나

See all articles