赋值语句用赋值运算符=来实现。赋值语句有一些特殊的使用技巧。
多个赋值操作可以同时进行。也可以交换两个或者多个变量。事实上,这里所做的事情叫做序列解包或者叫递归解包——将多个值的序列揭开,然后放到变量的序列中。popitem方法将键-值作为元组放回。
>>> scoundrel={'name':'Robin','girlfriend':'Marioon'} >>> key,value=scoundrel.popitem() >>> key 'name' >>> value 'Robin'Python还可以链式赋值。也可以进行增量赋值。
语句块并不是一种语法。语句块适当条件为真时执行或执行多次的一组语句。在代码前放置空格来缩进语句即可创建语句块。块中的每行都要缩进形同的量。在Python中,冒号用来表示语句块的开始,块中的每个语句都是缩进的(缩进的量相同)。当回退到和已经闭合的块一样的缩进量时,就表示当前块已经结束。
下面的值在作为布尔表达式的时候,会被编译器看作是假(false):
False、None、0、""、()、[]、{}
除去上面的表达式之外的其他表达式在作为布尔表达式的时候都为真。bool函数可以用来转换其他值为布尔值。
一个例子if-else
name=raw_input('What is your name ?') if name.endswith('Gumy'): print('Hello,Mr.Gumy!') else: print('Hello,stranger!')语句elif
elif是else-if的缩写。如下例:
num=raw_input('Enter a number:') if num>0: print('This is a positive number.') elif num==0: print('This number is zero.') else: print('This is a negative numeber.')嵌套
name=raw_input('what is your name?') if name.endswith('Gumy'): if name.startswith('Mr.'): print('Hello,Mr.Gumy') elif name.startwith('Mrs.'): print('Hello,Mrs.GGumy') else: print('Hello,Gumy') else: print('Hello,stranger')分析:==和is是两个不同的运算,==用来判断两个表达式的值是否相等,而is用来判断两个表达式是否是同一个对象(相同的内存)。如下例:
>>> x=[1,2,3] >>> y=[2,1] >>> x==y False >>> del x[2] >>> y.reverse() >>> x==y True >>> x is y False字符串和序列也可以比较,他们是按照字母顺序排列进行比较(一个字母的顺序值可以用ord函数查到,ord函数和chr函数的功能相反)。如:
>>> 'alpha'<'beta' True其他的序列也可以用同样的方式比较,不过比较的不是字符而是其他类型的元素。如果一个序列中包含其他序列元素,比较规则也同样适用于序列元素。
>>> [1,2]<[2,1] True >>> [1,2]>[1,3] False >>> [1,[2,[3,4]]]>[2,1] False布尔运算符
所有的返回值都可以看作是布尔值,所有表达式也都返回布尔值。and运算符就是所谓的布尔运算符。它连接两个布尔值,并且只有当两个布尔值都为真时,表达式才为真。另外两个布尔运算符是or和not。or表示或者,当两边值都为假是才为假。not表示非,表示取与运算表达式真值相反的值。
布尔运算符有一个有趣的特性:只有在需要求值是才进行求值。
x or y当x为真时返回x的值,否则返回y的值。
x and y当x为假时返回x的值,否则返回y的值。
上面这种运算方式被称为逻辑短路(short-circuit logic)或惰性求值(lazy evaluation)。
一个重要的表达
a if b else c如果b为真,就返回a,否则返回c.
while语句非常灵活,它可以用来在任何条件为真的情况下反复执行一个代码块。
sum=0 x=1 while x<=100: sum=sum+x x+=1 print(sum)有时候要求按照一定次数迭代,这个时候要用for来实现。(当然,利用while也是可以做到的。)如果能用for循环,就尽量不用while循环,这是因为for循环的语法更简洁。
words=['this','is','an','ex','parrot'] for word in words: print(word) for number in range(1,101): print(number) d={'x':1,'y':2,'z':3} for key in d: print(key,'corresponds to',d[key])字典中项的顺序是不确定的,在字典循环的时候,可以保证所有的项都可以被循环,但是循环的顺序确实不确定的。上面的例子就说明了这点。
python中有很多很好的用于序列迭代的函数,这些函数位于itertool模块中。
并行迭代
程序可以同时迭代两个序列。这可以通过程序来实现,也可以直接利用zip函数来实现。如下:
names=['anne','betah','aymi','cocoa'] ages=[12,23,34,45] aaa=zip(names,ages) for name,age in aaa: print(name,'is',age,'Years sld')按索引迭代
enumerate函数可以在提供索引的地方迭代索引-值对。
for index,string in enumerate(strings): if 'XXX' in string: strings[index]='[censored]'翻转和排序迭代
reversed和sorted函数作用在任何序列或可迭代对象上,不是原地的修改对象,而是返回翻转或排序后的版本。
>>> sorted([4,3,6,8,9]) [3, 4, 6, 8, 9] >>> sorted('Hello,world!') ['!', ',', 'H', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r', 'w'] >>> list(reversed('Hello,world!')) ['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'H'] >>> ''.join(reversed('Hello,world!')) '!dlrow,olleH'一般来说,循环会一直执行到条件为假,或者序列元素用完时。但是有时候可能会需要中断一个循环,进行新的迭代,这个时候就需要跳出循环。
break用来跳出循环,执行循环后面的语句。
from math import sqrt for n in range(99,0,-1): root=sqrt(n) if root==int(root): print(n) breakcontinue用来结束当前迭代,进行下一步迭代。他的意思是:跳出剩余的循环体,但是不结束循环。
for x in seq: if not(condition1 or condition2 or condition3): do_something() do_something_else() do_another_thing() etc()xxxxxxxxxxwhile true部分实现了一个永远不会停止的循环,但是在内部if语句的条件成立的时候会停止。
for、while循环中都可以使用continue、if、else、break语句。
列表推倒式是利用其他列表创建新列表的一种方式。它的工作原理类似与for循环。
>>> [x*x for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> [x*x for x in range(10) if x%3==0] [0, 9, 36, 81] >>> [(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)] >>> girls=['alice','berce','bob'] >>> boys=['chrits','arnold','clarice'] >>> [b+'+'+g for b in boys for g in girls if b[0]==g[0]] ['arnold+alice']