《Python基础教程》 读书笔记 第五章(下)循环语句

5.5.1while循环

x=1
while x<=100:
    print x
    x+=1 

确保用户输入了名字:

name=""
while not name:
    name=raw_input(‘please enter your name:‘)
print ‘hello,%s!‘%name

5.5.2for循环

while语句非常灵活。它可以用来在任何条件为真的情况下重复执行一个代码块。一般情况下这样就够用了,但是有些时候还得量体裁衣。比如要为一个集合(序列和其他可迭代对象)的每个元素都执行一个代码块。这个时候可以使用for语句:

words=[‘a‘,‘b‘,‘c‘,‘d‘]
for word in words:
    print word

5.5.3循环遍历字典元素

一个简单的for语句就能循环字典的所有键,就像处理序列一样

d={‘x‘:1,‘y‘:2,‘z‘:3}
for key in d:
    print key,‘corresponds to‘,d[key]

注意:字典元素的顺序通常是没有定义的。换句话说,迭代的时候,字典中的健和值都能保证被处理,但是处理顺序不确定。如果顺序很重要的话,可以将键值保存在单独的列表中,例如在迭代前进行排序。

5.5.4一些迭代工具

1.并行迭代

程序可以同时迭代两个序列。

names=[‘anne‘,‘beth‘,‘george‘,‘damon‘]
ages=[12,45,32,102]
for i  in range(len(names)):
    print names[1],‘is‘,ages[i],‘years old‘

内建的zip函数可以用来进行并行迭代,可以把两个序列“压缩”在一起,然后返回一个元组的列表:

>>> zip(names,ages)
[(‘anne‘, 12), (‘beth‘, 45), (‘george‘, 32), (‘damon‘, 102)]

循环中解包元组:

>>> for name,age in zip(names,ages):

    print name,‘is‘,age,‘years old‘

anne is 12 years old

beth is 45 years old

george is 32 years old

damon is 102 years old

zip函数也可以作用于任意多的序列。关于它很重要的一点是zip可以应付不等长的序列:当最短的序列“用完”的时候就会停止:

>>> zip(range(5),xrange(100000000))

