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

时间:2017-05-15 12:30:15

标签: python function

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

我的问题是,如果不是创建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()
                                                                      ......

4 个答案:

答案 0 :(得分:1)

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条件的括号。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

问题是,在使用该功能时,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()

现在,在与引用它的msg语句相同的范围内创建一个新变量if

N.B。不要将函数内部的msg与函数外部的函数混淆 - 它们是不同的变量,因为它们存在于不同的范围内。