我试图改变这个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
答案 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))