Python基础编程(五)条件、循环和其他语句
5.2 赋值魔法
就算是不起眼的赋值语句也有一些特殊的技巧。
5.2.1 序列解包
多个赋值操作可以同时进行:
>>>x,y,z = 1,2,3 >>>print x,y,z 1 2 3用它交换两个(或更多个)变量也是没有问题的:
>>>x,y = y,x >>>print x,y,z 2 1 3这叫做序列解包或可选代解包——将多个值的序列解开,然后放到变量的序列中。
>>>values = 1,2,3 >>>values (1,2,3) >>>x,y,z = values >>>x 1当函数或者方法返回元组(或者其他序列或可迭代对象)时,这个特性尤其有用。假设需要获取(和删除)字典中任意的键-值对,可以使用popitem方法,这个方法将键-值作为元组返回。
>>>scoundrel = {'name':'Robin','girlfriend':'Marion'} >>>key.value = scoundrel.popitem() >>>key 'girlfriend' >>>value 'Marion'
它会允许函数返回一个以上的值并且打包成元组,然后通过一个赋值语句很容易进行访问。所解包的序列中的元素数量必须和放置在赋值符号=左边的变量数量完全一致,否则Python会在赋值是引发异常。
5.2.2 链式赋值
链式赋值是将同一个值赋给多个变量的捷径。
x = y = somefunction()
5.3 语句块:缩排的乐趣
语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句。在代码前放置空格来缩进语句即可创建语句块。
块的每行都应该缩进同样的量。在Python中,冒号(:)用来标识语句块的开始,块中的每一个语句都是缩进的(缩进量相同)。当退回到和已经闭合的块一样的缩进量时,就表示当前块已经结束了。
5.4 条件和条件语句
下面的值在作为布尔表达式的时候,会被解释器看作假(false):
False None 0 “” () [] {}也就是标准值False和None、所有类型的数字0(包括浮点型、长整型和其他类型)、空序列(比如空字符串、元组和列表)以及空的字典都为假。其他的一切都被解释为真,包括特殊值True。
布尔值True和False属于布尔类型,bool函数可以用来转化其他值:
另一种方法是使用内建的enumerate函数:
>>>bool(42) True >>>bool("") False
5.4.2 条件执行和if语句
5.4.3 else语句
5.4.4 elif语句
如果需要检查多个条件,就可以使用elif,它是“else if”的简写,也是if和else字句的联合使用——也就是具有条件的else字句。
5.4.5 嵌套代码块
5.4.6 更复杂的条件
1. 比较运算符
x == y x等于y x < y x小于y x > y x大于y x <= y x小于等于y x >= y x大于等于y x != y x不等于y x is y x和y是同一个对象 x is not y x和y是不同的对象 x in y x是y容器(例如,序列)的成员 x not in y x不是y容器(例如,序列)的成员
3. is:同一性运算符
>>> x = y = [1,2,3] >>> z = [1,2,3] >>> x == y True >>> x== z True >>> x is y True >>> x is z Falseis运算符是判定同一性而不是相等性的。变量x和y都被绑定到同一个列表上,而变量z被绑定在里另外一个具有相同数值和顺序的列表上。它们的值可能相等,但是却不是同一个对象。
5. 字符串和序列比较
5.4.7 断言
如果需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert语句就有用了,它可以在程序中置入检查点。条件后可以添加字符串,来解释断言:
>>> age = -1 >>> assert 0< age <100.'The age must be realistic' Traceback (most recent call last): File "<stdin>".line 1. in ? AssertionError: The age must be realistic
5. 循环
5.5.1 while循环
x = 1 while x <= 100: print x x += 1
5.5.2 for循环
words = ['this','is','an','ex','parrot'] for word in words print word
numbers = [0,1,2,3,4,5,6,7,8,9] for number in numbers: print numberRange函数的工作方式类似于分片。它包含下限,但不包含上限,默认下限为0。
>>>range(0,10) [1,2,3,4,5,6,7,8,9] >>>range(10) [1,2,3,4,5,6,7,8,9]
for number in range(1,101) print number
5.5.3 循环遍历字典元素
d = {'x':1,'y':2,'z':3} for key,value in d.items(): print key,'correponds',value
5.5.4 一些迭代代工具
1. 并行迭代
names = ['anne','beth','george','damon'] ages = [12,45,32,102] for i in range(len(names)): print names[i],'is',ages[i],'year old'内建的zip函数可以用来进行并行迭代,可以把两个序列“压缩“在一起,然后返回一个元祖的列表:
zip(names,ages) [('anne',12),('beth',45),('george',32),('damon',102)] for name,age in zip(names,ages): print name,'is',age,'year old'zip函数也可以作用于任意多的序列。而且zip可以应付不等长的序列:当最短的序列”用完“的时候就会停止。
2. 编号迭代
有时候想要迭代序列中的对象,同时还要获取当前对象的索引。
index = 0 for string in strings: if 'xxx' in string: strings[index] = '[censored]' index += 1
for index,string in enumerate(strings): if 'xxx' in string: strings[index] = '[censored]'这个函数可以在提供索引的地方迭代索引-值对。
3. 翻转和序列迭代
reversed和sorted:它们同列表的reverse和sort方法类似,但作用于任何可迭代对象上,不是原地修改对象,而是返回反转或排序后的版本。
5.5.5 跳出循环
1. break
2. continue
3. while True/break语句
Python中的whlie和for循环非常灵活,但一旦使用while语句就会遇到一个需要更多功能的问题。如果需要当用户在提示符下输入单词是做一些事情,并且在用户不输入单词后结束循环。可以使用下面的方法:
while True: word = raw_input('Please enter a word: ') if not word: break print 'The word was ' + word
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!"再循环中增加一个else子句——它仅在没有调用break时执行。
5.7 三人行
pass、del和exec。
5.7.1 什么都没发生
有的时候,程序什么事情都不用做。pass语句:
它可以在代码中作占位符使用。比如程序需要啊一个if语句,然后进行测试,但是缺少其中一个语句块的代码。代码不会执行,因为Python中空代码块是非法的。解决发发就是在语句块中加上一个pass语句:
if name == 'Ralph Auldus Melish': print 'Welcome!' elif name == 'Enid': #还没完…… pass elif name == 'Bill Gates': print 'Access Denied'
5.7.2 使用del删除
使用del语句,它不仅会一出一个对象的引用,也会移除那个名字本身。、
5.7.3 使用exec和eval执行和求值字符串
1. exec
>>> exec "print 'Hello,word!'" Hello,word!
exec与剧中最有用的地方在于可以动态地创建代码字符串。
实在没看懂 = =
2. eval
eval(用于”求值“)是类似于exec的内建函数。exec语句会执行一系列Python语句,而eval会计算Python表达式(以字符串形式书写),并且返回结果值,(exec语句并不返回任何对象,因为它本身就是语句)。