您的位置:首页 > 编程语言 > Python开发

【循序渐进学Python】5.Python常用流程控制及其他语句

2013-10-24 19:30 471 查看

1.赋值语句常用技巧

通过序列解包(sequenceunpacking)可以将多个值的序列解开,让后一一放置到变量的序列中。解包的序列中的元素必须和等号左边变量数量一致。如下:



values=1,2,3

printvalues#output:(1,2,3)

x,y,z=values#output:123
printx,y,z

bob_Info={'name':'Bob','email':'bob@gmail.com'}
key,value=bob_Info.popitem()

printvalue#output:Bob





1.2链式赋值

通过使用链式赋值(chainedassignment)可以将一个值同时赋给多个变量,如下:



x=y=z=1

printx,y,z#output:111





1.3增量赋值

将表达式运算符(
+
-
*
%
/
等)放置在赋值运算符(=)的左边,这些写法被称为增量赋值(augmentedassignment),如下:



x=6

x+=1
printx#output:7

x*=6
printx#output:42




2.缩进——Python语言的风格

Python和其他语言有一个很大的区别在于:Python使用硬回车来分割语句,使用冒号(:)和缩进来分割代码块。同一层次的语句必须有相同的缩进(每一组这样的语句称为一个块),而C语言风格的编程语言(Java/C#/C++)则使用分号来分割语句,花括号来分割代码块。

正确的缩进


不要混合使用tab键和空格来进行缩进,这会使程序在跨平台时不能正常的工作。官方推荐的做法是使用四个空格


如下:



#---coding:utf-8---

age=20
ifage<21:
print'不能买酒'
print'但是你可以来块口香糖'

print'这句话处于If语句的外部'




3.条件和条件语句

在Python中解释器认为标准值False、None和所有类型的数字0(浮点型,长整型等)、空序列(字符串、字典、列表等)都为假(False),如下所示:



printbool(False)#False
printbool(None)#False
printbool(0)#False
printbool("")#False
printbool(())#False
printbool([])#False
printbool({})#False





3.2条件执行和if语句

和C#中的If语句类似,如果if内的条件判定为真,则执行后面的语句块:



#--coding:utf-8--
age=18

ifage>=18:
print'年龄超过18岁了'





3.3else子句

else子句作为if语句的一部分,如果if语句的条件被判定为“False”则执行else子句后的语句块,如下:



#--coding:utf-8--
age=16

ifage>=18:
print'年龄超过18岁了'
else:
print'未成年人'





3.4elif子句

elif子句是“elseif”的简写,通过elif子句可以检查更多的条件,如下:



num=input('Enteranumber:')

ifnum>0:
print'Thenumberispositive'
elifnum<0:
print'Thenumberisnegative'
else:
print'Thenumberiszero'





3.5嵌套代码块

有时候我们需要更加复杂的条件分支判定,这时可以嵌套使用if语句来实现,如下:



num=raw_input('Enteranumber:')

ifname.endswith('Gumby'):
ifname.startswith('Mr.'):
print'Hello.Mr.Gumby'
elifname.startswith('Mrs.'):
print'Hello,Mrs.Gumby'
else:
print'Hello,Gumby'
else:
print'Hello,Stranger'





3.6更复杂的条件

比较运算符

比较运算符时条件中最基本的运算符,详见下表:

表达式描述
x==yx等于y
x<yx小于y
x>yx大于y
x>=yx大于等于y
x<=yx小于等于y
x!=yx不等于y
xisyx和y是同一个对象
xisnotyx和y是不同的对象
xinyx是y容器(序列等)的成员
xnotinyx不是y容器(序列等)的成员
同一性运算符

在Python中使用
is
运算符来进行同一性判断(即是否属于同一个对象),而相等性运算符(
==
)用来判断两个对象是否相等,区别如下代码所示:



x=[1,2,3,4,5]
y=[1,2,3,4,5]

printx==y#True
printxisy#False

z=y
printzisy#True




避免将is运算符用于比较不可变值(如:数值类型,字符串等)


成员资格运算符

使用
in
来判断某一元素是否属于容器中的成员。如下:



book='DiveIntoPython'

print'P'inbook#True





字符串和序列比较

字符串(字符是按照本身的顺序值排列的)可以按照字母排序进行比较,如:



print'alpha'<'beta'#True



不过实际的排序结果和使用不同的locale而变化。


locale模块提供了C本地化(localization)函数的接口,同时提供相关函数,实现基于当前locale设置的数字,字符串转换(int/float/string模块中的转换函数不受locale设置的影响)。更多locale模块的信息,可以参考这里:http://docs.python.org/2/library/locale.html。


序列之间也可以通过对比序列中的元素来进行比较:



print[1,2]<[2,1]#True
print[1,[2,3]]>[1,[2,4,5]]#False





布尔运算符

常用的布尔运算符有:

and(&&)

or(||)

not(!)

和在C#这些语言中不同,在Python中直接通过它们对应的单词使用,如:



age=12

ifage>6andage<=12:
print'schoolchild'
else:
print'notschoolchild'




4.断言

assert语句失败的时候,会引发一个AssertionError。与其让程序在晚些时候崩溃,不如在错误条件出现时直接让它崩溃,在Python中我们可以通过使用assert语句来实现一个断言,assert语句失败的时候会抛出AssertionError异常。如下:



#--coding:utf-8--
mylist=['item']
assertlen(mylist)>=1
mylist.pop()
assertlen(mylist)>=1'断言失败,程序终止运行'




5.循环

while循环中的表达式如果为True就会一直执行其后的语句块,如下打印0-100的值:



x=0
whilex<=100:
printx
x+=1





5.2for循环

在Python中for循序的使用方法基本和C#中的foreach一样,使用for循环打印0-100的值:



numbers=range(0,101)
fornuminnumbers:
printnum





使用for循环遍历字典



#--coding:utf:8--
dic={'a':1,'b':2,'c':3,'d':4,'e':5}
forkeyindic:
printkey,'对应',dic[key]

#循环中使用序列解包
forkey,valueindic.items():
printkey,'对应',value





5.3使用迭代工具

Python为了为了方便迭代序列提供了一些很好的工具函数。这些函数有Python内建的,但是大部分位于:itertools模块中,更多信息可以参考Python文档:http://docs.python.org/2/library/itertools.html

并行迭代

通过使用Python内建的
zip
函数可以将两个序列合并为一个元组:



#--coding:utf-8--
names=['anne','beth','george','damon']
ages=[12,45,32,102]

#将两个序列“压缩”在一起,返回一个元组的列表
poeples=zip(names,ages)

#再循环中解包元组
forname,ageinpoeples:
printname,'is',age,'yearsold'





元组的长度等于相对较短序列的长度。如下:



#output:[(0,0),(1,1),(2,2)]
printzip(range(3),xrange(100))





编号迭代

如果需要在迭代序列的同时还要获取当前迭代对象的索引,可以使用下面的方法:



#--coding:utf-8--

strings=['2','1','2','2','1']

index=0
forstringinstrings:
if'2'instring:
strings[index]='1'
index+=1
#output:['1','1','1','1','1']
printstrings





或者是直接使用内建的
ernumerate
函数:



#--coding:utf-8--

strings=['2','1','2','2','1']

forindex,stringinenumerate(strings):
if'2'instring:
strings[index]='1'
#output:['1','1','1','1','1']
printstrings





翻转和排序迭代

reversed和sorted这两个函数可以使用在任何序列或可迭代对象,返回的是翻转或者排序后的版本。如下:



#--coding:utf-8--

#output:[0,1,2,3,4,5,6,7,8,9]
printsorted([9,1,8,2,6,5,4,3,7,0])

#output:['!','e','h','l','l','o']
printsorted('hello!')

#reversed返回的是一个可迭代对象
#通过list()函数将对象转换为列表
#output:['!','o','l','l','e','h']
printlist(reversed('hello!'))

#output:!olleh
print''.join(reversed('hello!'))





5.5跳出循环

break:Python使用break语句跳出循环:



#--coding:utf-8--
importrandom

whileTrue:
#生成0-9之间的随机数
num=random.randrange(0,10)
printnum
ifnum==6:
break





continue:continue语句会让当前的迭代结束,直接开始下一轮的循环,如下所示:



#--coding:utf-8--

#输出:6
fornuminxrange(1,10):
ifnum==1:continue
ifnum==2:continue
ifnum==3:continue
ifnum==4:continue
ifnum==5:continue
printnum
break





6.列表推导式

列表推导式(listcomprehension)是利用其它列表创建新列表的一种方法,如下:



#--coding:utf-8--

#output:[0,1,4,9,16,25,36,49,64,81]
#列表元素x由其自身的平方根组成
print[x*xforxinrange(10)]





增加条件:我们还可以为创建的元素添加其它条件,如下:



#--coding:utf-8--

#output:[0,10,20,30,40,50]
#列表元素x由其自身*2的倍数组成,且能被5整除
print[x*2forxinrange(30)ifx%5==0]





多个for语句:还可以通过使用多个for语句来生成列表:



#--coding:utf-8--

#output:[(0,0),(0,1),(1,0),(1,1)]
#生成x和y的所有组合
print[(x,y)forxinrange(2)foryinrange(2)]





下面的for循环部分创建的列表和上面的推导式一样:



#--coding:utf-8--

result=[]
forxinrange(2):
foryinrange(2):
result.append((x,y))
#output:[(0,0),(0,1),(1,0),(1,1)]
printresult





7.pass/del/exec语句

pass语句——代码中的占位符:
pass
语句在Python代码中充当占位符使用。比如说现在马上就要测试一个if语句,但是其中还缺少一个语句块(代码不会执行,Python中空代码块是非法的),这个时候我们可以暂时使用pass语句来填充,如下:



#--coding:utf-8--

age=12
age=5
ifage>6andage<=12:
print'schoolchild'
else:
#未完成
pass





使用del语句删除

Python解释器通过垃圾回收可以将内存中没有任何引用的对象给清理掉。我们也可以通过del语句我们也可以直接将一个对象从内存中清除,如下:



#--coding:utf-8--

x=['hello','world']

delx
#NameError:name'x'isnotdefined
printx





使用exec和eval执行和求值字符串

使用
exec
语句可以执行存储在字符串中的Python代码,如下:



#output:hello,world
exec"print'hello,world'"





通过使用
eval
语句可以计算以字符串形式书写的Python表达式,我们可以在Python交互解释器中输入如下代码:



>>>eval(raw_input("Enteranarithmeticexpression:+"))
Enteranarithmeticexpression:+16+16
32
>>>



我们在程序中输入了:16+16的表达式,通过eval执行后返值:32

为了提高程序的安全性,我们可以为exec语句和eval语句增加一点包装,将这些语句限制在特定的作用域中,如下:



scope={}
exec'sqrl=6'inscope
printscope['sqrl']#output:6

scope={}
scope['x']=2
scope['y']=3

printeval('x*y',scope)#output:6





警告


在Python中使用exec执行Python代码字符串和通过eval语句计算Python表达式,这样的做法并不推荐,因为这样会有潜在的严重漏洞。因为可能会有用户提供一些恶意的字符串作为代码或表达式来执行,这样程序会有潜在失去控制的危险。记住:在python中并没有任何执行不可信任代码的安全方式。



参考资料&进一步阅读

Python基础教程(第二版)

简明Python教程

深入Python:DiveIntoPython中文版

Python维基百科
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航