【问题标题】:Python's way to store a default value if expression failed如果表达式失败,Python 存储默认值的方法
【发布时间】:2014-07-21 16:13:28
【问题描述】:

perl 的// 运算符的python 模拟是什么?

在 perl 中,可以执行以下操作:

$pos = $some_list[0] // 1

你如何在 python 中完成同样的事情?

【问题讨论】:

    标签: python shortcut


    【解决方案1】:

    在 Python 中 没有undefined;相反,如果您尝试访问列表中不存在的索引,则会出现异常。因此,您可以改用异常处理:

    try:
        pos = some_list[0]
    except IndexError:
        pos = 1
    

    对于序列的第一个元素,您可以将序列显式测试为布尔值(python 容器在为空时为“假”):

    post = some_list[0] if some_list else 1
    

    【讨论】:

      【解决方案2】:

      如何使用异常?

      try:
          pos = some_list[0]
      except (NameError, IndexError):
          pos = 1
      

      【讨论】:

        【解决方案3】:

        上述字典的 try/catch 答案的替代方法是 .get() 上的默认参数:

        param_value = my_dictionary.get(param_key, default_value)
        

        【讨论】:

        • 前提是 OP 有字典,而不是列表。
        • 因此我的警告“用于字典”
        • 但是 Perl 中的映射使用 {...} 代替。
        【解决方案4】:

        python 中的最佳实践是使用 try, except 子句显式处理异常。此处提供的一个示例可帮助您进行可视化

        my_list = []
        try:
            item = my_list[1]
        except IndexError:
            item = 1
        

        此处代码执行并引发异常,因为索引“1”超出范围。然后我们继续处理该异常并设置item=1 允许程序继续运行。对异常进行显式处理的原因是,作为程序员,我们可以准确地看到是什么导致了我们的问题。以此为例:

        my_list = [0]
        try:
            item = 1/my_list[0]
        except IndexError:
            item = 1
        

        这将引发零除法错误(停止执行),并让我们知道我们需要明确处理超出我们预期的原始异常 IndexError 的其他异常。然后我们可能会做这样的事情来处理这种情况:

        my_list = [0]
        try:
            item = 1/my_list[0]
        except IndexError:
            item = 1
        except ZeroDivisionError:
            item = 99999
        

        try-except 块还有一些其他值得我们利用的显着特性:

        try:
            # code which might raise error
            pass
        except IndexError as err:
            # handling an index error and storing the traceback in err
            pass
        except ZeroDivisionError:
            #handling some other error:
            pass
        else:
            # code we would like to execute if the try block succeeds without any errors
            pass
        finally:
            # code we will execute regardless of what occurs in the entire 
            # try,except,else block listed above (i.e we can ensure a file is closed)
            pass 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-22
          • 1970-01-01
          • 1970-01-01
          • 2011-07-15
          • 2010-11-11
          • 1970-01-01
          • 2016-08-06
          相关资源
          最近更新 更多