[英]def in python not working when called
import pyttsx
import random
import os
import serial
import webbrowser
while True:
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
engine = pyttsx.init()
portport()
if(msg == 'mof'):
engine.say('Are you sure?')
engine.runAndWait()
portport()
if(msg == 'yes'):
engine.say('Chrome has now closed')
os.system("TASKKILL /F /IM chrome.exe")
engine.runAndWait()
elif(msg == 'noo'):
engine = pyttsx.init()
engine.say('Are you kidding me?')
engine.runAndWait()
if(msg == 'hi_'):
greeting()
if(msg == 'bye'):
leaving()
if(msg == 'who'):
engine = pyttsx.init()
engine.say('Hi there')
engine.runAndWait()
if(msg == 'lik'):
engine = pyttsx.init()
engine.say('Ofcourse I do!')
engine.runAndWait()
我的问题是,如果不portport()
def( portport()
)并在需要时调用它,而是编写包含在此def中的代码,则一切正常。 我使用了其他功能(例如,因为不想让它成为很长的代码而没有在这里使用)其他功能(例如greeting()
),并且效果很好。
使用上面的代码时,Eclipse的控制台“说”:
Traceback (most recent call last):
File "C:\Users\xxx\eclipse\workspace\Ai_Project\Ai\Ai_Brain.py", line 126, in <module>
if(msg == 'mof'):
NameError: name 'msg' is not defined
并且每一个if(msg == 'something'):
变成红色
我在这里和到处都读了很多文章,但似乎不是python函数问题
答案:谢谢大家的宝贵回答,也感谢mhawke的回答。 该代码在必须根据您的建议进行操作之后才起作用。 为了将来使用,更新的代码是:
.....
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
return msg
while True:
engine = pyttsx.init()
msg = portport()
if(msg == 'mof'):
engine.say('Are you sure?')
engine.runAndWait()
msg = portport()
if(msg == 'yes'):
engine.say('Chrome has now closed')
os.system("TASKKILL /F /IM chrome.exe")
engine.runAndWait()
elif(msg == 'noo'):
engine = pyttsx.init()
engine.say('Are you kidding me?')
engine.runAndWait()
......
msg
仅在portport
函数中定义。 如果要在外部使用它,则需要从那里返回它,并将其分配给局部变量。
注意,while循环中不应包含函数定义。
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
return msg
while True:
engine = pyttsx.init()
msg = portport()
if msg == 'mof':
...
另请注意,您不需要在Python条件周围加括号。
msg
是portport()
局部变量,因此无法在外部访问。
您的msg变量不在正确的范围内。
import pyttsx
import random
import os
import serial
import webbrowser
while True:
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
return msg
engine = pyttsx.init()
msg = portport()
if(msg == 'mof'):
engine.say('Are you sure?')
engine.runAndWait()
portport()
if(msg == 'yes'):
engine.say('Chrome has now closed')
os.system("TASKKILL /F /IM chrome.exe")
engine.runAndWait()
elif(msg == 'noo'):
engine = pyttsx.init()
engine.say('Are you kidding me?')
engine.runAndWait()
if(msg == 'hi_'):
greeting()
if(msg == 'bye'):
leaving()
if(msg == 'who'):
engine = pyttsx.init()
engine.say('Hi there')
engine.runAndWait()
if(msg == 'lik'):
engine = pyttsx.init()
engine.say('Ofcourse I do!')
engine.runAndWait()
问题在于,使用该函数时, msg
是portport()
的局部变量。 该变量在函数外部不可用。 因此,从函数外部对其的引用会导致NameError
异常。
在行中声明时, msg
的作用域与if
语句中对其的引用相同,因此没有问题。
使用该函数时纠正此问题的一种方法是让该函数返回 msg
的值:
def portport():
ser = serial.Serial('COM3',9600)
raw_data = ser.read(7)
msg = str(raw_data[3:6])
print msg
ser.close()
return msg
然后调用portport()
并将返回值分配给变量msg
:
msg = portport()
现在,将在与引用它的if
语句相同的作用域中创建一个新变量msg
。
注意:不要将函数内部的msg
与函数外部的msg
混淆-它们是不同的变量,因为它们存在于不同的作用域中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.