lazyend 发表于 2020-5-20 11:44:47

谁能告诉我为什么这个代码可以yield 3

import math

def is_prime(number):
    if number > 1:
      if number == 2:
            return True
      if number % 2 == 0:
            return False
      for current in range(3, int(math.sqrt(number) + 1), 2):
            if number % current == 0:
                return False
      return True
    return False

def get_primes(number):
    while True:
      if is_prime(number):
            yield number
      number += 1

def solve():
    total = 2
    for next_prime in get_primes(3):
      if next_prime < 2000000:
            total += next_prime
      else:
            print(total)
            return

if __name__ == '__main__':
    solve()

看了小甲鱼写的代码 我一直搞不明白 为什么 if is_prime(3)这个地方 还可以yield 3出来 因为 在函数里面3%3已经==0了 不是false吗? 为啥还能Yield 3哪个大神给我解释一下

永恒的蓝色梦想 发表于 2020-5-20 11:51:02

我一直搞不懂为什么你觉得这段代码在 number 为 3 时会执行。      for current in range(3, int(math.sqrt(number) + 1), 2):
            if number % current == 0:
                return False这个 range 在 number 为 3 时是 range(3,2,2)

lazyend 发表于 2020-5-20 11:55:44

永恒的蓝色梦想 发表于 2020-5-20 11:51
我一直搞不懂为什么你觉得这段代码在 number 为 3 时会执行。这个 range 在 number 为 3 时是 range(3,2,2)

非常感谢 现在明白了   

Hoiste 发表于 2020-5-20 11:57:44

事实上range(3, int(math.sqrt(number) + 1), 2)在number为3的情况下等价于range(3,2,2)并不会在for循环遍历这个列表的时候得到一个空值就没了,不会达到3这个值,所以不会出现3%3的计算,所以不满足return False的条件,返回的自然就是True

lazyend 发表于 2020-5-21 05:43:39

Hoiste 发表于 2020-5-20 11:57
事实上range(3, int(math.sqrt(number) + 1), 2)在number为3的情况下等价于range(3,2,2)并不会在for循环遍 ...

感谢解惑 ~
页: [1]
查看完整版本: 谁能告诉我为什么这个代码可以yield 3