python - 脚本返回思路
高洛峰
高洛峰 2017-04-17 11:24:32
0
4
452

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(4)
PHPzhong

看你的程序仿佛看到很多年之前的我自己 ... 犹豫良久还是决定要写一下这个答案 ...

@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 逻辑写了两次 ...

甚至连输出的内容都重复打了很多次 ... 有想过用良好的程序结构来减少自己的输入么 ..?

读我上面那段示例代码的同时也考虑一下这个问题 ... 不懂欢迎问 ... 关注点不要只留在循环上恩 ...

就是这样啦 ...

洪涛

包装到个函数中,错误时再调用一次就好啦。

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

把整个程序放入一个循环中
输入正确->跳出循环,程序结束
输入错误->执行循环,程序继续

刘奇

第一反应想到用递归

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!