Создание таблицы истинности с помощью Python IndexError: список вне диапазона - PullRequest
0 голосов
/ 10 февраля 2012

Попытка создать таблицу Truth через Python, используя itertools, но постоянно получаю ту же ошибку

Вот мой код

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()

Ошибка возникает в main () и в w0 = gen_constants (int (sys.argv [1]))

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

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

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

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

0 голосов
/ 10 февраля 2012

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

Сравните:

$ 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'

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


ОБНОВЛЕНИЕ:

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
...