[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

2.编号迭代

有些时候想要迭代序列中的对象,同时还要获取当前对象的索引。例如,在一个字符串列表中替换所有包含’XXX’的子字符串:\

index=0

for string in strings:

    if ‘xxx‘ in strings:

    strings[index]=‘[censored‘

index+=1

另一种方法是使用内建的enumerate函数:

3.翻转和排序迭代

两个有用的函数:reversed和sorted:它们同列表的reverse和sort (sorted和sort使用同样的参数)方法类似,但作用于任何序列或可迭代对象上,不是原地修改对象,而是返回翻转或排序后的版本:

>>> sorted([4,3,5,8,1])

[1, 3, 4, 5, 8]

>>> sorted(‘hell,world!‘)

[‘!‘, ‘,‘, ‘d‘, ‘e‘, ‘h‘, ‘l‘, ‘l‘, ‘l‘, ‘o‘, ‘r‘, ‘w‘]

>>> list(reversed(‘hello,world‘))

[‘d‘, ‘l‘, ‘r‘, ‘o‘, ‘w‘, ‘,‘, ‘o‘, ‘l‘, ‘l‘, ‘e‘, ‘h‘]

>>> ‘‘.join(reversed(‘hello,world!‘))

‘!dlrow,olleh‘

5.5.5跳出循环

1. break

结束(跳出)循环可以使用break语句。

from math import sqrt

for n in range(99,0,-1):

    root=sqrt(n)

    if root ==int(root):

        print n

        break

2. continue

continue会让当前的迭代结束,“跳”到下一轮循环的开始。它最基本的意思是“跳过剩余的循环体,但是不结束循环”。当循环体很大而且很复杂的时候,这会很有用,有些时候因为一些原因可能会跳过它—这个时候可以使用continue语句:

for x in seq:

if condition1: continue

if condition2: continue

if condition3: continue

do_something()

da_ something_ else()

do_ another_thing()

etc()

很多时候,只要使用if语句就可以了:

for x in seq:

if not (condition1 or condition2 or condition3)

do_something()

do_something_else()

do_another_thing()

etc()

3.while True/break习语

while True:

    word=raw_input(‘please enter a word:‘)

    if not word:break

    print ‘the word was ‘+word

while True的部分实现了一个永远不会自己停止的循环。但是在循环内部的if语句中加入条件可以的,在条件满足时调用break语句。这样一来就可以在循环内部任何地方而不是只在开头(像普通的while循环一样)终止循环。if/break语句自然地将循环分为两部分:第1部分负责初始化(在普通的while循环中,这部分需要重复),第2部分则在循环条件为真的情况下使用第1部分内初始化好的数据。

5.5.6循环中的else子句

from math import sqrt

for n in range(99,81,-1):

    root=sqrt(n)

    if root==int(root):

        print n

        break

    else:

        print "didn‘t find it"

5.6列表推导式——轻量级循环

列表推导式(list comprehension)是利用其他列表创建新列表(类似于数学术语中的集合推导式)的一种方法。它的工作方式类似于for循环:

>>> [x*x for x in range(10)]

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

可以增加更多for语句的部分:

>>> [(x,y)for x in range(3) for y in range(3)]

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)

5.7三人行 :pass, del和exec

5.7.1 pass

它可以在的代码中做占位符使用。比如程序需要一个jf语句,然后进行测试,但是缺少其中一个语句块的代码,考虑下面的情况:

if name==‘ralph‘:
    print ‘welcome!‘
elif name==‘enid‘:
    pass
elif name==‘bill‘:
    print ‘access‘

5.7.2使用del删除

>>> scoundrel={‘age‘:42,‘first name‘:‘robin‘,‘last name‘:‘of locksley‘}
>>> robin=scoundrel
>>> scoundrel
{‘last name‘: ‘of locksley‘, ‘first name‘: ‘robin‘, ‘age‘: 42}
>>> robin
{‘last name‘: ‘of locksley‘, ‘first name‘: ‘robin‘, ‘age‘: 42}
>>> coundrel=None
>>> robin
{‘last name‘: ‘of locksley‘, ‘first name‘: ‘robin‘, ‘age‘: 42}
>>> robin=None

首先,robin和scoundrel都被绑定到同一个字典上。所以当设置scoundrel为None的时候,字典通过robin还是可用的。但是当我把robin也设置为None的时候,字典就“漂”在内存里面了,没有任何名字绑定到它上面。没有办法获取和使用它,所以Python解释器(以其无穷的智慧)直接删除了那个字典(这种行为被称为垃圾收集)。

>>> x=["hello","world"]
>>> y=x
>>> y[1]="python"
>>> x
[‘hello‘, ‘python‘]
>>> del x
>>> y
[‘hello‘, ‘python‘]
>>> x
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name ‘x‘ is not defined

5.7.3 使用exec和eval执行和求值字符串

1 .exec
执行一个字符串的语句是exec:

>>> exec "print ‘hello,world!‘"
hello,world!
>>> from math import sqrt
>>> exec "sqrt=1"
>>> sqrt(4)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: ‘int‘ object is not callable

exec语句最有用的地方在于可以动态地创建代码字符串。如果字符串是从其他地方获得的—很有可能是用户—那么几乎不能确定其中到底包含什么代码。所以为了安全起见,可以增加一个字典,起到命名空间的作用。

可以通过增加in<scope>来实现,其中的<seope>就是起到放置代码字符串命名空间作用的字典。

>>> from math import sqrt
>>> scope={}
>>> exec "sqrt=1" in scope
>>> sqrt(4)
2.0
>>> scope[‘sqrt‘]
1

可以看到,潜在的破坏性代码并不会覆盖sqrt函数,原来的函数能正常工作,而通过exec赋值的变量sqrt只在它的作用域内有效。注意,如果需要将scope打印出来的话,会看到其中包含很多东西,因为内建的_builtins_字典自动包含所有的内建函数和值:

>>> len(scope)
2
>>> scope.keys()
[‘__builtins__‘, ‘sqrt‘]

2.eval

eval(用于“求值”)是类似于exec的内建函数。exec语句会执行一系列Python语句,而eval会计算Python表达式(以字符串形式书写),并且返回结果值,(exec语句并不返回任何对象,因为它本身就是语句)。例如,可以使用下面的代码创建一个Python计算器:

>>> eval(raw_input("enter an arthmetric expression:"))
enter an arthmetric expression: 6+18*2
42

5.8 小结  

本章的新函数

chr(n)   当传入序号n时,返回n所代表的包含一个字符的字符串,(0, n< 256)
eval(source[,globals[,locals]])  将字符申作为表达式计算,并且返回值
enumerate(seq) 产生用于迭代的(索引,值)对
ord(c)  返回单字符字符串的int值
range([start,]stop[,step])  创建整数的列表
reversed(seq)  产生seq中值的反向版本,用于迭代
sorted(seq[,cmp][,key][,reverse])  返回seq中值排序后的列表
xrange([start,]stop[,step])  创造xrange对象用于迭代
zip(seq1,_eq2.…)  创造用于并行迭代的新序列

时间: 2024-08-26 06:05:09

《Python基础教程》 读书笔记 第五章(下)循环语句的相关文章

SQL Server2012 T-SQL基础教程--读书笔记(5-7章)

SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5.1.2 使用参数 5.1.3 嵌套 5.1.4 多个引用 5.2 公用表表达式 5.2.1 分别列别名 5.2.2 使用参数 5.2.3 定义多个CTE 5.2.4 CTE的多次引用 5.2.5 递归CTE 5.3 视图 5.3.1 视图和ORDER BY 子句 5.3.2 视图选项 5.4 内嵌表

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API.目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中. 异常 为了尽可能准确地处理错误,API中定义了一些异常.它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常. 连

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第05章 | 条件、循环和其他语句

第05章 | 条件.循环和其他语句 ------ print 和 import #如果要打印多个语句,用,分割 >>> print "Name is:","Sherry.","Age is:",40 Name is: Sherry. Age is: 40 >>> print (1,2,3) #如果要打印元祖 (1, 2, 3) >>> print 1,2,3 #print语句会在每个元素间插入

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第14章 | 网络编程

Python是个很强大的网络编程工具,原因有二: 1. Python内有很多针对常见网络协议的库 2. Python在处理字节流方面的优势 本章主要内容: 探讨Python标准库中的一些网络模块,探讨SocketServer类,最后是Twisted框架. ------ 相关模块 Socket模块 基本组件,用于两个程序之间的信息通道.套接字包括两个: 服务器套接字和客户端套接字.创建一个服务器套接字后,让它等待连接,这样它就在某个网络地址处监听.客户端套接字负责:简单的连接,完成事务,断开连接.

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中,键可以使字符,数字,或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每个键都是由坐标值组成的元祖 存储文件修改的次数,文件名作为键 数字电话/地址薄 函数传递值def func(x,*args,**args): 如果要建公司员工与座机号的列表,如果要获得Alice的座机只能这么找 >>> names   = ['Alice','Bob','Tom'] >>> n

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第12章 | 图形用户界面

Python支持的工具包很多,但没有一个被认为标准的工具包,用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ 丰富的平台: Tkinter实际上类似于标准,因为它被用于大多数正式的Python GUI程序,而且它是Windows二进制发布版的一部分, 但是在UNIX上要自己编译安装. 另一个越来越受欢迎的工具是wxPython.这是个成熟而且特性丰富的包,也是Python之父,Guido van Rossu

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #如果文件不在,会报下面错误: >>> f = open(r'D:\text.txt','r') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'D:\\

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第08章 | 异常

------ 什么是异常:Python用异常对象(exception object)来表示异常情况.如果异常信息未被处理或捕捉. 程序就会用回潄来终止执行 >>> 1/0 Traceback (most recent call last): #Traceback: 一种错误信息 File "<stdin>", line 1, in ? ZeroDivisionError: integer division or modulo by zero 每个异常都是一