使用理解列表的python 3的EAN13校验和类

时间:2016-02-22 11:25:08

标签: python python-3.x list-comprehension map-function

我试图改变这个python 2类,使其在python 3中运行 但不幸的是,我坚持理解清单

这是原始课程:

class GTIN(object):

def __init__(self, barcode=''):
    self.barcode = barcode

def __checkDigit(self, digits):
        total = sum(digits) + sum(map(lambda d: d*2, digits[-1::-2]))
        return (10 - (total % 10)) % 10

def validateCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (8,12,13,14) and barcode.isdigit():
        digits = map(int, barcode)
        checkDigit = self.__checkDigit( digits[0:-1] )
        return checkDigit == digits[-1]
    return False

def addCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (7,11,12,13) and barcode.isdigit():
        digits = map(int, barcode)
        return barcode + str(self.__checkDigit(digits))
    return ''

这是我用我的noob技能的地方

class GTIN(object):

def __init__(self, barcode=''):
    self.barcode = barcode

def __checkDigit(self, digits):
        #total = sum(digits) + sum(map(lambda d: d*2, digits[-1::-2]))
        total = sum(digits) + sum([d*2 for d in digits[-1::-2]])
        return (10 - (total % 10)) % 10

def validateCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (8,12,13,14) and barcode.isdigit():
        #digits = map(int, barcode)
        digits = (int(s) for s in barcode)
        checkDigit = self.__checkDigit( digits[0:-1] )
        return checkDigit == digits[-1]
    return False

def addCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (7,11,12,13) and barcode.isdigit():
        #digits = map(int, barcode)
        digits = (int(s) for s in barcode)
        return barcode + str(self.__checkDigit(digits))
    return ''

我通过理解列表更改了所有地图功能,但现在我已经遇到了这个错误

TypeError: 'generator' object is not subscriptable

1 个答案:

答案 0 :(得分:1)

问题在于:

digits = (int(s) for s in barcode)
return barcode + str(self.__checkDigit(digits))

以后,在__checkDigit,你做

total = sum(digits) + sum([d*2 for d in digits[-1::-2]])

digits[-1::-2]工作,digits必须是列表,或其他类型的“可订阅”。在Python 3中,map返回一个生成器,因此您更改了它。但是你把它改成了另一种生成器 - 生成器表达式。

您可以使用正确的列表理解(注意方括号):

digits = [int(s) for s in barcode]

或坚持使用map,但将生成器变为列表:

digits = list(map(int, barcode))