2

我正在尝试定义一个函数,该函数将包含一个变量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(),该函数将信用卡号作为字符串作为参数(例如 is valid("49927398716")),并根据该号码是否为有效的信用卡号返回 True 或 False。

4

6 回答 6

4

引号仅用于字符串文字,您不会将变量或参数名称括在引号中以表明它将是一个字符串。函数定义如下所示:

def is_true(n):

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

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

is_true("3884892993")

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

于 2011-10-26T21:02:57.523 回答
1

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

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

    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 社区中普遍使用,您应该遵循它(在某些时候您应该欣赏它)。

于 2011-10-26T21:00:42.223 回答
1

来自关于 Luhn 算法的维基百科文章

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
于 2011-10-26T21:31:43.583 回答
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
于 2011-10-27T14:31:52.980 回答
0

我不知道你的功能应该做什么,但这里有一些评论。

首先,如果定义函数,则使用以下语法

def is_true(n):
    # do something

您可以像这样调用此函数is_true("3884892993"),即您可以将字符串传递为n. 您的函数现在需要将变量n视为字符串。所以你可以使用

number = [int(d) for d in n]

这将导致将字符串转换为数字列表。

还有一点:您在函数中使用了一条return语句。is_true该语句将停止执行函数并返回值。下面的每个代码return都不会被执行。

于 2011-10-26T21:02:27.837 回答
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
于 2011-10-26T21:41:56.637 回答