我需要的免费在线Python教程:
编写一个检查给定信用卡号是否正常的函数 有效。函数
check(S)
应该使用字符串S
作为输入。第一, 如果字符串不遵循"#### #### #### ####"
格式 每个#
都是一个数字,然后它应该返回False
。然后,如果总和 数字可以被10
整除(“校验和”方法),然后是 过程应返回True
,否则应返回False
。对于 例如,如果S
是字符串"9384 3495 3297 0123"
,那么尽管如此 格式正确,数字总和为72
,因此您应该返回False
。
以下显示了我的想法。我认为我的逻辑是正确的,但不太明白为什么它给了我错误的价值。我的代码中是否存在结构问题,或者我使用的方法是否错误?
def check(S):
if len(S) != 19 and S[4] != '' and S[9] != '' and S[14] != '':
return False # checking if the format is correct
S = S.replace(" ",'') # Taking away spaces in the string
if not S.isdigit():
return False # checking that the string has only numbers
L = []
for i in S:
i = int(i) # Making a list out of the string and converting each character to an integer so that it the list can be summed
L.append(i)
if sum(L)//10 != 0: # checking to see if the sum of the list is divisible by 10
return False
答案 0 :(得分:5)
你没有测试空格,只测试空字符串,在python字符串上使用直接索引时你永远不会找到它。
此外,如果这四个条件中的任何一个为真,你应该返回False
,而不是如果它们 all 同时为真:
if len(S) != 19 or S[4] != ' ' or S[9] != ' ' or S[14] != ' ':
return False
接下来,替换空格,但不要再检查长度。如果我给你19个空格怎么办:
S = S.replace(" ", '')
if len(S) != 16 or not S.isdigit():
return False
最后,您要首先收集所有数字,并检查是否有余数:
L = map(int, S) # makes S into a sequence of integers in one step
if sum(L) % 10 != 0: # % calculates the remainder, which should be 0
return False
如果所有这些测试都已通过,请不要忘记返回True:
return True
最后。
把所有这些放在一起,你得到:
>>> def check(S):
... if len(S) != 19 or S[4] != ' ' or S[9] != ' ' or S[14] != ' ':
... return False
... S = S.replace(" ", '')
... if len(S) != 16 or not S.isdigit():
... return False
... L = map(int, S) # makes S into a sequence of integers in one step
... if sum(L) % 10 != 0: # % calculates the remainder, which should be 0
... return False
... return True
...
>>> check('9384 3495 3297 0123')
False
>>> check('9384 3495 3297 0121')
True
答案 1 :(得分:3)
这是一个基于正则表达式的方法:
import re
def cc(pat):
# check for the pattern #### #### #### #### with each '#' being a digit
m=re.match(r'(\d{4})\s(\d{4})\s(\d{4})\s(\d{4})$', pat.strip())
if not m:
return False
# join all the digits in the 4 groups matched,
# turn into a list of ints,
# sum and
# return True/False if divisible by 10:
return sum(int(c) for c in ''.join(m.groups()))%10==0
>>> cc('9384 3495 3297 0123')
False
>>> cc('9384 3495 3297 0121')
True
答案 2 :(得分:1)
这是我的方法,它是一个更长的代码,但我喜欢使用定义函数。由于某些原因,代码在计算机科学圈网站上不起作用,但它适用于PyCharm程序。
def CardNumber():
global card # Making variable global for function SumCardNumDigits(); see below
card = input() # Credit card number is entered
return card
def check(S):
CardNumber = S
SplitCardNum = CardNumber.split() # Split credit card number into a list, so we get [####, ####, ####, ####]
for i in range(0, len(SplitCardNum)): # Checking if each item in list has length of four strings and each item is
# an actual a number
if len(SplitCardNum[i]) == 4 and SplitCardNum[i].isdigit():
SplitCardNum.insert(i, True) # We add to a list a True value at position i
del SplitCardNum[i + 1] # We delete items at position i + 1
return SplitCardNum
def checkFormat(SplitCardNum):
if SplitCardNum == [True] * 4: # Checking if all above conditions are met in function check(S)
# So the returned value from previous function is a list [True, True, True, True]
return True
else:
return False
def SumCardNumDigits():
Ncard = card # Using global variable 'card' from function CardNumber()
SumN = 0
for i in Ncard: # Summing up all digits in string 'Ncard', if i position in a string is empty space " "
# we skip a step.
if i == " ":
continue
else:
SumN += int(i)
return SumN
def DivideByTen(SplitCardNum):
if SplitCardNum == True: # If conditions from function check(S) are met, we divide the sum of digits
# of credit card number by 10
SumNumber = SumCardNumDigits() % 10 # We do this by using the returned value of function SumCardNumDigits()
global SumNumber # <--- Fixed code
return SumNumber
else:
return False
def IsDivideByTen(SumNumber):
check = checkFormat(SplitCardNum) # Finally we check if the sum of digits of credit card number is divisible by 10
if SumNumber == 0 and check == True: # <--- Fixed code
return True
else:
return False
print(IsDivideByTen(DivideByTen(checkFormat(check(CardNumber()))))) # Output final result
# You can test this code at: http://cscircles.cemc.uwaterloo.ca/visualize/#mode=edit and see how it works.
# Try for '9384 3495 3297 4523' and '9384 3495 3297 4526'