python - 身份证号码生成器
问题描述
所以基本上我得到了一个任务来创建一个生成器,它将为我的国家的公民生成有效的 ID 号。一个有效的数字是9位,对于每个数字,您需要根据索引将其乘以1或2,如果索引是偶数,则将num乘以1,否则将其乘以2。之后如果窗帘数字变得更大大于 9,将其更改为数字的总和。如果总和 % 10 == 0 则 num 有效。否则为假。
之后,他们希望我创建一个可以生成迭代器的类。在下一个方法中:如果给定的数字有效,则返回并乘以 2 并加 1,然后再次检查是否有效,如果不乘以 2 并加 2,依此类推。如果来自开头的 num 无效,乘以 2 并加 1,然后乘以 2 并加 2,依此类推...
import string
letters = string.ascii_letters
digits = string.digits
class NumNotNineLong(Exception):
def __init__(self):
pass
def __str__(self):
return "The number you provided is not nine digits long."
class NotNumber(Exception):
def __init__(self):
pass
def __str__(self):
return "The input you provided is not an integer"
class IDIterator():
increment = 1
def __init__(self,_id):
self._id = _id
def __iter__(self):
return self
def __next__(self):
while check_id_valid(str(self._id)[-9::]) == False:
self._id *= 2
self._id += IDIterator.increment
IDIterator.increment += 1
if check_id_valid(str(self._id)[-9::]):
result = str(self._id)[-9::]
self._id *= 2
self._id += 1
IDIterator.increment = 2
return result
def check_id_valid(id_number):
for letter in str(id_number):
if letter not in string.digits:
raise NotNumber
numbers = [int(i) for i in str(id_number)]
if len(numbers) != 9:
raise NumNotNineLong
set_numbers = []
for i in range(len(numbers)):
if i % 2 == 0:
set_numbers.append(numbers[i])
else:
set_numbers.append(numbers[i] * 2)
true_numbers = []
for num in set_numbers:
if num > 9:
temp = [int(i) for i in str(num)]
true_numbers.append(sum(temp))
else:
true_numbers.append(num)
if sum(true_numbers) % 10 == 0:
return True
else:
return False
def main():
result = IDIterator(123456780)
for _ in range(10):
print(result.__next__())
if __name__ == "__main__":
main()
我的结果是:
209872373
274495985
097983944
391935780
903409134
227273083
545477432
363819467
910555747
409086964
想要的结果是:
209872373
863664504
569826803
339640302
473959864
544578024
356624288
466187762
040830960
487293938
救救我
谢谢你!
解决方案
我对这个问题的看法:
class IDIterator:
def __init__(self, num):
self.__num = num
def __iter__(self):
n, num = 1, self.__num
while True:
num = int( str(num)[-9:] )
if is_valid(num):
yield '{:0>9}'.format(num)
num *= 2
num += n
n = 1
else:
num *= 2
num += n
n += 1
def is_valid(num):
s = '{:0>9}'.format(num)
if len(s) != 9:
return False
nums = [int(ch) * 2 if i % 2 else int(ch) for i, ch in enumerate(s)]
nums = [sum(int(c) for c in str(n)) for n in nums]
return sum(nums) % 10 == 0
from itertools import islice
for num in islice(IDIterator(123456780), 0, 10):
print(num)
印刷:
209872373
863664504
569826803
339640302
473959864
544578024
356624288
466187762
040830960
487293938
推荐阅读
- intellij-idea - 阻止 Rider 自动选择运行/调试配置
- javascript - 我的 Discord 机器人使用 discord.js 一次发送多条消息
- git - Git:从分支中删除目录而不影响其他分支
- javascript - D3.js 将 realtive 拖动到图形 svg
- python - 用 BeautifulSoup 刮表,如何用换行符分隔元素?
- dart - 在前一个方法完成之前运行的方法,Future Async Dart
- python - 从嵌套列表创建字典
- c# - 更新和扩展枚举 C#
- python - 如何增加神经网络可以识别的图像范围?
- python - 进行模糊匹配时出现 TypeError