猫史档案馆


【雪地游戏工作室】教程贴:风之杖系列1:with as

用户:TimeLinkForeverTimeLinkForever查看:9 回复:2 评论:9 创建时间:2020-01-16T14:58:27


这是雪地游戏工作室时之笛林克倾情奉献的教程贴:风之杖系列

center_image

接下来废话不多说,进入正题:Python中的with as关键字

首先来看看他们的语法!

with  expression as target:
    code

第一次看到是不是跟我一样:

center_image

明明每个字母都认识,连起来就看不懂啦?????

解释一下其实还是能懂的

with
#把
expression
#表达式
as
#塞进
target
#一个临时变量
code
#代码
with expression as target:
    code
#连起来:把一个表达式的值塞进一个临时变量,并运行下面与这个临时变量有关的代码

现在你可能就对这个关键字有了一些了解。

但是它对编程有什么帮助呢?

说白了,这就是个整理工具。

来看下面两组代码:

#普通方法
myfile=open("冰天s火鸣.py","r")
myfile=myfile.readlines()
return myfile
#with as 方法
with open("冰天s火鸣.py","r") as myfile:
    myfile=myfile.readlines()
    return myfile

(以上代码在我的电脑上可以运行,但是要注意:

1.第一种代码运行后要close()掉,不然在其他平台同时打开就会有问题

2.open如果出问题,试着把"r"改成encoding="utf-8")

可以看见,如果后续没有继续用到冰天s火鸣.py这份文件的话,with as

的代码就比普通的方法少些。

而且还有很重要的一点:

我们整理代码,最重要的是啥?

简洁明了,一看就懂!

所以我们使用with as能让代码更加的有条理,能让你清楚的从第一行就看出这块代码都调用了些什么。

你以为就这些了吗?

NONONO!

你是没见过这种神奇的东西

辣就是:

代替踹(Try)和Except

接下来讨论一个类把。

with as这玩意儿有2个类方法:

__enter__,__exit__

之前叫code的中间部分其实叫with_block

做好心理准备,接下来的内容是重中之重

emotion_编程猫_紧张emotion_编程猫_紧张emotion_编程猫_紧张emotion_编程猫_紧张emotion_编程猫_紧张emotion_编程猫_紧张

我们创建一个codemao类:

class Codemao(object):
    def __enter__(self):
        return self
    def __exit__(self,type,value,trace)
        print("编程猫错了")
        print(type,value,trace)
    def code(self):
        print(1/0)
with Codemao() as catcage:
    catcage.code()

只见它在经过__exit__的运行后,开始惨不忍睹的报错。

emotion_编程猫_搓头

看下面的代码

#上面的类懒得写,不写了,去掉__enter__和__exit__就可以啦

catcage=Codemao()
try:
    catcage.code()
except ZeroDivisionError:
    print("ZeroDivisionError")

虽然不会报错,但这个简单的程序,try比with好,但是大型的调试该怎么办呢?with能返回更多的信息供我们调试,但try不太行。所以,with更好。还有上面使用类与with结合的方法,也很好用讷。

总结:

with as 的运行过程与语法

#语法:
with expression as target:
    with_block
#运行过程:
try:
    __enter__()
    with_block
finally:
    __exit__()
    

with as的作用讲完了,大家都懂了把?

小测试

使用with as运行并返回以下类的错误参数type,value,trace

 

回复中五个人完成小测试我林克就更教程哈哈哈哈哈哈哈哈哈

记得点赞哟

emotion_编程猫_谢谢老板

 

 


回复

上一页1 页 / 共 1下一页
东雪莲东雪莲

喵喵喵

点赞0


评论


TimeLinkForeverTimeLinkForever

”以下类“的代码:

#???是需要填入的地方
class Codecat(object):
    def __enter__(???):
        ???
    def __exit__(???):
        ???
    def hey(self):
        print("hey"+5)
???

点赞0


评论