首先明确合数和质数的概念
合数: 自然数中除了能被 1 和本身整除之外, 还能被其他的数整除的数(4,6,9,10...)
- def heshu(m):
- list_a = []
- for i in range(2,m+1):
- for j in range(2,i):
- if i % j == 0 :
- list_a.append(i) #判断 i 能否被 (2,i) 之间的数整除, 能整除则为合数, 添加到 list 中
- break
- print(list_a)
- heshu(20)
质数: 大于 1 的自然数中除了能被 1 和本身整除之外, 不能被其他的数整除的数(2,3,5,7...)
- def zhishu(m):
- list_a = []
- for i in range(2,m+1):
- flag = 0
- for j in range(2,i):
- if i % j == 0 :
- flag = 1 #若 i 能被 (2,i) 之间的数整除, 将 flag 置为 1, 跳出当前循环
- break
- if flag == 0:
- list_a.append(i) #执行完内层循环后, 若 flag 未被置 1, 则表示 i 为质数, 添加 list
- print(list_a)
- zhishu(20)
- Tips
由于刚开始使用 python, 对其內建函数还暂不了解, 因此在进行代码编写的时候可能会较多的想到 C 的思路, 总感觉代码整体有些臃肿
特别是在写质数函数的时候, i % j == 0 是用来判断合数的, 但我们却要输出质数, 因此想到用 flag 来对合数做标记以达到目的
后来在别处看到使用 filter()函数进行处理的方法, 感觉这才符合 python 优雅的特性嘛
- def zhishu2(num):
- for i in range(2, num):
- if num % i == 0:
- return False
- return True
- new_list = list(filter(zhishu2,range(2,21)))
- print(new_list)
filter()函数使用方法:
接收两个参数, 第一个为函数 f(输出布尔类型), 第二个为序列 ist, 将 list 中的元素依次代入 f 中, 根据函数中的判断条件选择返回 True 或者 False, 最后返回 True 的元素重新组成一个新的 list
当自己使用这个函数的时候, 一开始是想直接打印出来:
- new_list = filter(zhishu2,range(2,21))
- print(new_list)
但是输出却有问题
又仔细看了下该函数的用法, 发现这个 filter 函数输出的应该是组成列表的元素, 而不是直接一个列表, 所以需要再将它转化成列表:
- new_list = list(filter(zhishu2,range(2,21)))
- print(new_list)
这样就能正常的输出了
来源: http://www.bubuko.com/infodetail-2511657.html