python中,exit,return,sys.exit()等的区别与使用方法

来源:互联网 发布:续资治通鉴知乎 编辑:程序博客网 时间:2024/06/07 13:25

    有这样一道题目:  字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 keyword.kelist)来帮你.

   我最初的代码是:

    

#!/usr/bin/env pythonimport stringimport keywordimport sys#Get all keyword for python#keyword.kwlist#['and', 'as', 'assert', 'break', ...]keyWords = keyword.kwlist#Get all character for identifier#string.letters ==> 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'#string.digits  ==> '0123456789'charForId = string.letters + "_"numForId = string.digitsidInput = raw_input("Input your words,please!")if idInput in keyWords:    print "%s is keyword fot Python!" % idInputelse:    lenNum = len(idInput)    if(1 == lenNum):        if(idInput in charForId and idInput != "_"):            print "%s is legal identifier for Python!" % idInput        else:            #It's just "_"            print "%s isn't legal identifier for Python!" % idInput    else:        if(idInput[0:1] in charForId):            legalstring = charForId + numForId            for item in idInput[1:]:                if (item not in legalstring):                    print "%s isn't legal identifier for Python!" % idInput                    sys.exit(0)            print "%s is legal identifier for Python!2" % idInput        else:            print "%s isn't legal identifier for Python!3" % idInput                                                                

    代码完毕后,我测试每一条分支,测试到分支时,必须输入_d4%等包含非法字符的标识符才能进行测试,我最初以为,sys.exit(0)---正常退出脚本,sys.exit(1)非正常退出脚本,但是实际情况是/9sys.exit(1),仅输出返回码不同): 

    

  if (item not in legalstring):      print "%s isn't legal identifier for Python!" % idInput     sys.exit(0)
Input your words,please!_d4%_d4% isn't legal identifier for Python!Traceback (most recent call last):  File "E:/python/idcheck.py", line 37, in <module>    sys.exit(0)SystemExit: 0>>> 

    由此可见,这样做没有达到我预期如下输出的效果,那么,问题在哪里呢?在于sys.exit()始终会抛出一个SystemExit异常。

Input your words,please!_d4%_d4% isn't legal identifier for Python!


#!/usr/bin/env pythonimport stringimport keywordimport sysimport tracebacktry:    #Get all keyword for python    #keyword.kwlist    #['and', 'as', 'assert', 'break', ...]    keyWords = keyword.kwlist    #Get all character for identifier    #string.letters ==> 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'    #string.digits  ==> '0123456789'    charForId = string.letters + "_"    numForId = string.digits    idInput = raw_input("Input your words,please!")    if idInput in keyWords:        print "%s is keyword fot Python!" % idInput    else:        lenNum = len(idInput)        if(1 == lenNum):            if(idInput in charForId and idInput != "_"):                print "%s is legal identifier for Python!" % idInput            else:                #It's just "_"                print "%s isn't legal identifier for Python!" % idInput        else:            if(idInput[0:1] in charForId):                legalstring = charForId + numForId                for item in idInput[1:]:                    if (item not in legalstring):                        print "%s isn't legal identifier for Python!" % idInput                        sys.exit()                print "%s is legal identifier for Python!2" % idInput            else:                print "%s isn't legal identifier for Python!3" % idInputexcept SystemExit:    passexcept:    traceback.print_exc()
 

上面的代码获取sys.exit()抛出的SystemExit异常。

return:在定义函数时从函数中返回一个函数的返回值,终止函数的执行。

exit:下面的代码中,如果把sys.exit()替换成exit,则exit仅仅跳出离它最近的for循环, print "%s is legal identifier for Python!2" % idInput语句会被输出,这里,exit的作用类似于break. 但实际上break和exit作用并不同

    
                for item in idInput[1:]:                    if (item not in legalstring):                        print "%s isn't legal identifier for Python!" % idInput                        sys.exit()                print "%s is legal identifier for Python!2" % idInput
原创粉丝点击