我正在尝试定义一个包含变量n
的函数,其中n
将是一串数字,例如"3884892993"
,函数的定义以is_true(n)
开头,但是如果n将是一个字符串,那么它应该是is_true(n)
然后一旦定义了字符串,我就可以测试函数示例字符串,例如n = "3884892993"
。但是,当我使用is_true(n)
时出现语法错误。而我只是想知道如何用n。
我要定义的整个函数在这里显示:http://oi44.tinypic.com/282i3qo.jpg但请记住我是一个绝对的新手所以很可能会有很多错误,但我很感激一些专家的帮助,如果可能的话:)
def is_valid("n"): #n is the number to be checked.
number =
[int(y) for y in A] #converts the string into a list of useable digits.
altern1 = integer[-2::-2] #sets altern1 as one set of alternating digits.
double = [x*2 for x in altern1] #doubles each element of the list altern1.
sum1 = sum(double) # adds together all the doubled items of the list.
altern2 = integer[-1::-2] #sets altern2 as the other set of alternating digits.
return sum2 = sum(altern2)#sums the other set of alternating digits.
sumtotal = sum1 + sum2 #works out the total sum to be worked with.
for mod = sumtotal % 10: #works out remainder when sumtotal is divided by 10
if mod == 0 : #if remainder is zero sumtotal is a multiple of 10
print 'True' #sumtotal is a multiple of 10 therefore n is a credit card number
else:
print 'False' #sumtotal is NOT a multiple of 10 therefore not a valid credit card number
以下是实际问题:
验证号码的算法如下: (a)从倒数第二个数字开始,朝第一个数字开始,将每个交替数字加倍。 (b)将加倍的数字相加,将13视为1 + 3等,并将结果加到未加倍的总和中 数字 (c)如果总和可以被10整除,则该数字是有效的信用卡号。
编写并测试函数is_valid(),该函数将信用卡号作为参数作为字符串 (例如有效(“49927398716”))并根据数字是否返回True或False 有效的信用卡号码。
答案 0 :(得分:4)
引号仅用于字符串文字,您不会在引号中包含变量或参数名称以指示它将是字符串。函数定义如下:
def is_true(n):
然后在函数体中使用n
来引用调用者传入的值。
要在特定值上调用该函数,请执行以下操作:
is_true("3884892993")
附带建议:考虑功能和变量的更多解释性名称。例如,您的函数似乎可以合理地称为is_valid_card_number
。
答案 1 :(得分:1)
我不确定你的问题是什么,但是如果你想:
将字符串变量转换为整数,您可以这样做:
new_var = int(old_var)
一般来说,请注意类型,因为它与其他动态类型语言不同,并且字符串不会动态转换为数字 - 您应该明确地这样做。
根据名称
读取变量的值my_var = vars().get('variable_name')
(其中variable_name
是变量的名称,您可以选择在vars
之后在括号内提供上下文 - 有关详情,请参阅help(vars)
上述任何一项是否解决了您的问题?
编辑(基于澄清):
这可以解决您的问题:
def is_true(my_variable):
# Here the variable named "my_variable" is accessible
如果你想在传递的变量上“就地”做一些事情,我有一个坏消息:字符串和整数在Python中是不可变的,因此你无法简单地改变它们 - 你可能应该返回它们作为函数的结果(至少有两个解决方法,但如果你是Python的新手,我不推荐它们。)
编辑(正确的代码样式):
你应该阅读PEP 8以熟悉Python脚本的编码标准 - 这通常在Python社区中使用,你应该遵循它(在某些时候你应该欣赏它)。
答案 2 :(得分:1)
来自Wikipedia article on the Luhn algorithm:
def is_luhn_valid(cc):
num = map(int, str(cc))
return sum(num[::-2] + [sum(divmod(d * 2, 10)) for d in num[-2::-2]]) % 10 == 0
答案 3 :(得分:0)
我不知道你的功能应该做什么,但这里有一些评论。
首先,如果您定义该函数,则使用以下语法
def is_true(n):
# do something
您可以像is_true("3884892993")
一样调用此函数,即您可以将字符串作为n
传递。您的函数现在需要将变量n
视为字符串。所以你可以使用
number = [int(d) for d in n]
将导致将字符串转换为数字列表。
还有一句话:您在return
函数中使用了is_true
语句。该语句将停止执行该函数并返回该值。 return
以下的每个代码都不会被执行。
答案 4 :(得分:0)
可能是这样的。我留下你的意见
def is_valid(n): #n is the number to be checked.
numbers = [int(y) for y in n] #converts the string into a list of useable digits.
double_alt = [sum([int(i) for i in str(x*2)]) for x in numbers[-2::-2]] #doubles and sum if more than 10each element of the list altern1.
sum1 = sum(double_alt) # adds together all the doubled items of the list.
sum2 = sum(numbers[-1::-2]) #sums the other set of alternating digits.
sumtotal = sum1 + sum2 #works out the total sum to be worked with.
return not sumtotal % 10
答案 5 :(得分:0)
这是我最近必须制作的luhn算法的实现。
def is_valid_luhn(cc):
return not sum([sum(divmod(int(d) * 2, 10)) for d in cc[-2::-2]] + [int(d) for d in cc[-1::-2]]) % 10
# | double | |--- every -2th --| |--- every -1th --|
# |--------- step 1 -----------------|
# |------------- sum doubled digits --------------| |-- sum undoubled digits --|
# |---------------------- step 2: sum doubled/undoubled digits -----------------------|
# |-------------------------- step 3: sum % 10 == 0 --> not sum % 10 --------------------------|
或者,如果你想要一个更详细的版本:
def is_valid_luhn(cc):
total = 0
# Double and sum every 2nd digit starting at -2.
for d in cc[-2::-2]:
# divmod(d*2, 10) returns (d*2 // 10, d*2 % 10)
# sum(divmod) return (d*2 // 10) + (d*2 % 10)
total += sum(divmod(int(d) * 2, 10))
# Sum every 2nd digit starting at -1.
for d in cc[-1::-2]:
total += int(d)
# Check module 10 of total: total % 10 == 0 --> not total % 10
return not total % 10