当前位置:主页 > python教程 > Python函数any()和all()的用法和区别

详解Python函数any()和all()的用法和区别

发布:2018-09-14 09:38:26 448


本站收集了一篇相关的编程文章,网友贡芝英根据主题投稿了本篇教程内容,涉及到Python、any()、all()、Python函数any()和all()的用法和区别相关内容,已被295网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。

Python函数any()和all()的用法和区别

Python函数any()和all()的用法及区别介绍

引子

平常的文本处理工作中,我经常会遇到这么一种情况:用python判断一个string是否包含一个list里的元素。

这时候使用python的内置函数any()会非常的简洁:

fruits = ['apple', 'orange', 'peach']
str = "I want some apples"
if any(element in str for element in fruits):
  print "string contains some fruits."

any()

其实any函数非常简单:判断一个tuple或者list是否全为空,0,False。如果全为空,0,False,则返回False;如果不全为空,则返回True。

all()

all函数正好和any相反:判断一个tuple或者list是否全为不为空,0,False。如果全不为空,则返回True;否则返回False。

这里需要注意的是,空tuple和空list的返回值是True

python中内建函数all()和any()的区别

all(x) 是针对x对象的元素而言,如果all(x)参数x对象的所有元素不为0、”、False或者x为空对象,则返回True,否则返回False
如:

In [25]: all(['a', 'b', 'c', 'd']) #列表list,元素都不为空或0
Out[25]: True
In [26]: all(['a', 'b', '', 'd']) #列表list,存在一个为空的元素
Out[26]: False
In [27]: all([0, 1,2, 3]) #列表list,存在一个为0的元素
Out[27]: False
In [28]: all(('a', 'b', 'c', 'd')) #元组tuple,元素都不为空或0
Out[28]: True
In [29]: all(('a', 'b', '', 'd')) #元组tuple,存在一个为空的元素
Out[29]: False
In [30]: all((0, 1,2, 3)) #元组tuple,存在一个为0的元素
Out[30]: False
In [31]: all([]) # 空列表
Out[31]: True
In [32]: all(()) # 空元组
Out[32]: True

any(x)是判断x对象是否为空对象,如果都为空、0、false,则返回false,如果不都为空、0、false,则返回true

In [33]: any(['a', 'b', 'c', 'd']) #列表list,元素都不为空或0
Out[33]: True
In [34]: any(['a', 'b', '', 'd']) #列表list,存在一个为空的元素
Out[34]: True
In [35]: any((0,1)) #元组tuple,存在一个为空的元素
Out[35]: True
In [36]: any((0,'')) #元组tuple,元素都为空
Out[36]: False
In [37]: any(()) # 空元组
Out[37]: False
In [38]: any([]) # 空列表
Out[38]: False

python中any()和all()如何使用

any(iterables)和all(iterables)对于检查两个对象相等时非常实用,但是要注意,any和all是python内置函数,同时numpy也有自己实现的any和all,功能与python内置的一样,只不过把numpy.ndarray类型加进去了。因为python内置的对高于1维的ndarray没法理解,所以numpy基于的计算最好用numpy自己实现的any和all。

本质上讲,any()实现了或(OR)运算,而all()实现了与(AND)运算。

对于any(iterables),如果可迭代对象iterables(至于什么是可迭代对象,可关注我的下篇文章)中任意存在每一个元素为True则返回True。特例:若可迭代对象为空,比如空列表[],则返回False。
官方文档如是说:

Return True if any element of the iterable is true. If the iterable is empty, return False.

伪代码(其实是可以运行的python代码,但内置的any是由C写的)实现方式:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

对于all(iterables),如果可迭代对象iterables中所有元素都为True则返回True。特例:若可迭代对象为空,比如空列表[],则返回True。

官方文档如是说:

Return True if all elements of the iterable are true (or if the iterable is empty).

伪代码(其实是可以运行的python代码,但内置的all是由C写的)实现方式:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

python的模块由两类语言开发,一类为纯python,一类为编译型语言,比如C/C++/Fortran。绝大多数标准库由纯python开发,这是由于python语言具有简洁性及短的开发周期。这些模块的源码很容易获得,在ipython下可用module??打印到屏幕上查看,或者写一个脚本保存起来,比如下面这样:

