使用变量定义函数?

时间:2011-10-26 20:52:52

标签: python string integer digits

我正在尝试定义一个包含变量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 有效的信用卡号码。

6 个答案:

答案 0 :(得分:4)

引号仅用于字符串文字,您不会在引号中包含变量或参数名称以指示它将是字符串。函数定义如下:

def is_true(n):

然后在函数体中使用n来引用调用者传入的值。

要在特定值上调用该函数,请执行以下操作:

is_true("3884892993")

附带建议:考虑功能和变量的更多解释性名称。例如,您的函数似乎可以合理地称为is_valid_card_number

答案 1 :(得分:1)

我不确定你的问题是什么,但是如果你想:

  • 正确定义功能:
    • 注意缩进(这是Python需要的!),
    • 有关函数定义的示例,请参阅here
  • 将字符串变量转换为整数,您可以这样做:

    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