python 3 的 EAN13 校验和 class 使用理解列表
EAN13 checksum class for python 3 using comprehension list
我正在尝试更改此 python 2 class 以使其在 python 3 中工作
但不幸的是我被理解列表困住了
原文如下class:
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 ''
这是我的菜鸟技能在哪里
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
问题在这里:
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
必须是一个列表,或某种其他类型的 "subscriptable"。在Python3、map
returns一个生成器,所以你改了。但是您将其更改为另一种生成器 -- 生成器表达式。
您可以使用适当的列表理解(注意方括号):
digits = [int(s) for s in barcode]
或坚持使用map
,但将生成器变成列表:
digits = list(map(int, barcode))
我正在尝试更改此 python 2 class 以使其在 python 3 中工作 但不幸的是我被理解列表困住了
原文如下class:
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 ''
这是我的菜鸟技能在哪里
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
问题在这里:
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
必须是一个列表,或某种其他类型的 "subscriptable"。在Python3、map
returns一个生成器,所以你改了。但是您将其更改为另一种生成器 -- 生成器表达式。
您可以使用适当的列表理解(注意方括号):
digits = [int(s) for s in barcode]
或坚持使用map
,但将生成器变成列表:
digits = list(map(int, barcode))