yjptx121 发表于 2020-4-1 18:57:03

第49课生成器的课后题

# 10以内的素数之和是:2+3+5+7=17,那么请编写程序,计算2000000以内的素数之和?
import math

def is_prime(number):                                             # 定义一个判断是否为素数的函数
    if number > 1:                                                # 如果形参大于1
      if number == 2:                                             # 如果形参等于2
            return True                                             # 返回结果为真(2为素数),跳过后续循环
      if number % 2 == 0:                                       # 如果形参除2取余为0(不为素数),能被2整除肯定不是素数
            return False                                          # 返回结果为假,跳过后续循环
      # 不满足以上两个if循环则会进入for循环
      for current in range(3, int(math.sqrt(number) + 1), 2):   # current(当前的)属于range循环2-->number开平方加1-->step为2
            if number % current == 0:                               # 如果current能被number整除
                return False                                        # 返回假(因为一个数最多能被自身的一半整除
      return True                                                 # 如果以上条件都不符合,则返回True(即为素数)
    return False                                                    # 小于等于1的数均为假

def get_primes(number):                                             # 定义一个获取素数的函数
    while True:                                                   # 设定循环条件永远为真
      if is_prime(number):                                        # 如果判断函数is_prime(number)为真
            yield number                                          # 那么生成一个number值
      number += 1                                                 # 同时number值加1

def solve():                                                      # 定义一个解答函数
    total = 2                                                       # 设置局部变量total的值为2
    for next_prime in get_primes(3):
# 问题1:个人理解为get_primes(3)是一个从3开始指向正无穷的素数生成器,for循环从is_prime(3)开始,且next_prime的值属于这个生成器
      if next_prime < 20000:                                    # 如果next_prime小于2000000(生成的数字小于20000)
            total += next_prime                                     # 局部变量total重新赋值为自身与next_prime的和
      else:                                                       #
            print(total)                                          # next_prime大于20000时,输出total的值
            return
# 问题2:这里return后面为什么不接参数??

if __name__ == '__main__':
    solve()


以上两个问题请大佬指教

zltzlt 发表于 2020-4-1 19:07:04

1. 你的理解是正确的

2. 因为不需要返回任何内容

yjptx121 发表于 2020-4-1 19:18:53

zltzlt 发表于 2020-4-1 19:07
1. 你的理解是正确的

2. 因为不需要返回任何内容

我试过 ,如果不写return,就会一直输出计算后的值, 如果直接rerurn total,则返回空值,这是为什么呢

zltzlt 发表于 2020-4-1 19:43:42

yjptx121 发表于 2020-4-1 19:18
我试过 ,如果不写return,就会一直输出计算后的值, 如果直接rerurn total,则返回空值,这是为什么呢

如果写 return total,那应该这样写:

if __name__ == '__main__':
    print(solve())

因为 solve() 函数有返回值。

yjptx121 发表于 2020-4-1 19:59:01

zltzlt 发表于 2020-4-1 19:43
如果写 return total,那应该这样写:




多谢 !!明白了

zhangfeiwen 发表于 2020-10-6 11:42:54

插个眼
页: [1]
查看完整版本: 第49课生成器的课后题