8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

python3 中可选的 Yield 或 Return。如何使用?

twoleggedhorse 1月前

23 0

我想要一个可以选择返回或产生结果的函数。这是一个例子。def f(option = True):... for ...:if option:yield result el ...

我想要一个可以选择返回或产生结果的函数。这是一个例子。

def f(option=True):
    ...
    for...:
        if option:
            yield result
        else:
            results.append(result)

    if not option:
        return results

当然,这是行不通的,我已经尝试使用 python3,无论我设置了什么选项值,我总是得到一个生成器。据我所知,python 会检查函数的主体,如果存在 yield ,那么结果将是一个生成器。有没有办法解决这个问题,并创建一个可以随意返回或产生的函数?

帖子版权声明 1、本帖标题:python3 中可选的 Yield 或 Return。如何使用?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由twoleggedhorse在本站《python》版块原创发布, 转载请注明出处!
最新回复 (0)
  • class 基于方法

    class FunctionAndGenerator:
        def __init__(self):
            self.counter = 0
            
        def __iter__(self):
            return self
            
    
    # You need a variable to indicate if dunder next should return the string or raise StopIteration. 
    # Raising StopIteration will stop the loop from iterating more.
    # You'll have to teach next to raise StopIteration at some point
    
        def __next__(self):
            self.counter += 1 
            if self.counter > 1 :
                raise StopIteration 
            return f"I'm a generator and I've generated {self.counter} times"        
    
        def __call__(self):
            return "I'm a function"
            
    x = FunctionAndGenerator()
    print(x())
        
    for i in x:
        print(i)
    
    I'm a function
    I'm a generator and I've generated 1 times
    
    [Program finished] 
    
  • @alec_djinn:因为您在编辑评论之前发布的内容表明您返回的是曾经产生的唯一值。在生成器上使用 next() 将访问该值。

  • @MartijnPieters 不是,你为什么认为我应该使用 next() 呢?我正在用最终解决方案更新帖子,以便您可以对其进行评论...

  • @alec_djinn:您确实意识到我提出的 next(generator()) 选项正是这样做的,对吗?

  • 按照我的要求工作!谢谢。一个小修改,应该是 return f() / return g() (带括号)

  • slav 1月前 0 只看Ta
    引用 7

    这是一个有趣的想法……它并不像我希望的那样简洁,但它确实允许我通过简单地更改“选项”随意获得“回报”和“收益”。我正在测试它……

  • 那这个呢?

    def make_f_or_generator(option):
        def f():
            return "I am a function."
        def g():
            yield "I am a generator."
        if option:
            return f
        else:
            return g
    

    这至少为您提供了创建函数或生成器的选择。

  • 你不能。 任何 使用 yield 都会使该函数成为生成器。

    您可以使用一个函数来包装您的函数,该函数用于将 list() 生成器生成的所有值存储在列表对象中并返回该值:

    def f_wrapper(option=True):
        gen = f()
        if option:
            return gen    # return the generator unchanged
        return list(gen)  # return all values of the generator as a list
    

    但是,一般来说,这是 糟糕的设计 。不要让你的函数像这样改变行为;坚持一种返回类型(生成器对象),不要让它在两者之间切换。

    考虑将其拆分为两个函数:

    def f():
        yield result
    
    def f_as_list():
        return list(f())
    

    如果您需要生成器或者 f() 想要一个列表, f_as_list() 请使用其中任意一种

    由于 list() 、(以及 next() 仅访问生成器的一个值)是内置函数,因此您很少需要使用包装器。只需直接调用这些函数即可:

    # access elements one by one
    gen = f()
    one_value = next(gen)
    
    # convert the generator to a list
    all_values = list(f())
    
  • 我有一个从文件中提取数据的函数,大多数时候我需要将数据作为列表,但有时(例如在文件很大的情况下)此函数的生成器版本可能会有用。当然,我可以迭代生成器并创建一个列表,但我真的更愿意只添加一些额外的功能。如果我只产生一次,它只会给我列表中的一个项目,而不是整个列表,这不是我想要的

返回
作者最近主题: