2013-09-20 5 views
2

Я пытаюсь разработать список (называемый «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 

Что вызывает эту ошибку? Как его решить? Есть ли еще питонический способ сделать это?

+4

Вам нужно 'def inc (self, pcnum)'. – rlms

+1

Связанный вопрос: http://stackoverflow.com/q/13652006/510937 – Bakuriu

+1

Вы также можете прочитать FAQ [Почему «я» должен явно использоваться в определениях методов и вызовах?] (Http: //docs.python .org/3/FAQ/design.html # почему-я). Как только вы поймете _why_ Python работает таким образом, легче запомнить _that_ он работает таким образом. (Или, по крайней мере, это было для меня ...) – abarnert

ответ

4

Другие показали вам, как избавиться от ошибки, но я хотел бы обратиться к актуальной проблеме.

Существует действительно лучший, более питонический способ сделать то, что вы хотите. Модуль itertools, а именно itertools.product(), может сделать эту задачу намного проще.

import itertools as it 

def create_possibilities(highest, per_list): 
    tuples = it.product(range(1, highest+1), repeat=highest) 
    all_possibilities = it.product(tuples, repeat=per_list) 
    return all_possibilities 

Это возвращает итератор итераторы (я думаю, что это по крайней мере близко к правильной терминологии).
Если вы хотите использовать фактические списки, используйте функцию list() по необходимости.

Также обратите внимание, что max и len - ужасные имена переменных; они скрывают встроенные функции python.

11

Экземпляр класса всегда передается в качестве первого параметра методам класса. Попробуйте:

def inc(self, pnum): 
    if ...: 
     return ... 
    else: 
     return ... 
+4

's/class/instance /' –

+4

Также 'inc' не является методом класса; это всего лишь метод. – Air

+0

Я бы предположил, что он означает методы классов. – rlms

3

Изменение:

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) 

To:

def inc(self, pnum): # methods (in a class) require self 
     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) 
+1

Все методы связаны с классами по определению, но в Python не каждый метод - это [метод класса] (http://docs.python.org/2/library/functions.html#classmethod), что потребует 'cls 'как первый аргумент (а не' self'). Лучше быть точным и просто сказать «метод» здесь. – Air

Смежные вопросы