`

with 和 if-else条件表达式

阅读更多

对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句是很有用的。对此有许多使用场景,例如:

 

  • 关闭一个文件
  • 释放一个锁
  • 创建一个临时的代码补丁
  • 在特殊环境中运行受保护的代码
with语句覆盖了这些使用场景,为在一个代码块前后调用一些代码提供了一种简单的方法。例如,使用一个文件通常可以如下实现。
hosts = file('/etc/hosts')
try:
    for line in hosts:
        if line.startswith('#'):
            continue
        print line
finally:
     hosts.close()
 
使用with语句,以上代码可以重写如下:
from __future__ import with_statement
with file('/etc/hosts') as hosts:
    for line in hosts:
        if line.startswith('#'):
            contine
        print host
 注意,在2.5版本中with语句仍然位于__future__模块里,而在2.6版本中则可以直接使用。

与这条语句兼容的其他项目是来自thread和threading模块的类:
  • thread.LockType
  • threading.Lock
  • threading.RLock
  • threading.Condition
  • threading.Semaphore
  • threading.BoundedSemaphore
这些类都实现两个方法__enter__和__exit__,这都来自于with协议。换句话说,任何类都可以实现为如下的所示:
class Context(object):
    def __enter__(self):
        print 'entering the zone'

    def __exit__(self, exception_type, exception_value, exception_traceback):
        print 'leaving the zone'
        if exception_type is None:
            print 'with no error'
        else:
            print 'with an error (%s)' % exception_value

with Context():
    print 'i am the zone'

with Context():
    print 'i am the buggy zone'
    raise TypeError('i am the bug')
  

Python2.5新增if-else条件表达式

条件表达式,C风格的如下:

condition? exp1 : exp2

也称为三元表达式。

 

Python2.5新增了这一功能,但形式有了变化:

 

exp1 if condition else exp2

 

实例:

>>> a = 1 if 2 == 3 else 4
>>> a
4
>>> isLeapYear = lambda year: not (year % 4 if year % 100 else year % 400) # 判断闰年
>>> isLeapYear(1234)
False
>>> isLeapYear(1236)
True
>>> isLeapYear(1000)
False
>>> isLeapYear(2000)
True
>>> [i + 1 if i % 2 for i in xrange(10)] # 不能省略else
  File "<stdin>", line 1
    [i + 1 if i % 2 for i in xrange(10)]
                      ^
SyntaxError: invalid syntax
>>> [i + 1 if i % 2 else i for i in xrange(10)]
[0, 2, 2, 4, 4, 6, 6, 8, 8, 10]
>>> [i % 2 and i + 1 or  i for i in xrange(10)] # 之前的语法
[0, 2, 2, 4, 4, 6, 6, 8, 8, 10]
 
分享到:
评论

相关推荐

    :umbrella_with_rain_drops:一些if-else语句(可为null和布尔值)的流利的Kotlin表达式。-Android开发

    WhatIf:umbrella_with_rain_drops:WhatIf是kotlin扩展,用于表达单个if-else语句,可为null和布尔值。 下载Gradle将依赖项代码添加到模块的build.gradle文件中。 dependenci WhatIf:umbrella_with_rain_drops:WhatIf...

    WhatIf::umbrella_with_rain_drops:Kotlin的流利表达式,用于处理单个if-else语句,可为空,集合和布尔值

    WhatIf::umbrella_with_rain_drops:Kotlin的流利表达式,用于处理单个if-else语句,可为空,集合和布尔值

    正则表达式

    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp...

    互联网程序员都每天刷题嘛-learn-programming-with-python-:用python学习编程

    表达式、变量和打印输出 Python 运算符 - Python 赋值运算符、关系和逻辑运算符、短路运算符 Python 条件和 If 语句 方法 - 参数、参数和返回值 Python平台概述 面向对象编程 - 类、对象、状态和行为 OOPS 基础 - ...

    jQuery完全实例.rar

    这个函数最基本的用法就是向它传递一个表达式(通常由 CSS 选择器组成),然后根据这个表达式来查找所有匹配的元素。 默认情况下, 如果没有指定context参数,$()将在当前的 HTML 文档中查找 DOM 元素;如果指定了 ...

    精髓Oralcle讲课笔记

    5、--任何含有空值的数学表达式,最后的计算结果都是空值。 6、select ename||sal from emp; --(将sal的查询结果转化为字符串,与ename连接到一起,相当于Java中的字符串连接) 7、select ename||'afasjkj' from...

    RobotFrameworkifelse.pdf

    多重条件判断 多重条件判断( …ELSE IF … ELSE) ${status} Set Variable 1 Run Keyword If ${status} … Else If ${status} &gt; 4 log "error" … Else log "end" 3.利⽤ 利⽤IF关键字给变量赋值 关键字给变量赋值 即...

    twt:OCaml的空白

    运算符顶级语句运算符多行括号嵌套函数应用涉及嵌套的let,if-else和try-with表达式以及结果括号的歧义括号关键字in , done , begin和end 语言语法在其他方面与OCaml相同,但有一些限制。 版本1被实现为面向行的预...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 ...

    VBSCRIP5 -ASP用法详解

    If...Then...Else 语句 根据表达式的值,有条件地执行一组语句。 IgnoreCase 属性 设置或返回 Boolean 值,指示模式搜索是否区分大小写。 Imp 运算符 执行两个表达式的逻辑隐含。 初始化事件 发生在创建相关类的...

    FastReport问题集

    Q: 我有两个对象: Memo1 和 Memo2. 我能否在 Memo1 的脚本中调用 Memo2 的属性和方法? A: 当然, 例如,你可以这样做: 对象名.属性名. Q: 在脚本中,我可以使用对象的哪些属性? A: 几乎所有你能在对象浏览器中...

    freemarker总结

    &lt;#elseif condition&gt;... &lt;#elseif condition&gt;... &lt;#else&gt; ... &lt;/#if&gt; 例子如下: &lt;#if (age&gt;60)&gt;老年人 &lt;#elseif (age&gt;40)&gt;中年人 &lt;#elseif (age&gt;20)&gt;青年人 &lt;#else&gt; 少年人 &lt;/#if&gt; 输出结果是:青年人 ...

    freemarker语法完整版

    if, else, elseif 语法 Java代码 &lt;#if condition&gt; ... &lt;#elseif condition2&gt; ... &lt;#elseif condition3&gt; ... ... &lt;#else&gt; ... &lt;/#if&gt; &lt;#if condition&gt; ... &lt;#elseif condition2&gt; ... &lt;#...

    微软JavaScript手册

    if...else 语句 根据表达式的值,有条件地执行一组语句。 ignoreCase 属性 返回一个 Boolean 值,标记正则表达式使用的 ignoreCase 标志状态 (i)。 递增运算符(++) 给变量加一。 index 属性 返回在字符串中找到...

    javascript文档

    if...else 语句 根据表达式的值,有条件地执行一组语句。 ignoreCase 属性 返回一个 Boolean 值,标记正则表达式使用的 ignoreCase 标志状态 (i)。 递增运算符(++) 给变量加一。 index 属性 返回在字符串中找到...

    JScript 语言参考

    if...else 语句 根据表达式的值,有条件地执行一组语句。 ignoreCase 属性 返回一个 Boolean 值,标记正则表达式使用的 ignoreCase 标志状态 (i)。 递增运算符(++) 给变量加一。 index 属性 返回在字符串中找到...

    VBSCRIPT中文手册

    If...Then...Else 语句 根据表达式的值,有条件地执行一组语句。 IgnoreCase 属性 设置或返回 Boolean 值,指示模式搜索是否区分大小写。 Imp 运算符 执行两个表达式的逻辑隐含。 初始化事件 发生在创建相关类的...

    vb Script参考文档

    If...Then...Else 语句 根据表达式的值,有条件地执行一组语句。 IgnoreCase 属性 设置或返回 Boolean 值,指示模式搜索是否区分大小写。 Imp 运算符 执行两个表达式的逻辑隐含。 初始化事件 发生在创建相关类的...

    VBScript 语言参考

    If...Then...Else 语句 根据表达式的值,有条件地执行一组语句。 IgnoreCase 属性 设置或返回 Boolean 值,指示模式搜索是否区分大小写。 Imp 运算符 执行两个表达式的逻辑隐含。 初始化事件 发生在创建相关类的...

    VBScript 语言参考中文手册CHM

    If...Then...Else 语句 根据表达式的值,有条件地执行一组语句。 IgnoreCase 属性 设置或返回 Boolean 值,指示模式搜索是否区分大小写。 Imp 运算符 执行两个表达式的逻辑隐含。 Initialize 事件 发生在创建...

Global site tag (gtag.js) - Google Analytics