title: 条件和循环语句 create: 2016.12.7 modified: 2016.12.7 tags: python 语句 列表推导式
3
[TOC]
前面已经介绍过了几个基本语句(print语句、import语句、赋值语句)。接下来你会看到列表推导式(list comprehension)如何扮演循环和条件语句的角色。最后介绍pass、del和exec语句的用法。
In [2]:
bool('ok')
Out[2]:
In [3]:
bool(8)
Out[3]:
In [4]:
bool('')
Out[4]:
In [7]:
num=input('Enter a number:')
if num>0:
print 'positive'
elif num<0:
print 'negative'
else:
print 'zero'
2. 布尔运算符
and, or, not就是所谓的布尔运算符。
In [8]:
x=1
while x<=3:
print x
x+=1
In [9]:
nums=[1,2,3]
for n in nums:
print n
因为迭代(循环的另外一种说法)某范围的数字是很常见的,所以有个内建的范围函数供使用:
In [10]:
range(0,10)
Out[10]:
range函数的工作方式类似于分片。它包含下限,但不包含上限。如果希望下限为0,可以只提供上限:
In [11]:
range(10)
Out[11]:
In [18]:
range(10,0,-2) #-2表示步长
Out[18]:
In [12]:
d ={'x':1,'y':2,'z':3}
for key in d:
print key,'corresponds to', d[key]
如果只需要值,可以使用d.values替代d.keys。d.items方法会将键-值对作为元组返回,for循环的一大好处就是可以循环中使用序列解包:
In [13]:
for key, value in d.items():
print key,'corresponds to', value
In [14]:
sorted([4,3,6,8])
Out[14]:
In [15]:
reversed([4,3,6,8])
Out[15]:
In [16]:
list(reversed([4,3,6,8]))
Out[16]:
注意:虽然sorted函数返回列表,reversed函数却返回一个可迭代对象。它们大可在for循环以及join方法中使用,而不会有任何问题。不过却不能直接对它使用索引、分片及调用列表的方法。
In [52]:
names=['anne','beth','george','damon']
ages=[12,45,32,102]
for i in range(len(names)):
print names[i],'is',ages[i],'years old'
而内建的zip函数可以用来进行并行迭代,可以把两个序列“压缩”在一起,然后返回一个元组的列表:
In [53]:
zip(names,ages)
Out[53]:
现在可以在循环中解包元组:
In [54]:
for name, age in zip(names,ages):
print name,'is',age,'years old'
In [19]:
[x*x for x in range(10)]
Out[19]:
如果只想打印出那些能被3整除的平方数呢?可以使用模除运算符—y%3。
In [20]:
[x*x for x in range(10) if x % 3 ==0]
Out[20]:
In [21]:
[(x,y) for x in range(2) for y in range(3)]
Out[21]:
In [23]:
pass #该语句什么事情也不做
In [25]:
x=1
del x
x
del语句不仅会移除一个对象的引用,也会移除那个名字本身。
有些时候可能需要动态地创造Python代码,然后将其作为语句执行或作为表达式计算。而exec语句能执行存储在字符串中的Python代码。eval语句会计算Python表达式,并且返回结果值。
In [26]:
exec 'print "Hello, world"'
In [27]:
from math import sqrt
exec 'sqrt=1'
sqrt(4)
exec语句最有用的地方在于可以动态地创造代码字符串。如果字符串是从其他地方获得的—很可能是用户—那么就不能确定其中到底包含什么代码。所以为了安全起见,可以增加一个字典,起到命名空间的作用。
In [28]:
from math import sqrt
scope={}
exec 'sqrt=1' in scope
sqrt(4)
Out[28]:
In [30]:
scope['sqrt']
Out[30]:
可以通过增加in scope来实现,其中scope就是起到放置代码字符串命名空间作用的字典。可以看到,潜在的破坏性代码并不会覆盖sqrt函数,原来的函数能正常工作,而通过exec赋值的变量sqrt只能在它的作用域内有效。
In [31]:
eval('6+18*2') #执行表达式
Out[31]:
In [34]:
exec('x=6+18*2') #执行语句
x
Out[34]:
In [ ]: