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函数可以用来转化其他值:
>>>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
False
is运算符是判定同一性而不是相等性的。变量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 number
Range函数的工作方式类似于分片。它包含下限,但不包含上限,默认下限为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
另一种方法是使用内建的enumerate函数:
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语句并不返回任何对象,因为它本身就是语句)。

























 

posted @ 2014-05-15 13:31  Mave  阅读(213)  评论(0编辑  收藏  举报