首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为Python中类似于“筛选器”的行为设计控制流?

如何为Python中类似于“筛选器”的行为设计控制流?
EN

Stack Overflow用户
提问于 2018-03-07 06:08:55
回答 2查看 69关注 0票数 1

假设有一种函数返回一些值或None,我们有三个这样的函数:egghamspam

目标是调用egghamspam并返回返回的第一个非无值,如果没有有效值返回,则返回None

最直接的办法是:

代码语言:javascript
运行
复制
def func():
    ret = egg()
    if ret:
        return ret
    ret = ham()
    if ret:
        return ret
    ret = spam()
    if ret:
        return ret
    return None

或者,一个更聪明但可能更难理解的解决方案是:

代码语言:javascript
运行
复制
def func():
    return egg() or ham() or spam()

以下是我的问题(可能需要调用三个以上的候选函数):

  1. 第二条路很难读懂,应该避免吗?
  2. 是否有更好的方法来设计这样的控制流程?我记得Lisp中有一些东西确实做到了这一点,但是Python中有什么呢?
EN

回答 2

Stack Overflow用户

发布于 2018-03-07 13:36:56

由于这一要求非常类似于内置的any(),所以我将编写:

代码语言:javascript
运行
复制
def anyval(iterable):
    r = None
    for r in iterable:
        if callable(r):
            r = r()
        if r != None:
            break
    return r


def foo():
    return None

def bar():
    return 0

def baz(x):
    return x * 3.14

print(anyval([None,foo,bar]))
print(anyval([None,lambda: baz(3.14)]))
票数 0
EN

Stack Overflow用户

发布于 2018-03-07 14:56:24

类似于:

代码语言:javascript
运行
复制
def sifter():
  funcs = [eggs, ham, spam]
  result = None
  while funcs and result is None:
    result = funcs.pop(0)()
  return result

一个小小的解释:假设所有要运行的函数都不接受参数,那么while funcs and result is None位可以确保有更多的函数可以尝试,而当前的结果仍然是零。在while循环中,我们:

  1. 从函数funcs.pop(0)列表中弹出第一项。(功能的列表就会松开这个函数)
  2. 调用波普函数()
  3. 将函数调用返回的内容分配给名称result =

为下一个循环做好准备,通过while语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49145235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档