首頁  >  問答  >  主體

python - 脚本返回思路

新手刚学习编程,请大家给点思路,我写了个roll点的脚本,现在想让脚本在输入错误的的时候重新返回到第一步,不知道从哪里下手

https://gist.github.com/chengxiao/5393578

高洛峰高洛峰2763 天前502

全部回覆(4)我來回復

  • PHPz

    PHPz2017-04-17 11:26:32

    看你的程式彷彿看到很多年之前的我自己 ... 猶豫良久還是決定要寫一下這個答案 ...

    @greatghoul 的答案雖然被選了最佳但實際上並不是一個好答案 ...

    在一個函數內部為了返回開始而調用自身 ... 從程式設計的角度講這就是一種模擬 goto 的行為 ...

    但實際上這個模擬還不如 goto ... 因為它是一個遞歸 ... 輸入錯誤一定次數之後程式會出錯 ...

    一個好的程序應該是結構化的 ... 有進有出 ... 所以我大概改了一下 ... 如下 ...

    # today my lucky number
    from random import choice
    
    def roll( x, y ):
        return choice( range( x, y ) )
    
    def controller():
        a = raw_input( "Please enter /roll + number : " )
    
        try:
            if "/roll" == a:
                x, y  = 0, 100
            elif "-" in a:
                b = a.split()[1].split( "-" )
                x, y = int( b[0] ), int( b[1] );
                if ( x > y ) : x, y = y, x
                ++ y
            else:
                x, y = 0, int( a.split()[1] )
    
            print "Today Your Lucky Number Is %s" % roll( x, y )
            raw_input( "Enter anykey to Exit !" )
            return 1
    
        except ( ValueError, IndexError ):
            return 0
    
    while not controller():
        print "Sorry,Please Enter /roll + number"
    

    思路很明確 ... 重複呼叫函數的動作發生在函數外部 ... 由函數的回傳值控制 ...

    我很小的時候寫 GWBasic ... 唯一的流程控制是 goto ... 那是沒有辦法的事情 ...

    現在程式語言和程式設計思想都極大的發展了 ... 近十幾年來大家都不用 goto 了 ... 你也不能落後不是 ..?

    此外我順便提另一個問題 ... 你有註意到你做了很多重複的工作麼 ..?

    程式裡面各種 split ... 各種 choice ... 一模一樣的 except 邏輯寫了兩次 ...

    甚至連輸出的內容都重複打了很多次 ... 有想過用良好的程式結構來減少自己的輸入麼 ..?

    讀我上面那段範例程式碼的同時也考慮一下這個問題 ... 不懂歡迎問 ... 關注點不要只留在循環上恩 ...

    就是這樣啦 ...

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 11:26:32

    包裝到個函數中,錯誤時再呼叫一次就好啦。

    # today my lucky number
    from random  import choice
    
    def rollit():
        a =raw_input("Please enter /roll + number :")
    
        if a.startswith("/roll") :
            if a == "/roll":
                print "Today Your Lucky Number Is  %s"% roll(100)
                raw_input("Enter anykey to Exit !")
            elif "-" in a:
                try:
                    b = a.split(" ")[1]
                    c =b.replace("-"," ").split()[0]
                    d =b.replace("-"," ").split()[1]
                    if int(c)>int(d):
                        print choice(range(int(d),int(c)+1))
                    elif int(c)<int(d):
                        print choice(range(int(c),int(d)+1))
                except ValueError:
                    print "Sorry,Please Enter /roll + number"
                    raw_input("Enter anykey to Exit !")
            else:
                try:
                    b = a.split(" ")[1]
                    c = int(b)
                    print "Today Your Lucky Number Is  %s"% roll(c)
                    raw_input("Enter anykey to Exit !")
                except ValueError:
                    print "Sorry,Please Enter /roll + number"
                    raw_input("Enter anykey to Exit !")
    
    
        else:
            print "Sorry,Please Enter /roll + number!"
            rollit()
    
    def roll(c):
        y = choice(range(c))
        return  y
    
    rollit()
    

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 11:26:32

    把整個程式放入一個循環中
    輸入正確->跳出循環,程式結束
    輸入錯誤->執行循環,程式繼續

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 11:26:32

    第一個反應想到用遞迴

    回覆
    0
  • 取消回覆