2015-08-27 2 views
1

Я очень новичок в python. У меня возникли проблемы с оценкой функции в выражении if. Некоторые очень простой код здесь:Python TypeError при проверке возвращаемых функций

import sys 
number = sys.argv 
def is_even(n): 
    if n%2==0: 
     return true 
    else: 
     return false 

if is_even(number): 
    print "The number is even" 
else: 
    print "The number is not even" 

Когда я пытаюсь запустить код, я получаю:

TypeError: unsupported operand type(s) for %: 'list' and 'int' 

Не уверен, что здесь происходит. Может кто-нибудь, пожалуйста, дайте мне несколько указаний на то, что я могу делать неправильно?

+1

Вы передаете список ('number' - это список, потому что' sys.argv' - это список), чтобы индексировать функцию.Try как 'is_even (number [1])'. – Kamehameha

+0

sys.argv относятся к списку типов, даже если вы передаете только один аргумент –

ответ

2

sys.argv список строк. Первая строка - это имя скрипта, поэтому вы хотите взять вторую строку и превратить ее в int.

import sys 

number = int(sys.argv[1]) # Changed this line 

def is_even(n): 
    if n%2==0: 
     return true 
    else: 
     return false 

if is_even(number): 
    print "The number is even" 
else: 
    print "The number is not even" 
+0

. Не думал, что это так. спасибо – KexAri

1

sys.argv - это список строк, в которых первый элемент является самим сценарием, а элементы после этого являются аргументами, переданными в программу в командной строке. Если вы хотите, чтобы передать количество в командной строке и принять его в вашей программе, вы должны использовать -

number = int(sys.argv[1]) 

Кроме того, вы должны преобразовать его в целое, если вы ожидаете его как целое.


Объяснение -

python <script.py> arg1 
     ^  ^
    sys.argv[0] sys.arv[1] ... 
1

Вы прошли number к вашей функции, то sys.argv список аргументов командной строки, передается сценарий Python, который его первый элементом является именем сценария и от остальных аргументов пользовательского аргумента, передаваемый сценарий, поэтому в этом случае вам необходимо передать целое число number[1] вашей функции (если вы передали один аргумент в командной строке).

sys.argv

The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string '-c'. If no script name was passed to the Python interpreter, argv[0] is the empty string.

Таким образом, вы можете просто сделать:

import sys 
number = int(sys.argv[1]) 

def is_even(n): 
    if n%2==0: 
     return true 
    return false 

Не то, что если вы хотите передать несколько аргумент в командной строке нужно получить элементы из второго индекса до конца:

numbers = map(int,sys.argv[1:]) 
1

, когда вы вызываете sys.argv, он возвращает список, в котором первым элементом является имя сценария, а остальные элементы будут переданы пользователем

Модификация:

import sys 
print sys.argv 
number = int(sys.argv[1]) 
def is_even(n): 
    if n%2==0: 
     return True 
    else: 
     return False 

if is_even(number): 
    print "The number is even" 
else: 
    print "The number is not even" 

выход:

(Canopy 32bit) C:\Users\Desktop\yp_test>python sample.py 2 
['sample.py', '2'] 
The number is even 
1

Я думаю, вы должны изменить одну строку в коде

number = int(sys.argv[1]) 

Тогда он будет работать.

+0

Не совсем; если вы это сделаете, вы получите 'TypeError: не все аргументы, преобразованные во время форматирования строки', что может быть очень запутанным: P. Вам нужно преобразовать его в 'int'. – Cyphase

+0

Собственно, ваше право должно быть number = int (sys.argv [1]) –

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