if choice == '1':
print('Your card has been created')
card = create_card()
print(f'Your card number:\n{card}')
pin = int(''.join(f'{random.randint(0, 9)}' for _ in range(4)))
print(f'Your card PIN:\n{pin}\n')
cards.append([card, pin])
请有人解释一下,为什么上面的代码有时会生成一个3位数字,而不是4位数字?例如:
发布于 2020-07-19 18:50:16
在您的逻辑中,可以生成一个以0
开头的字符串。如果将前导0数字字符串传递给int()
,则忽略前导0:
print(int("0999"))
输出
999
要解决这个问题,只需更改范围开始值即可。
pin = int(''.join(f'{random.randint(1, 9)}' for _ in range(4)))
编辑:为了向自己证明这一点,请打印生成的字符串和int()
函数的结果,如下所示。
for i in range(100):
st = ''.join(f'{random.randint(0, 9)}' for _ in range(4))
print(st, int(st))
发布于 2020-07-19 19:02:14
其他人解释了为什么你有时会得到三位数(甚至两位数甚至一位数)的结果。您可以将此视为格式问题--打印带前导零到指定宽度的数字。Python确实有支持这一功能的特性。
但我敦促大家认识到,问题确实在于,数据实际上并不是一个数字。相反,它是一串数字,所有这些数字都是重要的。那么,最简单和最好的方法就是简单地将保持为字符串,而不是将其转换为数字。
发布于 2020-07-19 18:48:39
随机生成器有时不会返回四位数,因为它将零作为第一个数字。像0322这样的数字是由随机生成器创建的,并且它正在被转换为322。由于前面的零,这个生成器还可以生成两位数和一位数.如果你想要四位数的数字,只使用pin = random.randint(1000, 9999)
。如果您想要带前导零的数字,请使用pin = ''.join(f'{random.randint(0, 1)}' for _ in range(4))
。这就保持了前导零。保持引脚为字符串阻止前导零被移除。
https://stackoverflow.com/questions/62987871
复制