前面已经介绍过几种基本语句printimport赋值语句下面我们来介绍条件语句循环语句。
一. print和import的更多信息
1.1 使用逗号输出
A.打印多个表达式用逗号隔开会在每个参数之间插入一个空格符
>>> print age:,42
age: 42
B.同时输出文本和变量值却又不希望使用字符串格式化
>>> name Peter
>>> greeting Hello
>>> print greeting,,,name
Hello , Peter
上面的例子中会在逗号前加入一个空格我们可以这样优化
>>> print greeting ,,name
Hello, Peter
注意如果在结尾处加上逗号那么接下来的语句会与前一句在同一行打印
>>> print Hello,,
print world
Hello,world
1.2 把某件事作为另一件事导入
从模块导入函数时可以使用
整个模块导入import somemodule
导入其中一个函数from somemodule import somefunction
导入其中几个函数from somemodule import somefunction,anotherfunction,yetanotherfunction
导入全部函数from somemodule import *
如果某2个模块都有相同名字的函数比如叫open函数那么可以这样给函数或者模块提供别名
>>> import math
>>> import math as foobar
>>> foobar.sqrt(4)
2.0
>>> from math import sqrt as foobar2
>>> foobar2(4)
2.0
二. 赋值魔法
就算是不起眼的赋值语句也有一些特殊的技巧。
2.1 序列解包
序列解包就是将多个值的序列解开然后放到变量的序列中。
>>> #多个赋值操作同时进行
>>> x,y,z 1,2,3
>>> print x,y,z
1 2 3
>>> #交换2个或多个变量
>>> x,y y,x
>>> print x,y
2 1
>>> #当函数或方法返回元组时
>>> s {a:1,b:2,c:3}
>>> key,value s.popitem()
>>> print key,value
a 1
最后一个例子可以看出它允许函数返回一个以上的值并打包成元组然后通过一个复制语句很容易进行访问。
注意解包的序列中元素数量必须和放置在赋值符合左边的变量数量完全一致否则会引发异常。
2.2 链式赋值
链式赋值是将同一个值赋给多个变量的捷径。
>>> x y sss
2.3 增量赋值
增量赋值可以让代码更紧凑简练。
对于-*/%等标准运算符都适用
>>> x 2
>>> x 1
>>> x * 2
>>> x
6
>>> #对其他数据类型也适用
>>> f foo
>>> f bar
>>> f
foobar
三. 语句块缩排的乐趣
语句块是条件为真时执行一次或多次的一组语句。在python中冒号:用来标识语句块的开始块中的每一个语句都是缩进的。当回退到和已经闭合的块一样的缩进量时就表示当前块已经结束了。
四. 条件和条件语句
4.1 这就是布尔变量的作用
下面的值在作为布尔表达式的时候会被解释器看作假False
False None 0 “” () [] {}
其他的一切值都被解释为真包括特殊值True。
4.2 条件执行和if语句
如果条件判断为真那么后面的语句块就会被执行也可以加入elif进行多个条件检查。作为if的一部分还有else子句。
当然我们可以在if语句里面嵌套使用if语句。
num input (enter a number? )
if num > 0:
if num > 50:
print"num > 50"
elif num > 10:
print "num > 10"
else:
print "num > 0"
else:
print "num < 0"
4.3 更复杂的条件
下面我们回到条件本身因为它们才是条件执行真正有趣的部分。
4.3.1. 比较运算符
x y; x y; x > y; x < y;
x ! y; x is y; x is not y; x in y; x not in y;
4.3.2. is同一性运算符
>>> x y [1,2,3]
>>> z [1,2,3]
>>> x is y
True
>>> x is z
False
>>> x z
True
由此看出使用运算符来判定两个对象是否相等使用is判定两者是否同一个对象。
4.3.3. in成员资格运算符
name raw_input("what is your name?")
if s in name:
print your name contains the letter s
else:
print your name does not contain the letter s
4.3.4.字符串和序列比较
字符串可以按照字符顺序排列进行比较。
>>> alpha True 字符是按照本身的顺序值排列的一个字母的顺序值可以用ord函数查到。 其他的序列也可以用同样的方式进行比较不过比较的是元素的其他类型。 >>> [1,2] > [2,1] False >>> [1,[2,3]] <[1,[3,2]] True 4.3.5. 布尔运算符 and运算符是所谓的布尔运算符它连接2个布尔值并且在两者都为真时返回真否则返回假。与它同类的还有2个运算符or和not。 number raw_input("enter a number?") if number 1: print "great!" 4.3.6. 断言 if语句有个近亲工作方式类似于 if not condition: crash program 这是因为与其让程序在晚些时候崩溃不如在错误条件出现时直接让它崩溃。语句中使用的关键字是assert。它确保程序中的某个条件为真时才能让程序正常工作。 >>> age -1 >>> assert 0 Traceback (most recent call last): File "", line 1, in assert 0 AssertionError 五. 循环 5.1 while循环 while语句非常灵活可以在任何条件为真的情况下重复执行一个代码块。 name while not name: name raw_input(please enter your name: ) print hello,%s! % name 5.2 for循环 当要为一个集合序列和其他可迭代对象的每个元素都执行一个代码块时我们就需要for循环了。 5.2.1.循环遍历字典元素 一个简单的for语句就能循环字典的所有键就像处理序列一样 d {x:1,y:2,z:3} for key in d: print key,corrensponds to ,d[key] 5.2.2.一些迭代工具 A.并行迭代 names [a,b,c,d] ages [12,23,45,32] #循环索引迭代 for i in range(len(names)): print names[i],is,ages[i],years old. #内建zip函数迭代 for name,age in zip(names,ages): print name,is,age,years old. B.编号迭代 有时候迭代序列中的对象时同时要获取当前对象的索引。 #index计数 index 0 for string in strings: if xxx in string: string[index] sss index 1 #内建enumerate函数迭代 for index,string in strings: if xxx in string: string[index] sss C.翻转和排序迭代 函数reversed和sorted作用于任何序列或可迭代对象上不是原地修改对象而是返回翻转或排序后的版本 >>> sorted([2,6,3,7]) [2, 3, 6, 7] >>> list(reversed(hello)) [o, l, l, e, h] 5.3 跳出循环 一般情况下循环会一直执行到条件为假或者到序列元素用完时。但是有时候需要提前中断一个循环。 5.3.1.break 结束循环可以使用break语句。 for i in range(0,10): if i 5: print quit break print i 5.3.2.continue continue语句会让当前迭代结束跳到下一轮循环的开始。 for i in range(0,10): if i % 2 0: continue print i 5.3.3.while True/break 比如当用户在提示符下输入单词时做一些事情并在用户不输入单词后结束循环。 while True: word raw_input(enter a word: ) if not word: break print The word is word 六. 列表推导式--轻量级循环 列表推导式是利用其他列表创建新列表的一种方法工作方式类似于for循环 >>> [x**2 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) 七. 三人行 作为最后的结束我们来看3个语句passdel和exec pass什么都不做用来在代码中做占位符使用方便调试代码。 if a a: print yes elif a b: pass else: print no del删除不再使用的对象也就是用作垃圾收集。 >>> x [1,2] >>> y x >>> del x >>> x Traceback (most recent call last): File "", line 1, in x NameError: name x is not defined >>> y [1, 2] del删除的只是名称而不是列表本身所以上面的例子中删除x不会影响到y。 exec动态创造python代码然后将其作为语句执行或作为表达式计算。但是这样做是会有很严重的潜在安全漏洞如果程序将用户提供的一段内容中的一部分字符串作为代码执行程序可能会失去对代码执行的控制。 >>> exec "print hello,world" hello,world