`
810364804
  • 浏览: 784862 次
文章分类
社区版块
存档分类
最新评论

Python 学习入门(20)—— 循环

 
阅读更多

1. for 循环

for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次。

基本构造是

for 元素 in 序列: 
    statement

举例来说,我们编辑一个叫forDemo.py的文件

for a in [3,4.4,'life']:
    print a

这个循环就是每次从表[3,4.4,'life'] 中取出一个元素(回忆:表是一种序列),然后将这个元素赋值给a,之后执行隶属于for的操作(print)。

介绍一个新的python函数range(),来帮助你建立表。

idx = range(5)
print idx

可以看到idx是[0,1,2,3,4]

这个函数的功能是新建一个表。这个表的元素都是整数,从0开始,下一个元素比前一个大1, 直到函数中所写的上限 (不包括该上限本身)

(关于range(),还有丰富用法,有兴趣可以查阅, python 3中, range()用法有变化,见评论区)

举例

for a in range(10):
    print a**2


2. while循环

while的用法是

while 条件:
    statement

while会不停地循环执行隶属于它的语句,直到条件为假(False)
举例

while i < 10:
    print i
    i = i + 1


3. 中断循环

(定义一个的说法。循环是相同的一组操作重复多次,我们把其中的一组操作叫做一环)

continue# 在同一循环的某一环,如果遇到continue, 那么跳过这一环,进行下一次环的操作

break# 停止执行整个循环

for i in range(10):
    if i == 2: 
continue print i

当循环执行到i = 2的时候,if条件成立,触发continue, 跳过本环(不执行print),继续进行下一环(i = 3)

for i in range(10):
    if i == 2:        
        break
    print i

当循环执行到i = 2的时候,if条件成立,触发break, 循环停止执行。

总结

range()

for 元素 in 序列:

while 条件:

continue

break


更加灵活的循环方式

1. 利用range(), 得到下标

在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标。

之前我们已经使用过range来控制for循环。现在,我们继续开发range的功能,以实现下标对循环的控制:

S = 'abcdefghijk'
for i in range(0,len(S),2):
    print S[i]

在该例子中,我们利用len()函数和range()函数,用i作为S序列的下标来控制循环。在range函数中,分别定义上限,下限和每次循环的步长。这就和C语言中的for循环相类似了。

2. 利用enumerate(), 同时得到下标和元素

利用enumerate()函数,可以在每次循环中同时得到下标和元素:

S = 'abcdefghijk'
for (index,char) in enumerate(S):
    print index
    print char

实际上,enumerate()在每次循环中,返回的是一个包含两个元素的定值表(tuple),两个元素分别赋予index和char

3. 利用zip(), 实现并行循环

如果你多个等长的序列,然后想要每次循环时从各个序列分别取出一个元素,可以利用zip()方便地实现:

ta = [1,2,3]
tb = [9,8,7]
tc = ['a','b','c']
for (a,b,c) in zip(ta,tb,tc):
    print(a,b,c)

每次循环时,从各个序列分别从左到右取出一个元素,合并成一个tuple,然后tuple的元素赋予给a,b,c

zip()函数的功能,就是从多个列表中,依次各取出一个元素。每次取出的(来自不同列表的)元素合成一个元组,合并成的元组放入zip()返回的列表中。

zip()函数起到了聚合列表的功能。我们还可以分解该聚合后的列表,如下:

ta = [1,2,3]
tb = [9,8,7]

# cluster zipped
= zip(ta,tb) print(zipped)

# decompose
na, nb = zip(*zipped)
print(na, nb)

总结:

range()

enumerate()

zip()



循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,从zip()或者map()的改变来看,循环对象正在成为循环的标准形式。

1. 什么是循环对象

循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在python 3x中), 这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出StopIteration错误

当一个循环结构(比如for)调用循环对象时,它就会每次循环的时候调用next()方法,直到StopIteration出现,for循环接收到,就知道循环已经结束,停止调用next()。

假设我们有一个test.txt的文件:

1234
abcd
efg

我们运行一下python命令行:

>>> f = open('test.txt')

>>> f.next()

>>> f.next()

...

不断地输入f.next(),直到最后出现StopIteration

open()返回的实际上是一个循环对象,包含有next()方法。而该next()方法每次返回的就是新的一行的内容,到达文件结尾时举出StopIteration。这样,我们相当于手工进行了循环。

自动进行的话,就是:

for line in open('test.txt'):
    print line

在这里,for结构自动调用next()方法,将该方法的返回值赋予给line。循环知道出现StopIteration的时候结束。

相对于序列,用循环对象来控制循环的好处在于:可以不用在循环还没有开始的时候,就生成每次要使用的元素。所使用的元素在循环过程中逐次生成。这样,就节省了空间,提高了效率,并提高编程的灵活性。

2. iter()函数和循环器(iterator)

从技术上来说,循环对象和for循环调用之间还有一个中间层,就是要将循环对象转换成循环器(iterator)。这一转换是通过使用iter()函数实现的。但从逻辑层面上,常常可以忽略这一层,所以循环对象和循环器常常相互指代对方。

3. 生成器(generator)

生成器的主要目的是构成一个用户自定义的循环对象。

生成器的编写方法和函数定义类似,只是在return的地方改为yield。生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。生成器自身又构成一个循环器,每次循环使用一个yield返回的值。

下面是一个生成器:

def gen():
    a = 100
    yield a
    a = a*8
    yield a
    yield 1000

该生成器共有三个yield, 如果用作循环器时,会进行三次循环。

for i in gen():
    print i

再考虑如下一个生成器:

def gen():
    for i in range(4):
        yield i

它又可以写成生成器表达式(Generator Expression):

G = (x for x in range(4))

生成器表达式是生成器的一种简便的编写方式。读者可进一步查阅。

4. 表推导(list comprehension)

表推导是快速生成表的方法。假设我们生成表L:

L = []
for x in range(10):
    L.append(x**2)

以上产生了表L,但实际上有快捷的写法,也就是表推导的方式:

L = [x**2 for x in range(10)]

这与生成器表达式类似,只不过用的是中括号

(表推导的机制实际上是利用循环对象,有兴趣可以查阅。)

考虑下面的表推导会生成什么?

xl = [1,3,5]
yl = [9,12,13]
L  = [ x**2 for (x,y) in zip(xl,yl) if y > 10]

总结:

循环对象

生成器

表推导



参考推荐:

Python 系列教程


分享到:
评论

相关推荐

    python小白进阶之路三——循环结构入门练习+Random库练习

    python小白进阶之路三——循环结构入门练习+Random库练习。在学习过程中自己整理的具有代表性的练习题目,欢迎食用

    Python入门——基础篇

    Python语言入门,基础篇,思维导图格式,精简版(输入输出、数据类型、条件语句、循环、字符串等常用操作、文件操作、函数、类和对象,异常、模块和包),仅供参考

    Python编程入门经典

    1.3 开始使用Python——字符串 6 1.3.1 字符串概述 6 1.3.2 为什么需要引号 6 1.3.3 为什么有3种类型的引号 7 1.3.4 使用print()函数 7 1.3.5 理解不同的引号 8 1.4 串联两个字符串 10 1.5 用不同的方法串联字符串 ...

    【Python入门基础】循环结构(九九乘法表实例)

    在Python中构造循环结构有两种做法,一种是’for-in’循环,一种是’while’循环。 for-in循环 如果明确的知道循环执行的次数或者要对一个容器进行迭代,那么就可以使用’for-in’循环。 eg.1~100求和 sum = 0 for ...

    零基础入门深度学习(系列) 中文PDF完整版

    无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理...零基础入门深度学习(5) - 循环神经网络 零基础入门深度学习(6) - 长短时记忆网络(LSTM) 零基础入门深度学习(7) - 递归神经网络

    Python脚本入门学习经典手册.doc

    如何使用Geoprocessor Programming Model中的Lists11 3使用地理处理工具——Toolboxes和Aliases11 4在建模中使用脚本(Scripts in ModelBuilder)12 5 在PythonWin里调试地理处理脚本18 5.1 调试选择和消息19 5.2...

    python基于while 嵌套案例——九九乘法表

    此代码基于python快速编程入门,用的是while嵌套,仅此用于学习交流,为了大家不用编写,所以做次文档

    Python开发入门——迭代的基本使用

    介绍 本文主要介绍Python中迭代的基本知识和使用 什么是迭代 在Python中,如果给定一个list或tuple,...可以看出,Python的for循环抽象程度要高于Java的for循环。 因为 Python 的 for循环不仅可以用在list或tuple上,

    python开发入门——列表生成式

    本文主要介绍Python中列表生成式的基本知识和使用 生成列表 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11): &gt;&gt;&gt; range(1, 11) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 但如果要生成[1×1, 2×2...

    Python入门——三大流程

    循环结构:程序按照指定的条件,如果条件满足就重复指定一端处理代码的过程。 意义 要想设计一个软件,其代码量是很大的,三大的出现会根据不同的条件,执行不同的逻辑处理过程。 一.顺序流程 按照顺序依次逐行执行...

    头歌python答案及解析

    头歌实践教学平台python答案

    Python学习 | 一个JAVA程序员两天的Python入门笔记

    文章目录vlog正文入门基础注释算数运算符及优先级程序执行原理变量概念和定义方式变量的命名变量的输入和输出数据类型数值型非数值型列表元组列表与元组的互相转换字典字符串在Python中所有非数字型变量都支持的特点...

    EduCoder实践课程——Python程序设计入门答案

    以前没有学过,可能是之前有过acm经验,感觉Python挺好入门的,把自己学习过程中的代码记录下来,一是为了自己写报告方便,二来大家可以作为参考代码,如果有更好的代码可以留言,大家相互学习。本文持续更新~ 1、...

    Python实现web服务器入门学习笔记(6)——多进程实现并发HTTP服务器的面向对象封装

    在Python实现web服务器入门学习笔记(3)——多进程、多线程实现并发HTTP服务器中,已经学习了如何通过多进程、多线程实现并发HTTP服务器,但当时是以实现功能为导向,并未使用面向对象的封装,本文记录一下如何对...

    【精选】《Python编程从入门到实践》学习笔记——第四章 操作列表

    本系列记录的是自己学习笔记,以及一些总结,并未照搬书本,不代表python完整知识体系,道友可进行查漏补缺,与君共勉。 (将在github上同步更新:https://github.com/MemorialCheng/EverybodyEveryday) 第4章 操作...

    【精品分享】《Python编程从入门到实践》学习笔记——第二章 变量和简单数据类型

    本系列记录的是自己学习笔记,以及一些总结,并非照搬书本,道友可进行查漏补缺,与君共勉。 本系列文章传送门 第2章 变量和简单数据类型 第3章 列表简介 第4章 操作列表 第5章 if语句 第6章 字典 未完待续 第7章 ...

    简明python教程(chm)

    10. 解决问题——编写一个Python脚本 问题 解决方案 版本一 版本二 版本三 版本四 进一步优化 软件开发过程 概括 11. 面向对象的编程 简介 self 类 创建一个类 对象的方法 使用对象的方法 _...

    Python基础教程(第2版.修订版)

    Python基础教程(第2版.修订版)包括Python程序设计的方方面面,首先从Python的安装开始,随后介绍了Python的基础知识和基本概念,包括列表、元组、字符串、字典以及各种语句。然后循序渐进地介绍了一些相对高级的...

    简明python教程

    10. 解决问题——编写一个Python脚本 问题 解决方案 版本一 版本二 版本三 版本四 进一步优化 软件开发过程 概括 11. 面向对象的编程 简介 self 类 创建一个类 对象的方法 使用对象的方法 __init__...

Global site tag (gtag.js) - Google Analytics