4、Python-条件、循环
1、扩展print和import
1.1 使用逗号输出
在打印多个表达式时,可以用逗号隔开;
print "a", "b"
如果在打印语句的结尾加上逗号,接下来的打印语句会和前一条打印语句在同一行输出;
print 'a',
pring 'b'
1.2 模块的导入
导入某个模块 import somemodule
导入模块中的某个函数 from somemodule import somefunction
导入模块中的所有函数 from somemodule import *
2、赋值
2.1 序列解包
序列解包(sequence unpacking)又叫做可迭代解包:将多个值的序列解开,然后放到变量的序列中。
x = [1,2,3]
a,b,c = x
2.2 链式赋值
链式赋值(chained assignment)是将同一个值赋给多个变量的捷径。
x = y = 'abc'
2.3 增量赋值
x += value相当于x = x + value,对于-、*、/、%都适用。
3、 语句块,缩排
语句块:它是在条件为真时执行或执行多次的一组语句。通过在代码前放置空格来缩进语句,从而创建语句块。
4、条件语句
4.1 下面的值在作为布尔表达式的时候会被解释器看作是False
False、None、0、""、()、[]、{}
4.2 if语句
if():
elif():
if(): #嵌套语句
else:
else:
4.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被绑定到另一个具有相同数值的列表上。它们的值相等,但却不似同一个对象。
所以,使用"=="运算符来判定两个对象是否相等,使用is判定两者是否等同(同一个对象)。
4.4 布尔运算符
and、or、not
4.5 断言 assert
断言和if语句在语义上有些相近,使用它的目的是与其让程序在晚些时候崩溃,不如在错误的条件下直接崩溃。一般用在检查函数的属性,或者做为初期测试和调试过程中的辅助条件。
assert语句用来在程序中置入检查点,条件后可以添加字符串来解释断言。
age = -1
assert 0 < age <100, 'The age must be realistic'
上面语句会报错。
5、循环
5.1 while循环
5.2 for循环
注意:xrange和range函数功能类似,区别在于range函数一次创建整个循环序列,而xrange一次只创建一个数。当需要迭代一个巨大的序列时xrange会更高效。它们的默认下限都是从零开始。
5.3 循环遍历字典元素
d = {}
d.keys d.values d.items,用来获取键列表,值列表,键值对元组列表。
5.4 一些迭代工具
5.4.1 并行迭代
内建的zip函数可以用来进行并行迭代,可以把两个序列“压缩”为一个元组列表。
names = ['wang','li']
ages = [12,13]
zip(names,ages) [('wang',12),('li',13)]
5.4.2 编号迭代
在迭代序列中对象的时候,获取对象在序列中的一个索引。
内建的enumerate函数
for index, string in enumerate(strings):
if 'xxx' in string:
string[index] = '[censored]'
5.4.3 翻转和排序迭代
reversed和sorted:他们同列表的reverse和sort方法类似,当作用与序列或可迭代对象上是,返回翻转或排序后的版本,而不是原地地进行修改。
6、列表推导式-轻量级循环
列表推导是(list comprehension)是利用其它列表创建新列表的一种方式,工作方式类似于嵌套for循环。
>>>[x*x for x in rang(10)]
[0,1,4,9,16,25,36,49,64,81]
>>>[x*x for x in rang(10) if x%3==0]
[0,9,36,81]
>>>[(x,y) for x in rang(3) for y in rang(3)]
[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
7、pass、del、exec和eval
pass语句什么都不做,可以作为占位符使用。
del语句用来删除变量,或者数据结构的一部分,但不能用来删除值。
1 >>> x = 3 2 >>> y=x 3 >>> del x 4 >>> x 5 6 Traceback (most recent call last): 7 File "<pyshell#3>", line 1, in <module> 8 x 9 NameError: name 'x' is not defined 10 >>> y 11 3 12 >>> x = [0,1,2,3,4,5] 13 >>> del x[1] 14 >>> x 15 [0, 2, 3, 4, 5] 16 >>> y = x 17 >>> y 18 [0, 2, 3, 4, 5] 19 >>> del x[0] 20 >>> x 21 [2, 3, 4, 5] 22 >>> y 23 [2, 3, 4, 5] 24 >>> del x 25 >>> y 26 [2, 3, 4, 5] 27 >>> x 28 29 Traceback (most recent call last): 30 File "<pyshell#15>", line 1, in <module> 31 x 32 NameError: name 'x' is not defined 33 >>>
x和y都指向同一个列表或对象。但是删除x并不影响y。原因就是删除的只是名称,而不是列表本身(值)。事实上,Python中没有办法直接删除值。(如果某个值不在使用的时候,Python解释器会负责自动的内存回收)
execl可以动态地创造Python代码,然后将其作为语句执行。
exec "print 'test'"
但有些时候提供的变量值与模块中的函数名冲突,所以,为了安全起见,可以增加一个字典,起到命名空间的作用。
注意:命名空间的概念称为作用域(scope),是非常重要的知识。可以把它当做保存变量的地方。所以在程序执行x=1这类赋值语句时,可以将键x和值1放在当前的命名空间内,命名空间一般来说都是全局的命名空间。
通过增加in <scope>来实现,<scope>就起到放置代码字符串命名空间作用的字典。
>>>from math import sqrt
>>>scope = {}
>>>exec 'sqrt = 1' in scope
>>>sqrt(4)
2.0
>>>scope['sqrt']
1
eval可以动态地创造Python代码,然后将其作为表达式执行。
eval会计算Python表达式(以字符串形式书写),并且返回结果值,而exec语句并不返回任何对象,因为它本身就是语句。
eval创建一个Python计算机:
>>> eval(raw_input("Enter an arithmetic expression:"))
Enter an arithmetic expression:1+1*2
3
给exec或eval语句提供命名空间时,可以在真正使用命名空间前放置一些值进去:
>>>scope = {}
>>>scope['x'] = 2
>>>scope['y'] = 3
>>>eval('x*y', scope)
6
>>>exec 'x = 4 in scope
>>>eval('x*x', scope)
16