鱼C论坛

 找回密码
 立即注册
查看: 1798|回复: 0

[技术交流] python 入门L34丰富的else语句

[复制链接]
发表于 2017-7-23 19:21:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1 和if 搭配:要么怎样,要么不怎样
2 和while和for循环搭配,else只在循环顺利完成后执行,也就是说当循环中间执行break跳出循环后else语句将不被执行。else和try except语句配合使用在不出现错误时才会执行else后面的语句。
def showmaxfactor(num):
        count=num//2
        while count>1:
                if num%count ==0:
                        print('%d最大的约数是%d'%(num,count))
                        break
                count-=1
        else:
                print('%d是素数'%num)
num=int(input('请输入一个数:'))
showmaxfactor(num)

try:
    int('123')
except ValueError as reason:
    print('出错'+ str(reason))
else:
    print('no error')
3简洁的with语句:
使用with语句可以在使用完文件后自动帮你关闭
try:
    f=open('data.txt','w')
    for each_line in f:
        print(each_line)
except OSError as reason:
    print('出错了:' + str(reason))
finally:
    f.close()
这里finally试图关闭一个并不存在的文件,会出错。
使用with可以帮助我们,在文件被打开后关闭文件。
try:
    with open('data.txt','w') as f:
        for each_line in f:
            print(each_line)
except OSError as reason:
    print('出错了:' + str(reason))
with语句原理
with 语句会自动处理文件的打开和关闭,如果中途出现异常,会执行清理代码,然后确保文件自动关闭。

实际上,在with后面的代码块抛出任何异常时,__exit__() 方法被执行。正如例子所示,异常抛出时,与之关联的type,value和stack trace传给 __exit__() 方法,因此抛出的ZeroDivisionError异常被打印出来了。开发库时,清理资源,关闭文件等等操作,都可以放在 __exit__ 方法当中。

另外,__exit__ 除了用于tear things down,还可以进行异常的监控和处理,注意后几个参数。要跳过一个异常,只需要返回该函数True即可。

下面的样例代码跳过了所有的TypeError,而让其他异常正常抛出。

def __exit__(self, type, value, traceback):
    return isinstance(value, TypeError)
总之,with-as表达式极大的简化了每次写finally的工作,这对保持代码的优雅性是有极大帮助的。

如果有多个项,我们可以这么写:

with open("x.txt") as f1, open('xxx.txt') as f2:
    do something with f1,f2
因此,Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

评分

参与人数 1鱼币 +2 收起 理由
小甲鱼 + 2

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 23:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表