Python代码不产生任何输出。这里使用发电机正确吗?

时间:2018-12-31 18:02:57

标签: python

所以我重新创建了eratosthenes的筛子,但是结果(素数)没有按我的预期输出。

第一个功能是筛子,该筛子返回一个字典,其中包含一个给定范围内的所有整数作为键,并且将True或False作为其值(有无素数)。此后,生成器应该获取所有值为True(质数)的密钥。我认为问题是我没有正确使用生成器(我刚刚了解了生成器),但是我无法发现错误。

from math import sqrt

def sieve(x):
    values = {}
    for l in range(2, x + 1):
        values[l] = True
    for k in range(2, int(sqrt(x)) + 1):
        if values[k] == True:
            for j in range(k**2, x + 1, k):
                values[j] = False
    return values

def primes(dict1):
    for l in dict1:
        if l == True:
            yield list(dict1.keys())[l]

for k in primes(sieve(int(input()))):
    print(k, end = " ")

我希望所有素数(词典中值为True的键)都将被打印。但是没有任何输出。

3 个答案:

答案 0 :(得分:0)

这是更正后的版本,您可以在其中使用items()在字典键和值上进行迭代来直接访问它们。我对代码做了一些更改:

  • 将用户输入存储在名为number

  • 的变量中
  • 通过遍历dict1.items()

  • 直接访问键和值
  • 第2点简化了原始代码中yield的表达。

  • if l == True:可以简单地替换为if value:


from math import sqrt

def sieve(x):
    # function body here 

def primes(dict1):
    for key, value in dict1.items(): # <--- Directly access keys and values
        if value:
            yield key
number = int(input())

for k in primes(sieve(number)):
    print(k, end = " ")

# 15
# 2 3 5 7 11 13 

答案 1 :(得分:0)

Map<Integer, Integer> testMap = new HashMap<>(); 遍历字典的,并且比较for l in dict1期望。例如,您可以通过使用if l==True遍历键和值来解决此问题:

items

一些不相关的注释:

  • 您可能想使用布尔值列表(甚至是array)来存储筛分数据。使用键为连续数字的字典很浪费。

  • 在测试布尔值时,请使用for n, isprime in dict1.items(): if isprime: yield n 而不是if x。对于if x == True以外的真实值,例如1或非空容器,后者将给出错误的答案。 (要测试True是否为假,请使用x。)

答案 2 :(得分:0)

使用for l in dict1对字典进行迭代会产生,而不是 values

因此if l == True永远都不是。