Python ISBN检查数字项目查找第10位数字

Python ISBN检查数字项目查找第10位数字,python,Python,我被指派创建一个函数,它接受9个数字,并返回第10个数字,就像它是一个ISBN数字一样。我将在底部包括确切的方向,但总而言之,最后一位数字必须是其他9位数字的总和,第一位数字乘以1,第二位乘以2,依此类推 以下是我到目前为止的情况: def isbn_gendigit(isbn): ''' docstring (fill in later) ''' length = 9 last_digit = 0 last_digit = int(isbn[0]

我被指派创建一个函数,它接受9个数字,并返回第10个数字,就像它是一个ISBN数字一样。我将在底部包括确切的方向,但总而言之,最后一位数字必须是其他9位数字的总和,第一位数字乘以1,第二位乘以2,依此类推

以下是我到目前为止的情况:

def isbn_gendigit(isbn):
    '''
    docstring (fill in later)
    '''
    length = 9
    last_digit = 0
    last_digit = int(isbn[0]) * (length)
    for i in range(len(isbn)):
        length - 1
    isbn = isbn % 11
    last_digit = 11 - isbn
    print(ISBN + last_digit)
    return None
我知道这还远远不够完美,但我在理解如何解决这个问题时遇到了困难。我已经在这里研究了其他类似的基于ISBN的问题,但我看到的少数问题远比我要寻找的复杂

项目说明:ISBN校验数字

国际标准书号ISBN在2007年之前是一个10位代码,唯一指定一本书。最右边的数字是校验和数字,可根据d1+2d2+3d3+…+的条件从其他9位数字中唯一确定10d10必须是11的倍数,这里di表示从右边开始的第i个数字

示例:与020131452d10对应的校验和数字是d10的唯一值,介于0和10之间–即:1*0+2*2+3*0+4*1+5*3+6*1+7*4+8*5+9*2+10*d10,是11的倍数

要计算d10:找到1*0+2*2+3*0+4*1+5*3+6*1+7*4+8*5+9*2=115,然后找到115%11=5的剩余部分,即第10位数字d10=5的值。因此,10位数的ISBN现在是0203114525,我们可以检查并看到115+10*5%11=0是真的

使用函数设计方法,定义一个Python函数isbn_gendigit,其中有一个参数isbn,一个9位字符串。函数应计算给定ISBN的校验位,然后打印出10位ISBN。isbn_gendigit将返回函数末尾的值,键入“return None”

在以下示例中测试您的函数:

isbn_gendigit'020131452'

0201314525

isbn_gendigit'068131921'

0681319216


问题中给出了算法,这很好:

要计算d10:找到1*0+2*2+3*0+4*1+5*3+6*1+7*4+8*5+9*2=115,然后找到115%11=5的剩余部分,即第10位数字d10=5的值

您所要做的就是将其转换为Python

简单for循环 您的解决方案未正确实现算法。你在干什么?您所要做的就是从字符串的开始左侧迭代到结束右侧,并在运行时跟踪字符串中的索引:

def isbn_gendigit(isbn):
    total = 0
    for i in range(len(isbn)): # iterates from 0 to the length of the string (minus 1)
        n = isbn[i]            # the ith character in the string
        num = int(n)           # convert to an integer
        total += (i+1) * num   # sum the digit times the increment
    d10 = total % 11           # modulo 11
    print(isbn + str(d10))     # print the result
    return None                # return None (technically not needed)
在字符串上迭代 我们可以做得更好。首先,Python中的字符串是可编辑的。为什么这很重要?因为,根据规范,我们得到了一个字符串:

…定义一个Python函数isbn_gendigit,其中有一个参数isbn,一个9位字符串

这使得对输入值的迭代变得轻而易举,但这确实意味着我们必须将索引作为一个单独的变量i跟踪到字符串中:

枚举字符串 我们仍然可以做得更好。事实上,我们可以通过使用Python的内置函数进行迭代来获得数字及其在字符串中的位置,从而无需手动跟踪索引i:

生成器表达式 当然,我们可以做得更好。使用和,我们可以将for循环和转换为一行:

def isbn_gendigit(isbn):
    # multiply and sum everything at once
    total = sum((i+1) * int(n) for i, n in enumerate(isbn))
    d10 = total % 11        # modulo 11
    print(isbn + str(d10))  # print the result
    return None             # return None (technically not needed)

尽管你可能会发现一个相关的问题太复杂了,但请注意它。请正确格式化你的代码。这太棒了!我真的很感激你一步一步地把它拆开。IDLE不喜欢printisbn+d10行,尽管printstrisbn+strd10似乎工作得很好。非常感谢。谢谢你指出这一点。添加字符串和整数没有意义。我已更新了我的答案以更正此问题。
def isbn_gendigit(isbn):
    total = 0
    for i, n in enumerate(isbn): # now I have a number and a character
        num = int(n)             # convert to a number
        total += (i+1) * num     # sum the digits
    d10 = total % 11             # modulo 11
    print(isbn + str(d10))       # print the result
    return None                  # return None (technically not needed)
def isbn_gendigit(isbn):
    # multiply and sum everything at once
    total = sum((i+1) * int(n) for i, n in enumerate(isbn))
    d10 = total % 11        # modulo 11
    print(isbn + str(d10))  # print the result
    return None             # return None (technically not needed)