自学python之2:利用嵌套函数,for循环查找素数。利用if做了异常处理

完整代码如下:因为注释已经足够多足够啰嗦,我的思路都在注释里看的清楚。

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值