本章主题
- -if语句
- -else语句
- -elif语句
- -条件表达式
- -while语句
- -for语句
- -break语句
- -continue语句
- -pass语句
- else语句
- iterators迭代器
- -列表解析
- -生成器表述
第8章 条件和循环
8.1 if语句
语法构成:关键字本身;用于判断结果真假的条件表达式;以及当表达式为真或非0时执行的代码块
8.1.1 多重条件表达式
单个if语句可以通过布尔操作符and、or和not实现多重判断条件或否定判断条件
if not warn and (system>10):
print "WARNING:losing resources"
warn+=1
8.1.2单一语句的代码块
若一个复合语句的代码块仅仅包括一行代码,那么它可以和前面的语句写在同一行上:
if make_copy:send_data()
8.2 else语句
语法:
if expression:
expr_true
else:
expr_false
python的缩进使用强制代码对齐。
8.3 elif(即else-if)语句
elif是python的else-if语句,检查多个表示式是否为真,并在为真时执行特定代码块中的代码。
if后面可以有任意数量的elif语句。
if expression1:
expr1_true
elif expression2:
expr2_true
...
elif expressionN:
exprN_true
else:
none_expr_true
8.4 条件表达式(三元操作符)
语法为:
X if C else Y
例子:
>>> x,y=4,3
>>> if x<y:
smaller=x
else:
smaller=y
>>> smaller
3
用条件表达式可以如下表达:
>>> smaller=x if y<y else y
>>> smaller
3
8.5 while语句
while中的代码块会一直循环执行,直到循环条件不再为真。
8.5.1一般语法
while expression:
suite_to_repeat
8.5.2 计数循环
>>> count=0
>>> while(count<9):
print 'the index is:',count
count+=1
the index is: 0
the index is: 1
the index is: 2
the index is: 3
the index is: 4
the index is: 5
the index is: 6
the index is: 7
the index is: 8
8.5.3 无限循环
常用于,比如许多通讯服务器的客户端/服务端系统。
8.6 for语句
for语句可以遍历序列成员,可在列表解析器和生成器表达式中,自动调用迭代器的next()方法,捕获StopIteration异常并结束循环。
8.6.1 一般语法
语法:
for iter_var in iterable:
suite_to_repeat
8.6.2 用于序列类型
使用for循环来迭代不同的序列对象。
迭代的3中方法:
1. 通过序列项迭代
>>> nameList=['Walter','Nicole','Steven','Henry']
>>> for eachname in nameList:
print eachname,"Lim"
Walter Lim
Nicole Lim
Steven Lim
Henry Lim
我们迭代一个列表。
2. 通过序列索引迭代
>>> nameList=['Cathy',"Terry",'Joe','Heather']
>>> nameList=['Cathy',"Terry",'Joe','Heather','Lucy']
>>> for nameIndex in range(len(nameList)):
print "Liu,",nameList[nameIndex]
Liu, Cathy
Liu, Terry
Liu, Joe
Liu, Heather
Liu, Lucy
我们没有使用迭代元素,是通过列表的索引迭代。这里我们使用了range()函数和len()函数
使用range()可以得到用来迭代nameList的索引数列表。
>>> len(nameList)
5
>>> range(len(nameList))
[0, 1, 2, 3, 4]
3.使用项和索引迭代
两全其美的方法就是使用内建函数enumerate()函数
>>> nameList=['Donn','Shirley','Ben','Janice','David','Yen','Wendy']
>>> for i,eachLee in enumerate(nameList):
print "%d %s Lee" %(i+1,eachLee)
1 Donn Lee
2 Shirley Lee
3 Ben Lee
4 Janice Lee
5 David Lee
6 Yen Lee
7 Wendy Lee
8.6.3用于迭代器类型
用for循环访问迭代器和访问序列差不多。迭代器并不代表循环条目的集合。
迭代器对象有一个next()方法,调用后返回下一个条目。
8.6.4 range()内建函数
range()函数的完整语法:
range(start,end,step=1)
例子:
>>> range(3,7)
[3, 4, 5, 6]
>>> range(2,10,4)
[2, 6]
>>> range(2,20,4)
[2, 6, 10, 14, 18]
range()简略语法:
range(end)
>>> range(5)
[0, 1, 2, 3, 4]
8.6.5 与序列相关的内建函数
sorted()、zip()(返回一个人序列(列表))
revered()、enumerate()(返回迭代器)
>>> a=('Poe','Gaudi','Freud','Poe2')
>>> b=(1976,1987,1990,2003)
>>> for s in sorted(a):
print s,
Freud Gaudi Poe Poe2
>>> for s in reversed(a):
print s,
Poe2 Freud Gaudi Poe
>>> for i,s in enumerate(a):
print i,s
0 Poe
1 Gaudi
2 Freud
3 Poe2
>>> a=('Poe','Gaudi','Freud','Poe2')
>>> b=(1976,1987,1990,2003)
>>> for t,y in zip(a,b):
print t,y
Poe 1976
Gaudi 1987
Freud 1990
Poe2 2003
8.7 break语句
break语句可以结束当前的循环然后跳转到下条语句。
num=raw_input('Enter a number:')
count=num/2
while count>0:
if num%count==0:
print count,'is the lagest factor of',num
break
count-=1
上面的代码就是给num寻找最大约数。
8.8 continue语句
程序遇到continue语句,会终止当前循环,忽略剩余语句,回到循环顶端。
v=False
count=3
while count>0:
input=raw_input("enter password:")
for eachpassword in passwdList:
if input==eachPassed:
v=True
break
if not v:
print "inv input"
count-=1
continue
else:
break
验证用户收入的例子,只有三次机会来输入密码,失败的话,v变量为False
8.9 pass语句
代码桩
pass语句不做任何事情,即无操作。
def f_function():
pass
8.10 再谈else语句
在python中,while和for循环中使用else语句。
在循环中使用,else只在循环完成后执行,也就是break语句也会跳过else块。
例8.1 while-else循环举例
#!/usr/bin/env/ python
def showMaxFactor(num):
count=num/2
while count>1:
if num%count==0:
print 'largest factor of %d is %d' % \
(num,count)
break
count-=1
else:
print num,"is prime"
for eachNum in range(10,21):
showMaxFactor(eachNum)
运行结果:
=====================
largest factor of 10 is 5
11 is prime
largest factor of 12 is 6
13 is prime
largest factor of 14 is 7
largest factor of 15 is 5
largest factor of 16 is 8
17 is prime
largest factor of 18 is 9
19 is prime
largest factor of 20 is 10
8.11 迭代器和iter()函数
8.11.1 什么是迭代器
迭代器为类序列对象提供了一个类序列的接口。
8.11.2 为什么要用迭代器
- 提供了可扩展的迭代器接口
- 对列表迭代中性能的提升
- 在字典迭代中性能提升
- 创建真正的迭代接口,而不是原来的随机对象访问
- 与所有已经存在的用户自定义的类以及扩展的模拟序列和映射的对象向后兼容
- 迭代非序列集合时,可以创建更简洁可读的代码
8.11.3 使用迭代器
1.序列
>>> myTuple=(123,'xyz',45.67)
>>> i=iter(myTuple)
>>> i.next()
123
>>> i.next()
'xyz'
>>> i.next()
45.67
>>> i.next()
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
i.next()
StopIteration
2.字典
字典的迭代器会遍历它的键(key)
>>> for eachz in z:
print 'name:%s\tOccupation:%s' %eachz
name:Poe Occupation:author
3.文件
文件对象生成的迭代器会自动调用readline()方法。
>>> myFile=open('H:\R language\R语言实战源代码\第3章源代码.txt')
>>> for eachLine in myFile:
print eachLine,
第三章源代码
> attach(mtcars)
> plot(wt,mpg)
> abline(lm(mpg~wt))
> title("Regression of MPG on Weight")
> detach(mtcars)
>>> myFile.close()
8.11.5 如何创建一个迭代器
对一个对象调用iter()就可以得到迭代器,语法
iter(obj)
iter(func,sentinel)
8.12 列表解析
列表解析来自函数式编程语言Haskell。
列表解析的语法:
[expr for iter_var in iterable]
语句的核心是for循环,迭代 iterable的对象所有条目
>>> map(lambda x:x**2,range(6))
[0, 1, 4, 9, 16, 25]
我们用列表解析来替换:
>>> [x**2 for x in range(6)]
[0, 1, 4, 9, 16, 25]
在新的语句中,只有一次函数调用。之前的语句由三次函数调用(range()、map()、和lambda())
用括号包住表达式,像[(x**2) for x in range(6)]
列表解析的表达式取代内建的map()函数以及lambda。
结合if语句,我们给出列表解析的一个扩展版本语句:
[expr for iter_var in iterable if cond_expr]
odd()函数,用于判断一个数值对象是奇数还是偶数(奇数返回1,偶数返回0)
def odd(n):
return n%2
可以借用这个函数的核心操作,使用filter()和lambda挑选的序列中的奇数:
>>> seq=[11,10,9,9,10,10,9,8,23,9,7,18,12,11,12]
>>> filter(lambda x:x%2,seq)
[11, 9, 9, 9, 23, 9, 7, 11]
再次使用列表解析,获得想要的数字:
>>> [x for x in seq if x % 2]
[11, 9, 9, 9, 23, 9, 7, 11]
我们还有更多的实例:
1。矩阵样例
我们来迭代一个3行5列的矩阵
>>> [(x+1,y+1) for x in range(3) for y in range(5)]
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
2。磁盘文件样例
我们需要计算所以非空白字符的数目:
我们可以把每行分割(split)为单词,这样计算单词的个数:
>>> f=open('D:/hhga.txt','r')
>>> len ([word for line in f for word in line.split()])
223
快速计算文件的大小
>>> import os
>>> os.stat('D:/hhga.txt').st_size
1475L
把每个单词的长度加起来,得到和
>>> f.seek(0)
>>> sum([len(word) for line in f for word in line.split()])
1253
8.13 生成器表达式
生成器表达式是列表解析的一个扩展。
生成器是特定的函数,允许你返回一个值,然后“暂停”代码的执行,稍后回复。
生成器表达式使用了“延迟计算”,所以在它使用内存上更有效。
生成器语法:
(expr for iter_var in iterable if cond_expr)
1.磁盘文件样例
生成器会计算每个单词的长度然后传递给sum()函数。
>>> data=open('D:/hhga.txt','r')
>>> sum(len(word) for line in data for word in line.split())
1253
2.交叉配对样例
生成器表达式就好像是懒惰的列表解析。
>>> rows=[1,2,3,17]
>>> def cols():
... yield 56
... yield 2
... yield 1
...
>>>
>>> x_product_pairs=((i,j) for i in rows for j in cols())
>>> for pair in x_product_pairs:
... print pair
...
(1, 56)
(1, 2)
(1, 1)
(2, 56)
(2, 2)
(2, 1)
(3, 56)
(3, 2)
(3, 1)
(17, 56)
(17, 2)
(17, 1)
声明:
以上学习笔记来自
《python核心编程》第2版 Wesley J.Chun 编著 宋吉广译 人民邮电出版社
发表评论