详解Python中的循环语句的用法
一、简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性。须重要理解,if、while、for以及与它们相搭配的 else、 elif、break、continue和pass语句。 Python中的if子句由三部分组成:关键字本身、用于判断结果真假的条件表达式以及当表达式为真或者非零时执行的代码块。if 语句的语法如下: if expression: expr_true_suite if 语句的expr_true_suite代码块只有在条件表达式的结果的布尔值为真时才执行,否则将继续执行紧跟在该代码块后面的语句。 if expression: expr_true_suite else: expr_false_suite 在C语言中,不会在条件语句范围外发现else语句, 但Python不同,可以在while和for循环中使用else语句,在循环中使用时,else子句只在循环完成后执行,也就是说break语句也会跳过else块。 在CODE上查看代码片派生到我的代码片 #!/usr/bin/env python def showMaxFactor(num): count = num / 2 while count > 1: if (num % count == 0): print 'largest factor of %d is %d' % (num,count) break count = count - 1 else: print eachNum,'is prime' for eachNum in range(10,21): showMaxFactor(eachNum) 在CODE上查看代码片派生到我的代码片 largest factor of 10 is 5 11 is prime largest factor of 12 is 6 13 is prime largest factor of 14 is 7 largest factor of 15 is 5 largest factor of 16 is 8 17 is prime largest factor of 18 is 9 19 is prime largest factor of 20 is 10 3、elif (即else-if )语句 if expression1: expr1_true_suite elif expression2: expr2_true_suite ... elif expressionN: exprN_true_suite else: none_of_the_above_suite 在将来的某天,Python可能会支持 switch /case语句,但是完全可以用其他的Python结构来模拟它。在Python中,大量的if-elif 语句并不难阅读。 if user.cmd == 'create': action = "create item" elif user.cmd == 'delete': action = 'delete item' elif user.cmd == 'update': action = 'update item' else: action = 'invalid choice... try again!' 上面的语句还可以用序列和成员关系操作符来简化它: 在CODE上查看代码片派生到我的代码片 if user.cmd in ('create','delete','update'): action = '%s item' % user.cmd else: action = 'invalid choice... try again!' 还可以用Python字典给出更加优雅的解决方案,使用映射对象(比如字典)的一个最大好处就是它的搜索操作比类似语句或是 for 循环这样的序列查询要快很多。 在CODE上查看代码片派生到我的代码片 msgs = {'create': 'create item','delete': 'delete item','update': 'update item' } default = 'invalid choice... try again!' action = msgs.get(user.cmd,default) 4、条件表达式(即"三元操作符") 在CODE上查看代码片派生到我的代码片 >>> x,y = 4,3 >>> smaller = x if x < y else y >>> smaller 3 5、while语句 while expression: suite_to_repeat while循环的suite_to_repeat子句会一直循环执行,直到expression值为布尔假。 count = 0 while (count < 9): print 'the index is:',count count += 1 代码块里包含了print和自增语句,它们被重复执行,直到count不再小于9。索引count在每次迭代时被打印出来然后自增 1。 while True: handle,indata = wait_for_client_connect() outdata = process_request(indata) ack_result_to_client(handle,outdata) “无限”循环永远不会结束,但它不一定是坏事,许多通讯服务器的客户端/服务器系统就是通过它来工作的。 (1)一般语法 >>> nameList = ['Walter',"Nicole",'Steven','Henry'] >>> for eachName in nameList: ... print eachName,"Lim" ... Walter Lim Nicole Lim Steven Lim Henry Lim 迭代一个列表.。每次迭代,eacgName变量都被设置为列表中特定某个元素。 >>> nameList = ['Cathy',"Terry",'Joe','Heather','Lucy'] >>> for nameIndex in range(len(nameList)): ... print "Liu,",nameList[nameIndex] ... Liu,Cathy Liu,Terry Liu,Joe Liu,Heather Liu,Lucy
没有迭代元素,而是通过列表的索引迭代。但通过直接迭代序列要比索引迭代快。 >>> nameList = ['Donn','Shirley','Ben','Janice','David','Yen','Wendy'] >>> for i,eachLee in enumerate(nameList): ... print "%d %s Lee" % (i+1,eachLee) ... 1 Donn Lee 2 Shirley Lee 3 Ben Lee 4 Janice Lee 5 David Lee 6 Yen Lee 7 Wendy Lee (3)用于迭代器类型 >>> range(3,7) [3,4,5,6] >>> for eachVal in range(2,19,3): ... print "value is:",eachVal ... value is: 2 value is: 5 value is: 8 value is: 11 value is: 14 value is: 17
range() 还有两种简略的语法格式:range(end)和range(start,end)。 start 默认为0, step默认为1。 (6)与序列相关的内建函数 #!/usr/bin/env python valid = False count = 3 passwdList=('abc',) while count > 0 and valid == False: input = raw_input("enter password:").strip() # check for valid passwd for eachPasswd in passwdList: if input == eachPasswd: valid = True break if not valid: # (or valid == 0) print "invalid input" count -= 1 continue else: break 结合使用了while、for、if、break以及continue,来验证用户输入。用户有三次机会来输入正确的密码,阻止用户猜测密码。 8、pass语句 def foo_func(): 这样的代码结构在开发和调试时很有用,因为编写代码的时候可能要先把结构定下来,但又不希望它干扰其他已经完成的代码, 在不需要它做任何事情地方放一个pass,将是一个很好的主意。另外它在异常处理中也被经常用到,比如你跟踪到了一个非致命的错误而不想采取任何措施。 (1)什么是迭代器 迭代器为类序列对象提供了一个类序列的接口,可以利用它们的索引从0开始一直"迭代" 到序列的最后一个条目,用"计数"的方法迭代序列是很简单的。 Python的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型, 包括用户定义的对象。 >>> myTuple = (123,'xyz',45.67) >>> i = iter(myTuple) >>> i.next() 123 >>> i.next() 'xyz' >>> i.next() 45.670000000000002 >>> i.next() Traceback (most recent call last): File "<stdin>",line 1,in <module> StopIteration 在for循环中for i in seq:do_something_to(i),它会自动调用迭代器的next()方法,并且监视StopIteration异常。 10、列表解析 >>> [x ** 2 for x in range(6)] [0,1,9,16,25] 列表解析的表达式可以取代内建的map()函数以及lambda ,而且效率更高。结合 if语句,列表解析还提供了一个扩展版本的语法:[expr for iter_var in iterable if cond_expr],它在迭代时会过滤/捕获满足条件表达式cond_expr的序列成员。 >>> seq = [11,10,8,23,7,18,12,11,12] >>> filter(lambda x: x % 2,seq) [11,11] >>> [x for x in seq if x % 2] [11,11] 即使不用filter()和lambda,可以使用列表解析来完成操作,获得想要的数字。 生成器表达式是列表解析的一个扩展,只用一行代码就可以创建包含特定内容的列表。另一个重要特性是生成器,生成器是特定的函数,允许返回一个值,然后"暂停"代码的执行,稍后恢复。 [expr for iter_var in iterable if cond_expr] 生成器表达式语法: (expr for iter_var in iterable if cond_expr) 磁盘文件样例:上述计算文本文件中非空白字符总和,如果这个文件的大小变得很大, 那么这行代码的内存性能会很低,因为要创建一个很长的列表用于存放单词的长度。为了避免创建庞大的列表,使用生成器表达式来完成求和操作,优化后的代码:>>> sum(len(word) for line in data for word in line.split()),是把方括号删除,少了两字节, 而且更节省内存。 在CODE上查看代码片派生到我的代码片 #!/usr/bin/env python def fun(): f = open('/etc/motd','r') longest = 0 allLines = [x.strip() for x in f.readlines()] #or allLineLens = [len(x.strip()) for x in f] f.close() for line in allLines: linelen = len(line) if linelen > longest: #or longest = max(allLineLens) longest = linelen return longest 新的方法: 使用生成器表达式替换列表解析和max()函数,并去掉文件打开模式(默认为读取):return max(len(x.strip()) for x in open('/etc/motd'))。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |