【问题标题】:Generator not creating any output in Python生成器没有在 Python 中创建任何输出
【发布时间】:2020-10-03 03:03:00
【问题描述】:

我正在尝试使用以下生成器,但它没有产生任何输出。想法?谢谢

def generate_numbers(number):
"""To generate numbers"""
for i in range(number):
    ratings = []
    for j in categories:
        ratings.append(random.randint(0, 5))
    score = list(zip(categories, ratings))
    filtered_score = (s for s in score if s[1] != 0)
    yield filtered_score

【问题讨论】:

  • 欢迎来到 SO!这在某些方面很奇怪,其中之一是它在构建ratings 之前做了很多工作,这似乎是不必要的,违背了生成器的目的。其次,您确定要返回嵌套生成器吗?你到底想完成什么,你怎么称呼它?我得到了输出,但当然它是一堆需要从中产生的生成器对象。我猜你的意思是return filtered_score 并用print(list(generate_numbers(10))) 调用它,但我不能确定。

标签: python output generator


【解决方案1】:

您需要生成最终过滤集中的每个条目。

试试这个代码:

import random

def generate_numbers(number):
    """To generate numbers"""
    categories = ['a','b','c','d','e']
    for i in range(number):
        ratings = []
        for j in categories:
            ratings.append(random.randint(0, 5))
        score = list(zip(categories, ratings))
        for fs in (s for s in score if s[1] != 0):
            yield fs
        
for x in generate_numbers(3):
    print(x)

输出

('a', 4)
('c', 1)
('d', 4)
('e', 4)
('a', 2)
('b', 3)
('c', 4)
('d', 3)
('e', 1)
('b', 1)
('c', 4)
('d', 4)

【讨论】:

    【解决方案2】:

    问题是:您返回的是生成器对象,而不是值。

    有几种不同的方法可以解决此问题。两个直截了当的

    1. 在调用函数中,使用两个循环而不是一个(对应于函数中使用的两个)。

      for x in generate_numbers(5):
        for y in x:
          print(y)
      
    2. 在函数中更改倒数第二行,以便创建list 或其他东西而不是生成器

      filtered_score = [s for s in score if s[1] != 0] # notice the use of square brackets
      

    附:使用这两种方法中的任何一种,不要同时使用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 2018-11-21
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多