1.print和import的更多信息
(1)使用逗号输出
前面我们已经接触过python的print来打印表达式,不管是字符还是其他类型,在打印前都将自动转换为字符串。但事实上使用多个表达式也是可以的,只要将它们用逗号隔开就好:
>>> print 'Age:',42
Age: 42
注意:print参数并不能像我们预计的那样构成元组:
>>> 1,2,3
(1, 2, 3)
>>> print 1,2,3
1 2 3
>>> print (1,2,3)
(1, 2, 3)
(2)把某件事作为另一件事导入
从模块导入函数时通常使用:
import module
或者
from module import function
或者
from module import somefunction,anotherfunction,yetaotherfunction
或者
from module import *
只有确定自己想要从给定的模块导入所有功能时候,才应该使用最后一个版本。但是如果两个模块都有open函数怎么办,只需要使用第一种方式导入,然后像这样使用函数:
module1.open(...)
module2.open(...)
但还有另外的选择:可以在语句末尾增加一个as子句,这个子句后给出想要使用的别名,例如为整个模块提供别名:
>>> import math as footbar
>>> footbar.sqrt(4)
2.0
或者为函数提供别名:
>>> from math import sqrt as footbar
>>> footbar(9)
3.0
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
事实上,我们这里所做的事情叫做序列解包(sequence unpacking)或者递归解包——将多个值得序列解开,然后放到变量的序列中。更形象一点就是:
>>> values=1,2,3
>>> values
(1, 2, 3)
>>> x,y,z=values
>>> x
1
当函数或者方法返回元组(或者其他序列或课迭代对象)时,这个特性尤其有作用。假设需要获取(和删除)字典中的任意一对键值,可以使用popitem方法,并且返回一对元组,那么这对元组可以直接赋值到两个变量中:
>>> a={'name':'a','num':'123'}
>>> key,value=a.popitem()
>>> key
'num'
>>> value
'123'
注意:所解包的序列中的元素数量必须和放置在赋值符号=左边的变量数量完全一致,否则python会在赋值时引发异常。
(2)链式赋值
链式赋值是将同一个值赋给多个变量的捷径。他看起来有些像上节中的并行赋值,不过这里只是处理一个值:
x=y=somefunction() <==> x=somefunction
但是注意上面的语句和下面的语句是不一样的:
x=somefunction()
y=somefunction()
(3)增量赋值
这里没有将表达式写成x=x+1,而是将表达式运算符放置在赋值运算符=的左边,写成x+=1.这种写法叫做增量赋值,对于所有标准运算符都使用:
>>> x=2
>>> x+=1
>>> x*=2
>>> x
6
对于其他数据类型也使用(前提是二元运算符本身使用于这些数据类型即可):
>>> a='a'
>>> a+='b'
>>> a*=2
>>> a
'abab'
3.条件语句
(1)布尔变量的作用
下面的值作为布尔表达式的时候,会被解释器看做假(false):
false None 0 "" () {} []
其他的一切值都被解释为真,包括特殊值True。
(2)条件执行和if语句
我们先来看一个脚本:
name=raw_input('What is your name?')
if name.find('a') != -1:
print 'Hello,a'
这就是if语句,它可以实现条件执行,即如果条件(在if和冒号之间的表达式)判断结果为真,则会执行后面的语句块,如果为假则不会执行。
(3)else子句
else只能作为if的子句,如果if中的语句块没有执行,则执行else中的语句块:
name=raw_input('What is your name?')
if name.find('a') != -1:
print 'Hello,a'
else:
print 'Sorry'
(4)elif子句
如果要检查多个条件可以使用elif语句,是else if的缩写:
num=input('Enter a number')
if num>0:
print 1
elif num<0
print -1
else
print 0
(5)嵌套代码块
if语句里面可以嵌套if语句。
4.更复杂的条件
上面我们说了条件语句,下面让我们回到条件,因为它才是条件语句的执行时最有趣的部分:
(1)比较运算符
在条件中最基本的就是比较运算符,>、<、>=、<=、!=
(2)is:同一运算符
这个运算符看起来和==一样,实际上不相同,is判断的是同一性而不是相等性:
>>> x=y=[1,2,3]
>>> z=[1,2,3]
>>> x==y
True
>>> x==z
True
>>> x is y
True
>>> x is z
False
(3)布尔运算符
布尔运算符有and,or,not。当and链接两者都为真时候返回真,否则都为假。
(4)assert断言
assert语句可以作为初期测试和调试工具的辅助条件,它可以在条件后添加字符串,用来解释断言:
>>> age=-1
>>> assert 0<age<100,'The age must be realistic'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: The age must be realistic
5.循环
(1)while循环
如果我们需要打印1到100怎么办呢?当然不能一个一个的打印,在python里面我们可以这样做:
x=1
while x<=100:
print x
x+=1
Python会一直执行while下的语句块,知道while后的表达式不成立为止。
(2)for循环
for循环为一个集合(序列或者其他可迭代对象)的每个元素执行一次序列块。
words=['a','b','c']
for word in words:
print word
因为迭代某范围的数字是很常见的,所以有个内建的范围函数提供使用:
>>> range(1,5)
[1, 2, 3, 4]
range函数的工作方式和分片很像,它包含下限,不包含上限,如果希望下限为0可以只提供上限。
xrang函数的循环行为类似与range函数,区别 在于range函数一次性创建整个序列,而xrange一次性只创建一个数。
(3)循环遍历字典元素
一个for语句就可以遍历整个字典的所有键:
d={'x':'1','y':'2','z':'3'}
for key in d:
print key,'and',d[key]
d.items()方法会将键-值作为元组返回,for循环的一个好处就是可以循环中使用序列解包:
d={'x':'1','y':'2','z':'3'}
for key,value in d.items():
print key,'and',value
(4)一些迭代工具
并行迭代
程序可以同时迭代两个序列,比如有两个下面的列表需要打印相对的名字和年龄,可以像下面这样做:
names=['a','b','c','d']
ages=[12,13,14,15]
for i in range(len(names)):
print names[i],'is',ages[i],'years old'
而内建的zip函数就可以用来经行并行迭代,把两个序列“压缩”在一起,然后返回一个元组的列表,这样就可以循环中解包元组:
>>> a=[1,2,3]
>>> b=['a','b','c']
>>> zip(a,b)
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> for num,name in zip(a,b):print num,'is',name
zip函数可以用于任意多的 序列,知道最短的序列“用完”的时候就会停止:
>>> zip(range(5),range(1000))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
按索引迭代
有些时候我们需要访问更多迭代中的对象,例如:在一个字符串中替换所有的'xxx'。实现方法很多,比如我们可以这样做:
for string in strings"
if 'xxx' in string:
index=strings.index(string)
string[index]='consider'
这样的方法比较笨,不过可以接受,另外一种方法是使用内建的enumerate函数,这个函数可以在提供索引的地方迭代索引-值对。
(5)跳出循环
我们可以是用break和continue语句实现跳出循环,其中,break语句会跳出整个循环,continue语句只会跳出当前循环,直接经行下一次循环,不会完全跳出循环体。
6.列表推导式——轻量级循环
列表推导式是利用其它列表创建新的列表,工作方法类似与for循环,也很简单:
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
在里面可以使用更多的if或者for语句:
>>> [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)]
7.PASS和DEL
下面,我们来看下另外三个语句:pass,del和exec
(1)pass
有时候我们需要程序什么都不用做,例如:
if a>0:
print 'a>0'
elif a==0:
#什么也不做
elif a<0:
print 'a<0'
这样代码是不会执行的,因为python中的空白代码块是非法的,pass语句就用来解决这种问题,只需要在代码块中加上pass语句就可以解决了。
(2)del
del语句会删除一个对象的名称,而不会删除这个对象。例如:
>>> a=[1,2,3]
>>> b=a
>>> del a
>>> b
[1, 2, 3]
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not define