Мой метод признан в моей собственной программе. Ошибка новичка, вероятно - PullRequest
1 голос
/ 22 марта 2010

Вот мой код:

sentenceToTranslate = raw_input("Please write in the sentence you want to translate: ")
words = sentenceToTranslate.split(" ")

for word in words:
    if isVowel(word[0]):
        print "TEST"


def isVowel(letter):
    if letter.lower() == "a" or letter.lower() == "e" or letter.lower() == "i" or letter.lower() == "o" or letter.lower() == "u":
        return True
    else:
        return False

Я получаю ошибку:

NameError: имя 'isVowel' не определено

Что я делаю не так?

Ответы [ 6 ]

5 голосов
/ 22 марта 2010

Функция еще не определена, поэтому имя isVowel не имеет привязанной к ней функции: это происходит только тогда, когда вы говорите «def».

Решение: переместитьВаш код ниже def isVowel(letter).

2 голосов
/ 22 марта 2010

Поместите определение def isVowel вверху.

Вы определили функцию после того, как она уже была вызвана. Поскольку исходный код не скомпилирован и интерпретируется во время выполнения, он не проверяет эту ошибку.

Кроме того, вы можете переопределить функцию как

def isVowel(letter):
    if letter.lower() in "aeiou":
        return True
    else:
        return False
1 голос
/ 22 марта 2010

С риском повторного опускания, вот еще некоторое понимание этих требований «определить перед использованием».

Обратите внимание, что тело функции не обрабатывается на предмет наличия символов до этой функции.вызывается.Таким образом, вы могли бы написать код так:

def A():
    # calls B - even though B is defined later in the module
    B()

def B():
    # calls A
    A()

И это прекрасно работает.Интерпретатор / компилятор работает сверху вниз через модуль, но когда он видит определение функции или класса, он обрабатывает определение функции, но не саму функцию.

Причина, по которой ваш код не удался, заключалась в том, что ссылка на isVowel не была в функции, но находилась в области видимости модуля.Код в модуле, который не входит в функцию, выполняется немедленно, поэтому интерпретатор должен иметь возможность разрешать любые имена на основе того, что он видел до сих пор.

1 голос
/ 22 марта 2010

Python выполняет все операторы, которые вы помещаете в свой модуль, когда встречает их, сверху вниз. В результате вы пытаетесь вызвать isVowel до того, как определили эту функцию. Интерпретатор python еще не достиг этого кода.

Если вы поместите определение isVowel вверху вашего файла, вы сможете его вызвать.

0 голосов
/ 22 марта 2010

Вот еще несколько моментов, которые стоит сделать новичку в Pythoner:

1) Какой смысл писать это?

def isVowel():
    if boolean-expression:
        return True
    else:
        return False

У вас уже есть Истина / Ложность, захваченная в значении логического выражения, просто:

def isVowel():
    return boolean-expression

2) Вызовы функций убивают производительность. Особенно, когда у вас есть такой ограниченный набор элементов для проверки, вместо того, чтобы вызывать .lower (), чтобы вы могли проверять «aeiou», проверяйте сам символ по буквам как в нижнем, так и в верхнем регистре «aeiouAEIOU». Несмотря на то, что эта строка в два раза длиннее для проверки на членство, она спасает нас от вызова функции lower ().

Вот некоторые результаты теста производительности:

import time
import string
time.clock()

reps = 100000
testString = (string.uppercase + string.lowercase) * reps

start = time.clock()
for c in testString:
    answer = c.lower() in "aeiou"
end = time.clock()
print end-start

start = time.clock()
for c in testString:
    answer = c in "aeiouAEIOU"
end = time.clock()
print end-start

start = time.clock()
for c in testString:
    pass
end = time.clock()

Печать:

3.27782246068
1.76839123408
0.713913919227

Третий цикл показывает время, необходимое для перебора самой testString, поэтому время, проведенное в теле цикла (при условии, что проход занимает незначительное время):

2.563908541
1.054477315

Избегая вызова lower (), вторая техника более чем в два раза быстрее.

0 голосов
/ 22 марта 2010

Я думаю, вам нужно сначала определить функцию, а затем вызывать ее после того, как она была определена.

def isVowel(letter):
    if letter.lower() == "a" or letter.lower() == "e" or letter.lower() == "i" or letter.lower() == "o" or letter.lower() == "u":
        return True
    else:
        return False

sentenceToTranslate = raw_input("Please write in the sentence you want to translate: ")
words = sentenceToTranslate.split(" ")

for word in words:
    if isVowel(word[0]):
        print "TEST"

Часто вы помещаете определения функций в другой файл и импортируете их, чтобы избежать этих проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...