功能里面的功能?

时间:2013-08-14 00:25:41

标签: python function terminal

有没有办法在函数内添加函数?我目前正在制作游戏,它会使我的剧本更有条理!

我当前脚本的一个示例:

def LVL1_TUTORIAL_07__C_USERS_MRX():
    print
    choice = raw_input('C:\Users\Mr. X>')
    if choice.lower() == 'help':
        print
        print ' dir - Allows you to see the available files and directories in the current directory.'
        print ' cd - (Change Directory) is a command used to switch directories in MS-DOS and the Windows command line.'
        print ' search - Searching'
        print ' connect - connect + name of the server you want to connect'
        LVL1_TUTORIAL_07__C_USERS_MRX()

    if choice.lower() == 'cls':
        os.system('cls')
        LVL1_TUTORIAL_07__C_USERS_MRX()

    if choice.lower() == 'cd':
        print 'C:\Users\Mr. X'
        LVL1_TUTORIAL_07__C_USERS_MRX()

    if choice.lower() == 'cd.':
        print
        LVL1_TUTORIAL_07__C_USERS_MRX()

    if choice.lower() == 'cd..':
        print

    if choice.lower() == 'cd contacts':
        LVL1_TUTORIAL_07__C_USERS_MRX_CONTACTS()

    if choice.lower() == 'cd desktop':
        LVL1_TUTORIAL_07__C_USERS_MRX_DESKTOP()

    if choice.lower() == 'cd documents':
        LVL1_TUTORIAL_07__C_USERS_MRX_DOCUMENTS()

    if choice.lower() == 'cd downloads':
        LVL1_TUTORIAL_07__C_USERS_MRX_DOWNLOADS()

    if choice.lower() == 'cd favorites':
        LVL1_TUTORIAL_07__C_USERS_MRX_FAVORITES()

    if choice.lower() == 'cd links':
        LVL1_TUTORIAL_07__C_USERS_MRX_LINKS()

    if choice.lower() == 'cd music':
        LVL1_TUTORIAL_07__C_USERS_MRX_MUSIC()

    if choice.lower() == 'cd pictures':
        LVL1_TUTORIAL_07__C_USERS_MRX_PICTURES()

    if choice.lower() == 'cd videos':
        print
        print 'test'
        time.sleep(2)
        LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS()

        def LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS():
            print

            choice = raw_input('C:\Users\Mr. X\Videos>')
            if choice.lower() == 'help':
                print 'help'
            if choice.lower() == 'cls':
                os.system('cls')
                LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS()
            if choice.lower() == 'cd folder 1':
                LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS_FOLDER1()

            def LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS_FOLDER1():
                print
                choice = raw_input('C:\Users\Mr. X\Videos>')
                if choice.lower() == 'help':
                    print 'help'
                if choice.lower() == 'cd..':
                    LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS()
                if choice.lower() == 'cd..':
                    LVL1_TUTORIAL_07__C_USERS_MRX()

            return LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS_FOLDER1()

        return LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS()    


    if choice.lower() == 'dir':
        print
        print ' Volume in drive C has no label.'
        print ' Volume Serial Number is 57GE-4AFB'
        print
        print ' Directory of C:\Users\Mr. X'
        print
        print '01.01.2013  00:00    <DIR>          .'
        print '01.01.2013  00:00    <DIR>          ..'
        print '01.01.2013  00:00    <DIR>          Contacts'
        print '01.01.2013  00:00    <DIR>          Desktop'
        print '01.01.2013  00:00    <DIR>          Documents'
        print '01.01.2013  00:00    <DIR>          Downloads'
        print '01.01.2013  00:00    <DIR>          Favorites'
        print '01.01.2013  00:00    <DIR>          Links'
        print '01.01.2013  00:00    <DIR>          Music'
        print '01.01.2013  00:00    <DIR>          Pictures'
        print '28.07.2013  15:57                 0 telnet'
        print '01.01.2013  00:00    <DIR>          Videos'
        print '               1 File(s)              0 bytes'
        print '              11 Dir(s)  53 687 091 200 bytes free'
        print
        LVL1_TUTORIAL_07__C_USERS_MRX()

    else:
        print
        print 'wrong'
        time.sleep(2)

    return LVL1_TUTORIAL_07__C_USERS_MRX()



LVL1_TUTORIAL_07__C_USERS_MRX()

然后我收到此错误消息:

UnboundLocalError: local variable 'LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS' referenced before assignment
File "C:\Users\Stig Arne\Desktop\HACKER\HACKER.py", line 3715, in <module>
  LVL1_TUTORIAL_07__C_USERS_MRX()
File "C:\Users\Stig Arne\Desktop\HACKER\HACKER.py", line 3656, in LVL1_TUTORIAL_07__C_USERS_MRX
  LVL1_TUTORIAL_07__C_USERS_MRX_VIDEOS()  

我不太确定是什么问题。我真的希望这有效,因为它会让我的工作变得更加容易。据我所知,它可能只是一个小错字导致了这个问题。

我真的希望有人能看到错误!

谢谢!

2 个答案:

答案 0 :(得分:3)

是的,但您必须在之前定义函数。

答案 1 :(得分:0)

正如@mipadi指出的那样,将defs嵌入到其他defs中很容易:

def outer():
   def inner():
      return "A"
   return inner()

这有助于清理长代码段的组织。在定义之后才能调用函数 - 虽然上面的示例有效,但不会

def outer():   # this version FAILS
   return inner()
   def inner():
      return "A"

为了有效地使用这个策略,请阅读@Basile指出的闭包 - 它们在这种情况下是一个强大的工具,也可能是bug的来源(因为你可能会意外地从你没有获得的范围获取信息)打算 - 特别是在if-else条件的长块中,这些条件往往是通过剪切和粘贴来建立的:)

对于这些长if / else块,你一定要查看using dictionaries instead of if statements。在代码中构建它们更容易,并且摆脱了大量的重复。