import os
import inspect as inspect
import pandas as pd

path = r"D:\python3_dev\package_down"
os.chdir(path)

series = inspect.getsource(pd.Series)
with open("pd_series_code.py", "w") as f:
    f.write(series)

当然,也可以到python安装包下查找,但是效率很低。

python inspect.getsource(object)只能查看用python写的module, class, method, function, traceback, frame, or code object。可以看看getsource的文档字符串,了解其基本功能。

>>>inspect.getsource.__doc__
'Return the text of the source code for an object.\n\n    
The argument may be a module, class, method, function, traceback, frame,\n    
or code object.  The source code is returned as a single string.  An\n    
OSError is raised if the source code cannot be retrieved.'

对于有些模块,通常是关乎运行性能的,一般都由编译型语言开发,比如os模块和for循环N多层的线性代数等模块。所以无法通过getsource方法获得源码,通常会抛出一个TypeError异常。要查看这些模块的源码,需要到GitHub上的python/cpython目录下找,比如在Objects目录下可找到listobject.c,这是list模块的C代码。

那么怎么知道一个模块是内置的呢?可用type(object)或object.__module__。比如

>>>type(all)
builtin_function_or_method
>>>all.__module__
'builtins'

一个2X3 ndarray 的例子。用numpy自己实现的all很容易判断两个array是否相等,但python内置的却抛出了异常。

>>>x = np.ones((2,3))
>>>x1 = np.ones((2,3))
>>>np.all(x==x1)
True
>>>xe = x==x1
>>>xe.all()
True
>>>all(xe)#这里调用了python内置模块all()
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

但是,还有更pythonic的写法,因为numpy有一个模块array_equal,可以直接判断两个array是否完全相等或某个轴相等,其实他也是用np.all实现的。

>>>np.array_equal(x, x1)
True

其实也不要惊讶,这只是python的常规操作。轮子已经被匠人造好,拿来用就OK了!如果你觉得自己可以造出更金光闪闪的轮子,那就抡起你的斧头;如果觉得已经够完美,那就拿来主义,不要再造了。

 


参考资料

相关文章

  • Python 日志管理模块Loguru的用法小结

    发布:2023-04-10

    这篇文章主要介绍了Python 日志管理模块Loguru的用法小结,本篇文章只记录loguru模块的使用,包括简单的用法,以及在多模块和多线程下的使用,需要的朋友可以参考下


  • Python库functools示例详解

    发布:2023-03-09

    Python 的 functools 模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数。换言之,就是能使用该模块对 所有可调用对象( 即 参数 或(和) 返回值 为其他函数的函数 ) 进行处理,这篇文章主要介绍了Python库functools详解,需要的朋友可以参考下


  • Python中文编译的环境:编写程序时如何不乱码?

    发布:2021-05-06

    本篇文章介绍了python编程中的基础如何编写中文与不乱码不报错


  • Python实现基于KNN算法的笔迹识别功能实例代码

    发布:2019-08-02

    这篇文章主要介绍了Python实现基于KNN算法的笔迹识别功能,结合实例形式详细分析了使用KNN算法进行笔迹识别的相关库引入、操作步骤与相关注意事项,需要的朋友可以参考下


  • python射线法检测点是否位于区域外接矩形内检测方法

    发布:2020-04-15

    这篇文章主要为大家详细介绍了python射线法判断检测点是否位于区域外接矩形内,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • Python注释的用法详解

    发布:2019-12-06

    这篇文章主要给大家介绍了关于Python中注释(多行注释和单行注释)用法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面


  • Python实现发送带有pdf附件的电子邮件

    发布:2023-04-04

    使用Python发邮件,是个简单的话题,可是如何可以优雅的轻松的群发邮件,并附加PDF附件,是很多小伙伴的日常工作。本文就来和大家分享一下实现方法,需要的可以参考一下


  • Python中threading.Timer()定时器实现定时任务

    发布:2023-03-08

    本文主要介绍了Python中threading.Timer()定时器实现定时任务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


网友讨论