这是我的代码:
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'
我做错了什么?
答案 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()调用,第二种技术的速度提高了两倍以上。