繁体   English   中英

python中的def在调用时不起作用

[英]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条件周围加括号。

msgportport()局部变量,因此无法在外部访问。

您的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()

问题在于,使用该函数时, msgportport()局部变量。 该变量在函数外部不可用。 因此,从函数外部对其的引用会导致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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM