Python语法糖之all和any函数


本博客主要参考为北京大学陈斌老师的下一站Python

image

“全称”和“存在”的定义

  • 全称:所有的逻辑表达式都为True,才为True;
    • 只要有一个为False,即为False。
  • 存在:任意一个逻辑表达式为True,就为True;
    • 所有都是False,才为False。
  • all函数,以一个可迭代对象为参数
    • 迭代到第一个False,即返回False;
    • 迭代结束,返回True。
  • any函数,以一个可迭代对象为参数
    • 迭代到第一个True,即返回True;
    • 迭代结束,返回False。

example1

# 掷骰子,连续三次,看看三次全6,
#   和三次至少1个6的概率分别是多少?
from random import randint
n, triple, once = 10000, 0, 0
for i in range(n):
    bet = [randint(1, 6) for k in range(3)]
    if all(x==6 for x in bet):
        triple += 1
    if any(x==6 for x in bet):
        once += 1
print(f"投掷{n}次")
print(f"--三次6为{triple}次,占比{triple/n*100:.1f}%;")
print(f"--至少一次6为{once}次,占比{once/n*100:.1f}%。")

“短路”特性

  • 对于all函数,只要碰到第一个False,就返回False;
  • 对于any函数,只要碰到第一个True,就返回True;
  • 结合生成器推导式的“惰性计算”特点,可以提高程序性能。
# 超级素数:一个数所有的前缀都是素数
# 如:2333是超级素数,因为2,23,233,2333都是素数
def is_prime(n):
    if n < 2:
        return False
    for k in range(2, int(n ** 0.5) + 1):
        if n % k == 0:
            return False
    return True
def is_super_prime(n):
    sn = str(n)
    return all(is_prime(int(sn[: i + 1])) for i in range(len(sn)))
print(2333, is_super_prime(2333))
print(111, is_super_prime(111))

example2

# 列表中是否存在指定值t,如果存在则返回下标
from random import randint
alist = [randint(1, 100) for i in range(50)]
has_42 = any(alist[(k := i)]==42 for i in range(50))
if has_42:
    print(f"Yes, index=={k}")
else:
    print("No")
posted @ 2022-11-15 08:26  Cisco_coco  阅读(159)  评论(0编辑  收藏  举报