3.5. 使用 else 子句简化循环(异常处理) |
您所在的位置:网站首页 › python的循环语句有哪些关键词 › 3.5. 使用 else 子句简化循环(异常处理) |
3.5. 使用 else 子句简化循环(异常处理)¶
有其他编程语言经验的程序员接触到Python时,对于它无所不在的 else 往往感到非常 惊讶。 在Python中,不仅分支语句有 else 子句,而且循环语句也有,甚至连异常处理也有。 首先来看者循环语句中的 else , 看看它们的语法。 while_stmt :: = "while" expression ":" suite["else" ":"suite] for_stmt :: = "for" target_list "in" expression_list " :", suite["else" ":" suite] 从语法定义中可以看到如果没有 ["else" ":" suite] 这一块,Python的循环语句跟大多数语言并无二致。 要谈 else 子句,必须先从Python从其他语言中借鉴的语义相同的 break 语句说 起, 因为 else 子句提供了隐含的对循环是否由 break 语句引发循环结束的判断。 先来看一个没有使用 else 子句的例子: >>> def print_p(n): >>> for i in range(2, n): >>> found = True >>> for j in range(2, i): >>> if i % j == 0: >>> found = False >>> break >>> if found: >>> print ("%d is a prime number"%i) >>> print_p(20) 2 is a prime number 3 is a prime number 5 is a prime number 7 is a prime number 11 is a prime number 13 is a prime number 17 is a prime number 19 is a prime number这是一个査找素数的简单实现,可以看到我们借助了一个标志量 found 来判断是循环结束是不是由 break 语句引起的。 如果对 else 善加利用,代码可以简洁得多。来看下面的具体 实现: >>> def print_prime2 (n) : >>> for i in range(2, n): >>> for j in range(2, i): >>> if i % j == 0: >>> break >>> else: >>> print ("%d is a prime number1"%i) >>> print_prime2(20) 2 is a prime number1 3 is a prime number1 5 is a prime number1 7 is a prime number1 11 is a prime number1 13 is a prime number1 17 is a prime number1 19 is a prime number1当循环“自然”终结(循环条件为假)时 else 从句会被执行一次, 而当循环是由 break 语句中断时, else 子句就不被执行。 与 for 语句相似, while 语句中的 else 子句的语意是一样 的: else 块在循环正常结朿和循环条件不成立时被执行。 与C/C++等较为“老土”的语言相比, else 子句使程序员的生产力和代码的可读性都得到了提髙, 所以建议大家多使用 else ,让程序变得更加Pythcmic。 在Python的异常处理中,也提供了 else 子句语法。 这颗“语法糖”的意义跟循环语句中的 else 是相似的: try 块没有拋出任何异常时,执行 else 块。 按惯例先看一下如下语 法定义: try_stmt ::= tryl_stmt | try2_stmt tryl_stmt ::= "try" ":" suite ("except" [expression [ ("as" | ",") target]]":" suite) +["else" ":" suite] ["finally" ":" suite] try2_stmt ::= "try" ":" suite"finally" ":" suite 从tryl_stmt的定义中可以看到,Python的异常处理中有一种try-except-else-finally形式。 下面的例子是把数据写入文件中。 >>> def save(db, obj): >>> try: >>> # save attrl >>> db.execute('a sql stmt', obj.attr1) >>> # save attr2 >>> db.execute('another sql stmt', obj.attr2) >>> except DBError: >>> db.rollback() >>> else: >>> db.commit ()如果没有 else子 句,就像前文中关于循环的例子一样,需要引人一个标志变量。 >>> def save(db, obj): >>> some_error_occurred= False >>> try: >>> # save attrl >>> db.execute ( ' a sql stmt', obj.attr1) >>> # save attr2 >>> db.execute ('another sql stmt', obj.attr2) >>> except DBError: >>> db.rollback() >>> some_error_occurred = True >>> if not some_error_occurred: >>> db.commit ()这样代码就变得复杂了。在Python中还有不少语法都是致力于让程序员可以编写更加 简明、更接近自然语言语义的代码。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |