2012-02-10 2 views
0

Попытка сделать таблицу истинности с помощью Python с помощью itertools, но получаю ту же ошибкуСоздание истины таблицы с Python IndexError: список из диапазона

Heres мой код до сих пор

import sys 
import itertools 

def gen_constants(numvar): 
    l = [] 
    for i in itertools.product([False, True], repeat=numvar): 
     l.append (i) 
    return l 

def big_and (list): 

    if False in list: 
     return False 
    else: 
     return True 

def big_or (list): 
    if True in list: 
     return True 
    else: 
     return False 


def main(): 
    w0 = gen_constants (int(sys.argv [1])) 
    for i in w0: 
     print big_and (i) 
    for i in w0: 
     print big_or (i) 



if __name__ == '__main__': 
    main() 

Ошибка приходит на основной () и на w0 = gen_constants (int (sys.argv [1]))

+0

Вы также можете обеспечить вывод трассировки? Как вы думаете, что может вызвать проблему? – monkut

+0

Ваш код отлично работает на моей машине. Я имею в виду, что я не уверен, что он делает то, что вы хотите, но он печатает таблицу истинности ... – Fred

+0

моя вообще не печатает ..... heres my traceback output –

ответ

0

Вам необходимо указать целочисленный аргумент.

Сравните эти:

$ python /tmp/111.py 
Traceback (most recent call last): 
    File "/tmp/111.py", line 33, in <module> 
    main() 
    File "/tmp/111.py", line 24, in main 
    w0 = gen_constants (int(sys.argv [1])) 
IndexError: list index out of range 

$ python /tmp/111.py 1 
False 
True 
False 
True 

$ python /tmp/111.py 2 
False 
False 
False 
True 
False 
True 
True 
True 

$ python /tmp/111.py w 
Traceback (most recent call last): 
    File "/tmp/111.py", line 33, in <module> 
    main() 
    File "/tmp/111.py", line 24, in main 
    w0 = gen_constants (int(sys.argv [1])) 
ValueError: invalid literal for int() with base 10: 'w' 

Или обновить свой код, чтобы иметь дело с любым входом или при отсутствии одного.


UPDATE:

def main(): 
    try: 
     argument = sys.argv[1] 
    except IndexError: 
     print 'This script needs one argument to run.' 
     sys.exit(1) 

    try: 
     argument = int(argument) 
    except ValueError: 
     print 'Provided argument must be an integer.' 
     sys.exit(1) 

    w0 = gen_constants (argument) 
    for i in w0: 
     print big_and (i) 
    for i in w0: 
     print big_or (i) 

Что дает:

$ python /tmp/111.py 
This script needs one argument to run. 

$ python /tmp/111.py 2.0 
Provided argument must be an integer. 

$ python /tmp/111.py w 
Provided argument must be an integer. 

$ python /tmp/111.py 1 
False 
True 
False 
True 
+0

Не могу сказать, что вы сделали в середине, но начало и конец кода - это то же самое, за исключением того, что я получаю IndexError вместо ValueError –

+0

Я запускаю ваш сценарий один раз без аргументов, дважды с одним целым аргументом: '1' и' 2' и один раз с строковым аргументом 'w'. В этой строке 'w0 = gen_constants (int (sys.argv [1])) вы принимаете 2 вещи:' 1: '' sys.argv' имеет 2 или более элемента (сначала имя файла сценария, второе - это 1-й аргумент и т. Д.), '2:' второй элемент является целым числом. Вот почему ваш скрипт работает, если я передаю ему целое число и сбой, когда я не передаю никаких аргументов или строку/float. –

+0

Это помогает мне понять проблему, но без фона python я действительно не знаю, как это сделать. Что-нибудь, что вы можете сказать мне о том, как конкретно это исправить? Где в этой строке я передаю ему целое число? –

1

IndexError: list index out of range означает, что индекс поставки слишком велик для списка, который вы индексирование, что означает, что, когда линия

w0 = gen_constants (int(sys.argv [1])) 

выполнено. sys.argv содержит не более 1 элемента, а не 2, что сделает sys.argv[1], возвратит результат, а это значит, что вы не проходите в аргументе при запуске скрипта.

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