完整代码如下:因为注释已经足够多足够啰嗦,我的思路都在注释里看的清楚。
1、定义查询素数的函数,两个参数,都定义了格式,其中一个是默认参数。因此,实参输入1个(此时有默认参数),或者2个(此时自动将实参传递给默认参数),函数都能处理。
2、调用函数实参输入为floa数的时候,代码格式检查并不会报错误。由于函数内已使用if对float实参取整处理了,实参输入float也能正常处理,如果注释掉取整功能,检查不报错,运行结果报错。
3、一些简单的异常我用if处理了,就没有使用try来处理异常(大材小用)。其中一点,当实参输入为str格式的数字比如‘3’,或者用input()函数输入的数字,本例并没有做异常处理,可以把形参定义int去掉,再取整的if放到第一个判断就可以。int()也同时把数据类型转为int,但是这样向上向下取整就不一定了。有兴趣的可以自己研究。
# 3、定义一个查询素数的函数
def func_test3(prime_n: int, prime_m=2):
'''优化方法,查询指定范围内的所有素数
内层定义一个嵌套函数,为以后学习高级用法如装饰器、闭包等功能的练习先创建一个基础函数模型。
'''
prime_list = [] # 定义空列表,用于存放找到的素数
def isprime(num):
''' 定义一个嵌套函数,判断一个数是否素数
这里遍历了2至num的算术平方根,其实遍历了2就不需要遍历2的倍数(4,6,8...)
遍历3同理,所以,只需要遍历比算术平方根小的素数,后续还可以优化算法。
'''
i = 2 # 定义i = 2,从2开始遍历判断是否是num的约数
for i in range(2, int(num ** 0.5) + 1): # 遍历2到num的算术平方根,判断能否整除。
if num % i == 0: # %取模 - 返回除法的余数,余数为0则表示能i整除。
break # 能被i整除,则num不是素数,break跳出本次循环,break跳出不会执行else
else: # for...else语句,只有for正常结束(此时条件为False),else的代码才会被执行一次。
return True # for循环正常结束,num为素数,执行一次else,返回True
# 这里使用多个if,目的是更方便的处理一些常见异常,简单异常不想用try...except来处理。
if prime_m > prime_n: # 判断大小,小的在前,若小的在后,则互换值,以便于后续for循环
prime_m, prime_n = prime_n, prime_m # python独有的变量互换语句
if prime_m < 2:
print(f'2是最小的素数,给的的数字或者范围界限{prime_m}小于2,默认将其转化为2再查询')
prime_m = 2
if not isinstance(prime_m, int) or not isinstance(prime_n, int):
print('素数范围指在大于1的自然数中,浮点数默认取整转化为整数再查询')
prime_m, prime_n = int(prime_m), int(prime_n) + 1
# 经前面处理m和n已大于0,int()是向0取整,相当向下取整.大的数字+1就相当向上取整了
# 已知正负那在这里简单处理就不需要调用math库的向上取整方法math.ceil()。
for i in range(prime_m, prime_n+1): # 创建循环,查询m到n的范围的数是否素数
if isprime(i): # 调用isprime()函数判断是否素数
prime_list.append(i) # 如果是素数,添加到prime_list列表中
print(f'{prime_m}至{prime_n}之间的素数列表:\n{prime_list}', sep='')
return prime_list