Я пытаюсь разработать список (называемый «l») списка кортежей из двух натуральных чисел (исключая 0), таких как «a» может «l», если len (a) == len и для каждого члена (позволяет вызвать p) «a», p [0] < = max и p [1] < = maxCant Solve «inc() принимает 1 позиционный аргумент, но 2 даны«
Например poslist_all (макс = 2, LEN = 1)
[[(1,1)],[(1,2)],[(2,1)],[(2,2)]]
и poslist_all (2,2)
[[(1,1),(1,1)],[(1,1),(1,2)],[(1,1),(2,1)],[(1,1),(2,2)],...,[(2,2),(1,1)],[(2,2),(1,2)],[(2,2),(2,1)],[(2,2),(2,2)]]
Так что я пытаюсь сделать, что список итератор и придумал этот код,
class poslist_all:
def __init__(self,max,len):
self.max = max
self.len = len
self.iposlist = len*[(1,1)]
def __iter__(self):
return self
def __next__(self):
ml = self.maxlist()
if ml:
if ml[0] == 0:
raise StopIteration
else:
toinc = ml[0]-1
self.inc(ml[0] - 1)
for i in range(ml[0],self.len-1):
self.iposlist[i] = (1,1)
return self.iposlist
else:
self.inc(self.len - 1)
return self.iposlist
def maxlist(self):
return [x for x,y in enumerate(self.iposlist) if y == (self.max,self.max)]
def inc(pnum):
if self.iposlist[pnum][1] == self.max:
return (self.iposlist[pnum][0]+1,1)
else:
return (self.iposlist[pnum][0],self.iposlist[pnum][1]+1)
if __name__ == "__main__":
for ps in poslist_all(2,2):
print(ps)
, но это всегда возвращает
Traceback (most recent call last):
File "./helper.py", line 33, in <module>
for ps in poslist_all(2,2):
File "./helper.py", line 22, in __next__
self.inc(self.len - 1)
TypeError: inc() takes 1 positional argument but 2 were given
Что вызывает эту ошибку? Как его решить? Есть ли еще питонический способ сделать это?
Вам нужно 'def inc (self, pcnum)'. – rlms
Связанный вопрос: http://stackoverflow.com/q/13652006/510937 – Bakuriu
Вы также можете прочитать FAQ [Почему «я» должен явно использоваться в определениях методов и вызовах?] (Http: //docs.python .org/3/FAQ/design.html # почему-я). Как только вы поймете _why_ Python работает таким образом, легче запомнить _that_ он работает таким образом. (Или, по крайней мере, это было для меня ...) – abarnert