2015-06-07 2 views
-4

Я очень новичок в программировании на Python, и у меня возник вопрос о том, почему, когда я вызываю функцию, она не работает. Я вижу TypeError около die_roll, нуждающихся в двух аргументах, но почему это не покрывается self.result при добавлении в скобки?Почему функции не принимают аргумент `self`?

import random 

def die_roll(self, result): 
    self.result = random.randint(1, 10) 
    print "Roll the dice, Dennis. " 
    print "You have rolled a %s!" % self.result 

print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") 
print ("     Welcome...     ") 
print (" TO THE WORST GAME IN THE WORLD!!!!!!!!!!! ") 
print (" REALLY, IT IS QUITE BAD. YOU'LL SEE...... ") 
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n") 

name = raw_input('Welcome to this awful adventure. Please enter your name to get started: \n') 

print "\n%s? I don't like that name. \n" % (name) 

name1 = raw_input('Try again: \n') 

print "\n%s?! Really? That's the best you can do? You know what - just forget it. You will be called Dennis. \n" % (name1) 

print "I happen to like Dennis. It's a good name. Regal. It's nice to meet you.... Dennis. \n" 

print "You begin your adventure peering into a long, gloomy cave. You move by rolling a 10-sided dice.\n" 

print "You will encounter random enemies along the way. If your combined rolls equal 100, you win!\n" 

die_roll() 
+0

Извините, что форматирование неуловимо - это не так, как это выглядит в PyCharm, обещайте! –

+0

Какую версию Python вы используете? Я запустил код, и мне пришлось много исправлять (я все еще есть). – Jimmy360

+1

'die_roll' ожидает два аргумента, первый из которых называется' self'. Это наводит на мысль о том, что 'die_roll' должен был быть методом, но это автономная функция. Кстати, вы не передаете никаких аргументов вызову 'die_roll' и ничего не возвращаете. – 9000

ответ

2

вы определяете функцию

def die_roll(self, result): 

Это говорит питона интерпретатор, который die_roll, необходимо два аргумента сам и результат.

Я предполагаю, что вы скопировали этот метод из какого-то другого класса, потому что self является обычным соглашением об именах для первого параметра для метода в классе, в более позднем случае self (первый параметр) относится к «этому», (из C++ или java).

Из тела функции, похоже, вам не нужны какие-либо параметры, может быть, вы можете попробовать -

def die_roll(): 
    result = random.randint(1, 10) 
    print "Roll the dice, Dennis. " 
    print "You have rolled a %s!" % result 
+2

Дополнительные очки для чего-то вроде «результата возврата» в конце. – 9000

+1

Чтобы быть семантичным, «функция» внутри класса называется методом, а не функцией. –

0

Хм. Я не знаю, где ваше основное недоразумение, но в вашем вопросе есть несколько вопросов.

Вы не следуете поток программы и где ошибка происходит от:

def die_roll(self, result): 
    /stuff here/ 

/stuff/ 

print "You will encounter random enemies along the way. If your combined rolls equal 100, you win!\n" 

die_roll() <--- here is where the TypeError about die_roll needing two arguments is triggered 

почему не то, что охватывается self.result при добавлении в скобках?, спросите вы? Поскольку ошибка говорит о том, что круглые скобки при вызове die_roll() не соответствуют шаблону, установленному вами, когда вы сделали def die_roll(...). Вы не можете избежать этой ошибки, выполнив что-то в том месте, где определена функция. Они всегда должны совпадать в обоих местах - все места. Если def die_roll говорит, что ему нужны два параметра, тогда, когда вы его вызываете, вам нужно указать два параметра.

Другое недоразумение заключается в том, что вы используете def die_roll(self, result), а затем self.result - как если бы запятая и операторы точек были каким-то образом связаны или вам необходимо использовать эти аргументы как способ получить или вернуть результат. (Это не так, вы этого не делаете).

Другое, что вы используете слова self и result, как будто Python их понимает. Они не являются ключевыми словами, они не имеют особого значения в Python.

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

Ваш вопрос в заголовке Почему функции не нуждаются в аргументе self? можно ответить разными способами, и все это в настоящее время бесполезно для вас. blah blah Классы определяют объекты, они содержат вещи, которые выглядят точно так же, как функции, но называются методами. Методам нужен способ ссылки на объект, в котором они находятся, поэтому первый аргумент метода всегда является объектом, в котором он находится, и механизм Python предоставляет первый аргумент, поэтому вызовы методов всегда выглядят так, как будто они не совпадают, потому что определение имеет еще один аргумент, чем вызов. self - это соглашение, которое программисты Python приняли для обозначения переменной, которая получает ссылку на объект, хотя это не является особым именем по своей сути. Но это все несвязанный фон, настройка ...

Функции не нуждаются в self, потому что они не являются объектами, поэтому им не нужен способ ссылки на объект, в котором они находятся, потому что они не в одном.

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

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