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

本文详细介绍了如何修改idcheck.py脚本,使其能够检测长度为一的Python标识符,并识别Python关键字。通过使用Python的keyword模块和string库,脚本实现了对标识符合法性的判断,包括对关键字的识别和对标识符合法字符的验证。
部署运行你感兴趣的模型镜像

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

   我最初的代码是:

    

#!/usr/bin/env python

import string
import keyword
import 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.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(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 python

import string
import keyword
import sys
import traceback

try:
    #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" % idInput

except SystemExit:
    pass
except:
    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

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们正在讨论Python中的sys.exit(1)函数。根据用户的问题,他想知道这个函数是导致函数异常退出还是整个程序终止。根据引用[1]:sys.exit()会抛出一个SystemExit异常,这个异常如果没有被捕获,就会导致整个程序终止。如果被捕获,则可以在捕获的代码块中处理退出逻辑。引用[2]展示了一个例子:当用户输入'exit'时,调用sys.exit(),程序就会中断(即整个程序终止)。因此,sys.exit(1)的作用是终止整个程序,并返回状态码1(通常表示非正常退出)。但需要注意的是,它通过抛出SystemExit异常来实现,所以如果我们在try块中调用它,并且捕获了SystemExit异常,那么程序就不会立即终止,而是执行except块中的代码。总结:1. sys.exit(1)会终止整个程序(如果异常没有被捕获)。2.它实际上是通过抛出SystemExit异常来实现的,因此可以被捕获并处理。回答用户:sys.exit(1)会导致整个程序终止(除非捕获了SystemExit异常),并返回状态码1给操作系统。接下来,生成相关问题。</think>### Python中`sys.exit(1)`的作用 `sys.exit(1)`在Python中**会导致整个程序终止**,而非仅函数异常退出。其核心机制如下: 1. **触发系统退出** `sys.exit()`通过抛出`SystemExit`异常实现退出。当该异常未被捕获时,解释器会终止运行并返回指定的状态码(此处为`1`)。状态码`0`表示正常退出,非零值(如`1`)通常表示异常终止[^1]。 2. **函数退出的区别** - 函数内部调用`sys.exit()`会直接终止整个程序进程,而非仅退出当前函数。 - 若需仅退出函数,应使用`return`或抛出普通异常(如`ValueError`)。 3. **异常处理示例** 可通过捕获`SystemExit`实现自定义退出逻辑: ```python import sys try: sys.exit(1) # 触发退出 except SystemExit as e: print(f"程序终止,状态码: {e.code}") # 输出: "程序终止,状态码: 1" # 此处可执行清理操作,但最终程序仍会退出 ``` 4. **典型应用场景** - 命令行工具中遇到错误时返回非零状态码(如参数解析失败) - 满足特定条件(如文件不存在)时主动终止脚本 - 替代`exit()`确保跨平台行为一致[^2] > **关键区别**:`sys.exit()`终止整个进程;函数内的`return`仅退出当前函数作用域。若在未捕获`SystemExit`的线程中调用,可能导致主进程退出[^3]。 --- ### 相关问题 1. `sys.exit(1)``os._exit(1)`有何本质区别? 2. 如何在Python子线程中安全终止程序而不引发异常? 3. 状态码`1``2`在命令行工具中通常代表哪些错误类型? [^1]: `sys.exit()`通过`SystemExit`异常实现进程终止,状态码可通过`e.code`捕获。 [^2]: 在交互式环境中`sys.exit()`行为`exit()`类似,但脚本中更推荐`sys.exit()`保证一致性。 [^3]: 主线程外的`sys.exit()`需配合异常处理机制,否则可能导致非预期终止。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值