ISBN校验数字项目查找第10位

时间:2018-02-07 18:01:52

标签: 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]) * (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 + ... + 10d10必须是11的倍数的条件中的其他9位数唯一确定(这里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现在是0201314525 - 我们可以检查并看到(115 + 10 * 5)%11 = 0为真。

     

使用函数设计配方,定义一个Python函数isbn_gendigit,其中包含一个参数isbn,一个9位数的字符串。该函数应计算给定ISBN的校验位,然后打印出10位ISBN。 isbn_gendigit将返回值None(函数结束,键入“return None”)。

     

根据以下示例测试您的功能:

     
    

isbn_gendigit('020131452')

         
      

0201314525

    
         

isbn_gendigit('068131921')

         
      

0681319216

    
  

1 个答案:

答案 0 :(得分:3)

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

  

要计算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循环

您的解决方案未正确实施算法。 length在做什么?您所要做的就是从字符串的开头(左侧)迭代到结尾(右侧),随时跟踪索引到字符串:

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

def isbn_gendigit(isbn):
    total = 0
    i = 0
    for n in isbn:         # iterating over the string gives each character of the string in order
        num = int(n)       # convert to an integer
        i += 1             # increment the digit index
        total += i * 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的内置enumerate函数来获取数字及其在字符串中的位置,从而无需手动跟踪索引i:< / p>

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)

生成器表达式

当然,我们可以做得更好。使用generator expressionsbuilt-in sum function,我们可以将此for-loop和转换为单行:

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)