-1

関数内に関数を追加する方法はありますか? 私は現在ゲームを作成しています。これにより、スクリプトがより整理されたものになります。

私の現在のスクリプトの例:

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

何が悪いのかよくわかりません。作業がずっと簡単になるので、これがうまくいくことを本当に望んでいました. 私が知っている限りでは、問題を引き起こしたのは小さなタイプミスである可能性があります.

ここの誰かがエラーを見ることができることを本当に願っています!

ありがとう!

4

2 に答える 2

3

はい。ただし、使用するに関数を定義する必要があります。

于 2013-08-14T00:32:08.967 に答える
0

@mipadi が指摘するように、def を他の def 内に埋め込むのは簡単です。

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

これは、長いコード セクションの編成を整理するのに役立ちます。関数が定義されるまで関数を呼び出すことはできません - 上記の例は機能しますが、これは機能しません:

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

この戦略を効果的に利用するには、@Basile が指摘するようにクロージャーについて調べてください。クロージャーは、このコンテキストでは強力なツールであり、バグの原因になる可能性もあります (意図しないスコープから誤って情報を取得する可能性があるため、特に)切り取りと貼り付けによって構築される傾向があるif-else条件の長いブロックで:)

この種の長い if/else ブロックには、if ステートメントの代わりに辞書を使用することを検討する必要があります。コードでそれらを構築する方が簡単で、多くの繰り返しを取り除きます。

于 2013-08-14T00:51:33.427 に答える