zoukankan      html  css  js  c++  java
  • 【Python】any() 或者 or

    前言

    在我之前的文章中有any()和all()的对比:any()和all()对比其中介绍了any()函数的基本特性---可迭代对象中有任意一个不为False的时候,返回True,如果可迭代对象为空的话,返回False

    由于这个特性,决定了any()可以用在判断语句中与 or 一较高下。那么俩者有区别吗?显然是有的,接下来就让我们详细的对比俩者。

    案例

    现在有这样的一个场景:某学校要招聘老师,要满足一下任意一个要求:

    1. 有教师资格证
    2. 有教学经验
    3. 是师范专业

    现在有一批申请人:

    applicants = [
        {
         "name":"张三",
          "has_degree": False,
          "has_experience":True,
          "is_professional": False
        },
        {
         "name":"李四",
          "has_degree": True,
          "has_experience":False,
          "is_professional": False
        },
            {
         "name":"王二",
          "has_degree": False,
          "has_experience":False,
          "is_professional": False
        }
    ]
    

    如何从这样的数据判断申请人是否符合条件呢?

    or

    for applicant in applicants:
        if applicant.get("has_degree") or applicant.get("has_experience") or applicant.get("is_speical"):
            print(f'{applicant["name"]} 符合条件!')
    

    输出结果:

    张三 符合条件!
    李四 符合条件!
    

    any

    如果使用 any() 就需要参数是可迭代的(iterable),也就意味着我们需要将参数转化为list、tupple等。

    for applicant in applicants:
        if any([applicant.get("has_degree"),applicant.get("has_experience"), applicant.get("is_speical")]):
            print(f'{applicant["name"]} 符合条件!')
    

    显然最终输出结果是一样的。

    到这里,是不是觉得 any() 像升级版的 or ? 那究竟是不是这样子呢?别着急忘下看。

    or 和 any 的区别

    两者的区别总共有俩点:

    1. 语法
    2. 返回值

    接下来让我们详细的介绍一下

    语法

    众所周知 or 是一个逻辑运算符,所以它需要两个参数:

    >>> True or False
    True
    

    any() 是一个函数,只需要一个可迭代的参数:

    >>>any([True,False])
    True
    

    这就意味着,如果对于一个可迭代的参数使用any()会显得更简单一旦,如果使用or,则需要我们去遍历了:

    >>> import functools
    >>> functools.reduce(lambda x, y: x or y, (True, False, False))
    True
    

    除了这个区别,俩者还有一个更重要的区别,正常情况下当众多条件下出现一个True的时候,我们希望对余下的条件不做任何判断直接返回 True(这种被称作 短路求值short-circuit evaluation 或者 延迟计算lazy evaluation),让我们看看 orany() 是否这样呢?

    ef test_a():
        print('A was called')
        return True
    def test_b():
        print('B was called')
        return False
    print('===call_or===')
    a_or_b = test_a() or test_b()
    print('===call_any===')
    a_any_b = any([test_a(),test_b()])
    

    运行一下看一下输出结果:

    ===call_or===
    A was called
    ===call_any===
    A was called
    B was called
    

    从结果不难发现,or 是按照预期返回的,而any()则不是。那么有没有办法让Python调用函数的时候也遵循 延迟计算(lazy evaluation)呢?方法是有的---通过map()构造一个生成器或者使用生成器表达式

    a_any_iterable_b = any((test() for test in [test_a,test_b]))
    

    上面的例子就是使用生成器表达式(generator expression),当其中一个条件返回为True,则any()就会直接返回True,而不会继续校验余下的条件。

    返回值

    any()or俩者的返回值也大不相同。any()在任何清理下都会返回一个布尔值(True、False):

    >>> any((1, 0))
    True
    

    or则不是这样,它会发现它找到的第一个布尔值为True的元素,即bool(value)True,返回value,否则返回最后一个元素:

    >>> 1 or 0
    1
    
    >>> None or 0
    0
    

    参考

    How to Use any() in Python

  • 相关阅读:
    最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现
    动态规划算法(后附常见动态规划为题及Java代码实现)
    2个字符串的最长公共子串
    VS2010常用快捷键
    错误代码errno值的含义
    几个常用I/O函数用法(printf,fprintf等)
    查看CPU位数的方法
    关于函数指针的总结
    日本标点符号的输入总结
    共享内存及信号量的几个函数介绍
  • 原文地址:https://www.cnblogs.com/leetao94/p/13253464.html
Copyright © 2011-2022 走看看