2015-06-03 2 views
0

Мне нужно вычислить разницу между «player_number» и «comp_number», но он говорит:Python: Нет ошибка типа, а вычитание

TypeError: unsupported operand type(s) for Sub: 'NoneType' and 'int'

Я понимаю эту ошибку. Мой код генерирует player_number - это тип «Нет», поэтому я не могу его вычесть.

Как я могу справиться с этой проблемой? Есть идеи?

Вот мой код:

def name_to_number(name): 
    if name == "rock": 
     name = 0 
    elif name == "paper": 
     name = 1 
    elif name == "Spock": 
     name = 2 
elif name == "lizard": 
     name = 3 
elif name == "scissors": 
     name = 4 
else: 
    print 'Name is not listed:',name 

def number_to_name(number): 
if number == 0: 
    print "rock" 
elif number == 1: 
    print "Spock" 
elif number == 2: 
    print "paper" 
elif number == 3: 
    print "lizard" 
elif number == 4: 
    print "scissors" 
else: 
    print 'Your number is not valid:',number 


def rpsls(player_choice): 
if player_choice == "rock": 

    print 'Player choses', player_choice 
    player_number = name_to_number(player_choice) 
elif player_choice == "Spock": 
    print 'Player choses',player_choice 
    player_number = name_to_number(player_choice) 
elif player_choice == "paper": 
    print 'Player choses',player_choice 
    player_number = name_to_number(player_choice) 
elif player_choice == "lizard": 
    print 'Player choses',player_choice 
    player_number = name_to_number(player_choice) 
elif player_choice == "scissors": 
    print 'Player choses',player_choice 
    player_number = name_to_number(player_choice) 
else: 
    print "Name not in list",player_choice 

import random 
comp_number = random.randrange(0,4) 
if comp_number == 0: 
    print "Computer choses",number_to_name(0) 
elif comp_number == 1: 
    print "Computer choses",number_to_name(1) 
elif comp_number == 2: 
    print "Computer choses",number_to_name(2) 
elif comp_number == 3: 
    print "Computer choses",number_to_name(3) 
elif comp_number == 4: 
    print "Computer choses",number_to_name(4) 

diffrence = player_number - comp_number 

if diffrence % 5 == 1 or 2: 
    print 'Player wins!' 
elif (diffrence % 5) == 3 or 4: 
    print 'Computer wins!' 
else: 
    print 'Game tie' 




rpsls("rock") 
+1

Вы принимаете «Введение в интерактивное программирование в Python», Coursera? – ZdaR

+1

Вместо 'print' используйте' return'. – ZdaR

+0

есть. Я беру этот курс. – Yousuf

ответ

3

У вас есть эта распайка

player_number = name_to_number(player_choice) 

Но ни один из ваших if/elif/else случаев в name_to_number не используйте return ключевое слово. Чтобы return значение из этой функции, вы могли бы сделать

def name_to_number(name): 
    if name == "rock": 
     return 0 
    elif name == "paper": 
     return 1 
    elif name == "Spock": 
     return 2 
    elif name == "lizard": 
     return 3 
    elif name == "scissors": 
     return 4 
    else: 
     print 'Name is not listed:',name 

То же самое для number_to_name функции

+0

Стоит пояснить, что при отсутствии возврата 'player_number' просто устанавливается на' None', поскольку искатель, кажется, не понимает, что именно поэтому он появляется. – SuperBiasedMan

+0

Спасибо! Решила это. – Yousuf

1

Непроверено Fix. Отсутствие инструкции 'return'. Использование одного и того же имени переменной для строки и int не является хорошим стилем программирования.

def name_to_number(name): 
    number = -1 
    if name == "rock": 
     number = 0 
    elif name == "paper": 
     number = 1 
    elif name == "Spock": 
     number = 2 
    elif name == "lizard": 
     number = 3 
    elif name == "scissors": 
     number = 4 
    else: 
     print 'Name is not listed:',name 

    return number #This line was missing 
+0

Совершено, спасибо. – BerndGit

+0

Спасибо, мужчина. решил – Yousuf