Python “如何调试TypeError”;没有属性“获取项目”吗;?

Python “如何调试TypeError”;没有属性“获取项目”吗;?,python,algorithm,numbers,Python,Algorithm,Numbers,我在使用python编写代码时遇到了一些困难。我想创建一个代码来检查信用卡号码是否有效。但它一直在向我传达这样的信息: Traceback (most recent call last): File "C:\Users\George\Desktop\FRONTISTHRIAKH ASKHSH 6.py", line 14, in <module> if int(x[0][0])>4 and int(x[0][0])<7: TypeError: 'builtin

我在使用python编写代码时遇到了一些困难。我想创建一个代码来检查信用卡号码是否有效。但它一直在向我传达这样的信息:

Traceback (most recent call last):
  File "C:\Users\George\Desktop\FRONTISTHRIAKH ASKHSH 6.py", line 14, in <module>
    if int(x[0][0])>4 and int(x[0][0])<7:
TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'
回溯(最近一次呼叫最后一次):
文件“C:\Users\George\Desktop\FRONTISTHRIAKH ASKHSH 6.py”,第14行,在
如果int(x[0][0])>4和int(x[0][0])4和int(x[0][0])16:
打印错误
其他:
a=[int(x[0][0])、int(x[0][1])、int(x[0][2])、int(x[0][3])、int(x[0][4])、int(x[0][5])、int(x[0][6])、int(x[0][7])、int(x[0][8])、int(x[0][9])、int(x[0][10])、int(x[0][11])、int(x[0][12])、int(x[0][13])、int(x[0][14])]
对于范围(0,14,2)内的i:
a[i]=2*a[i]
如果a[i]/10=0:
a[i]=a[i]/10+a[i]%10
对于范围(15)内的i:
s=s+a[i]
如果s%10==0:
打印真实
其他:
打印错误
其他:
如果len(x[0])>16:
打印错误
其他:
a=[int(x[0][0])、int(x[0][1])、int(x[0][2])、int(x[0][3])、int(x[0][4])、int(x[0][5])、int(x[0][6])、int(x[0][7])、int(x[0][8])、int(x[0][9])、int(x[0][10])、int(x[0][11])、int(x[0][12])、int(x[0][13])、int(x[0][14])]
对于范围(0,14,2)内的i:
a[i]=2*a[i]
如果a[i]/10=0:
a[i]=a[i]/10+a[i]%10
对于范围(15)内的i:
s=s+a[i]
如果s%10==0:
打印真实
其他:
打印错误
其他:
打印错误
n=原始输入
您对
原始输入的第二次调用不调用以下函数:

n=raw_input
应该是

n=raw_input()

假设您的
原始输入是一个信用卡号:

n == "1234567891234567"
然后
x=[n]
给你

x == ["1234567891234567"]
这不是很有帮助;您想要
x=list(n)

这就是为什么您必须一直使用
x[0]
来完成任何事情

此外,由于对标点符号的处理,在
if:else:
结构中有一整块代码被复制。您可以使用以下方法将字符串转换为仅包含数字的列表:

l = [int(c) for c in s if c.isdigit()]
它既可以删除任何标点符号,又可以将所有内容都设置为整数,从而节省您的(不是非常优雅的)一行代码

把它放在一起,我将把实际测试分离成一个函数(这允许您在其他上下文中以编程方式使用它):


您的代码有各种问题。例如,将输入字符串转换为数组
x
,随后仅使用其中的
x[0]
。这很令人困惑。此外,在确定字符串中的字符是十进制数字之前,不应调用
int
。如果对非数字调用int,将引发异常。你不应该用空格或破折号来考虑字符串,也不需要两个单独的案例,因为核心算法是相同的。 我已经将核心算法提取到一个单独的函数中,您可以对输入字符串调用该函数。输入应该是直接的用户输入,因此由于各种原因可能是无效的信用卡号。如果测试通过,函数返回
None
,否则返回描述错误类型的信息字符串

代码执行各种步骤:首先“净化”字符串,使其仅包含数字。如果用户使用空格或破折号格式化字符串,则无论其位置如何,这些都是strippe。(字母和其他非数字也被剥离,这是不幸的;捕捉这些杂草会进一步消除用户错误。)接下来,函数检查正确的长度并应用Luhn算法:

def invalid_credit_card_number(s):
    """ Returns None if s is a valid credit card number
        and a string describing the error otherwise.
        The string may contains non-digits, which are ignored.
    """

    # strip dashes from string and convert to list of digits    
    dig = [int(x) for x in list(s) if "0" <= x <= "9"]

    if len(dig) != 16:
        return "Invalid length"

    if dig[0] < 5 and dig[0] > 6:
        return "Invalid initial digit"

    # multiply and cast out nines for every other digit   
    for i in range(0, 16, 2):
        dig[i] *= 2
        if dig[i] > 9:
            dig[i] -= 9

    # calculate checksum            
    s = (9 * sum(dig)) % 10

    if s != 0:
        return "Invalid checksum"

    return None
def无效的信用卡号:
“”“如果s是有效的信用卡号,则返回None
以及描述错误的字符串。
字符串可能包含被忽略的非数字。
"""
#从字符串中删除破折号并转换为数字列表
如果“0”9:
dig[i]=9
#计算校验和
s=(9*总和(dig))%10
如果s!=0:
返回“无效校验和”
一无所获

请注意,示例代码是Python的。

1.代码不完整2.示例中的输入是什么?3.您应该给出一些上下文:什么是有效的信用卡号?----无论如何,
n
似乎是一个简单的数组,您尝试将其用作2D数组。您的代码非常难读。请将其分解为有意义的函数并使用更好的变量名。如果插入
print(键入(x))会显示什么
在第13行和第14行之间?谢谢你的评论,但这不是我现在的主要问题。@GeorgeDavidKing:是的。这就是你给出错误消息的原因。添加括号时,错误消息消失。@Maximelrant这是错误出现的地方,但Lennart关于导致错误的地方是正确的。If
n=raw_input
,然后是
x[0]==raw_input
x[0][0]==raw_input[0]
,因此出现错误。当
n
是字符串时,
x[0][0]
是其第一个字符。
l = [int(c) for c in s if c.isdigit()]
a = [int(x[0][0]), int(x[0][1]), ...]
def ccn_is_valid(s):
    """Validate a supplied string s as a credit card number."""
    LENGTH = 16
    l = [int(c) for c in s if c.isdigit()]
    # Test 1: length
    if len(l) != LENGTH:
        return False
    # Test 2: first digit
    if not 4 <= l[0] <= 7:
        return False
    # Test 3: algorithm
    for i in range(0, LENGTH, 2):
        l[i] *= 2
        if l[i] % 10:
            l[i] = l[i] / (10 + (l[i] % 10))
    return not sum(l) % 10
while True:
    s = raw_input("Enter credit card number or 'end': ")
    if s.lower() == "end":
        break
    print(ccn_is_valid(s))
def invalid_credit_card_number(s):
    """ Returns None if s is a valid credit card number
        and a string describing the error otherwise.
        The string may contains non-digits, which are ignored.
    """

    # strip dashes from string and convert to list of digits    
    dig = [int(x) for x in list(s) if "0" <= x <= "9"]

    if len(dig) != 16:
        return "Invalid length"

    if dig[0] < 5 and dig[0] > 6:
        return "Invalid initial digit"

    # multiply and cast out nines for every other digit   
    for i in range(0, 16, 2):
        dig[i] *= 2
        if dig[i] > 9:
            dig[i] -= 9

    # calculate checksum            
    s = (9 * sum(dig)) % 10

    if s != 0:
        return "Invalid checksum"

    return None