我的方法在我自己的程序中得到认可。可能是新手的错误

时间:2010-03-21 23:47:19

标签: python function

这是我的代码:

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 个答案:

答案 0 :(得分:5)

该函数尚未定义,因此名称'isVowel'没有绑定到它的函数:仅在您说“def”时发生。

解决方案:将代码移至def isVowel(letter)

下方

答案 1 :(得分:2)

  

def isVowel定义放在最上面。

您在调用函数后定义了该函数。 由于源代码未编译并在运行时解释,因此不会检查此错误。

此外,您可以将该功能重新定义为

def isVowel(letter):
    if letter.lower() in "aeiou":
        return True
    else:
        return False

答案 2 :(得分:1)

Python从上到下执行你遇到它们时放在模块中的所有语句。在您定义该函数之前,您尝试调用isVowel会发生什么。 python解释器尚未达到该代码。

如果您将isVowel的定义放在文件的顶部,您就可以调用它。

答案 3 :(得分:1)

冒着被再次投票的风险,这里有一些关于这些“使用前定义”要求的进一步见解。

请注意,在调用该函数之前,函数体不会因符号的存在而被处理。所以你可以写这样的代码:

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

def B():
    # calls A
    A()

这很好用。解释器/编译器通过模块自上而下工作,但是当它看到函数或类定义时,它处理函数的定义,但不处理函数本身。

您的代码失败的原因是因为对isVowel的引用不在函数内,而是在模块范围内。模块中不在函数内的代码会立即执行,因此解释器需要能够根据目前所看到的内容解析任何名称。

答案 4 :(得分:0)

我认为您需要先定义函数,然后在定义函数后调用它。

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"

通常,您会将函数定义放在另一个文件中,并导入它们以避免这些问题。

答案 5 :(得分:0)

以下是新手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()调用,第二种技术的速度提高了两倍以上。