如何理解Python中with语句

本篇文章给大家分享的是如何理解Pythonwith语句的操作详解,内容挺不错的,希望可以帮助到有需要的朋友

 Num01–>with语句的来源

在Python2.5中with关键字被加入。它是用来替代try…except…finally…的模式。

Num02–>with语句的作用

with语句使用于对资源进行访问的场合。确保使用过程中不管是否发生异常,都会执行必要的“清理”操作,并释放资源。比如文件使用后自动关闭,线程中锁的自动获取和释放。

Num03–>with语句的语法格式

with EXPR [ as  VAR ]:    BLOCK        简单说明:    1,EXPR可以是任意表达式。    2,as  VAR是可选的。    3,BLOCK是with语句的语句体

登录后复制

加以说明:

1,计算EXPR,并获取一个上下文管理器。

2,上下文管理器的exit()方法被保存起来用于之后的调用。

3,调用上下文管理器的enter()方法

立即学习“Python免费学习笔记(深入)”;

4,如果with表达式包含as VAR,那么EXPR的返回值被赋值给VAR。

5,执行BLOCK中的表达式

6,调永上下文管理器的exit()方法。如果BLOCK的执行过程中发生了一个异常导致程序退出,那么异常中的type、value、和traceback(也就是sys.exc_info()的返回值)将作为参数传递给exit()方法,然后异常抛出在控制台。否则将传递三个None值。

以上过程,用代码表示如下:

mgr = (EXPR)exit = type(mgr).__exit__  # 这里没有执行value = type(mgr).__enter__(mgr)exc = Truetry:    try:           VAR = value  # 如果有 as VAR        BLOCK    except:        exc = False        if not exit(mgr, *sys.exc_info()):                   raise finally:       if exc:            exit(mgr, None, None, None)

登录后复制

注意:

1,如果上下文管理器中没有enter()或者exit()中的任意一个方法,那么解释器会抛出一个AttributeError.

2,在BLOCK中发生异常后,如果exit()方法返回一个可以被看成是True的值,那么这个异常就不会被抛出,后面的代码会继续执行。

Num04–>没有异常案例

class my_name:    def __enter__(self):        print("调用__enter__()方法")                return "xiaoke"    def __exit__(self, type, value, trace):        print("调用__exit__()方法")                def get_name():               return my_name()                with get_name() as name:    print("my  name  is :", name)    # 结果如下:    # 调用__enter__()方法    # my  name  is : xiaoke    # 调用__exit__()方法

登录后复制

Num05–>有异常案例

class number:    # with语句执行的时候调用    def __enter__(self):        print("调用_enter_()方法")        return self    # with语句执行完毕,结束的时候调用    def __exit__(self, type, value, trace):        print("type:", type)        print("value:", value)        print("trace:", trace)    # 当有异常的时候,那么就不会有返回值    def do_number(self):        num = 10 / 0        return num + 100with number()as result:    res = result.do_number()    print(res)    # 结果如下:    # 调用_enter_()方法    # type:     # value: pision by zero    # trace:     # Traceback (most recent call last):    #   File "E:/pycharmProject/Test49.py", line 56, in     #     res = result.do_number()    #   File "E:/pycharmProject/Test49.py", line 51, in do_number    #     num = 10 / 0    # ZeropisionError: pision by zero

登录后复制

Num06–>在Python3.5中加入,协程中使用with,要加入async关键字

官网代码:import asyncioasync def coro(name, lock):    print('coro {}: waiting for lock'.format(name))    async with lock:        print('coro {}: holding the lock'.format(name))        await asyncio.sleep(1)        print('coro {}: releasing the lock'.format(name))loop = asyncio.get_event_loop()lock = asyncio.Lock()coros = asyncio.gather(coro(1, lock), coro(2, lock))try:    loop.run_until_complete(coros)finally:    loop.close()

登录后复制

输出代码:

coro 1: waiting for lockcoro 1: holding the lockcoro 2: waiting for lockcoro 1: releasing the lockcoro 2: holding the lockcoro 2: releasing the lock

登录后复制

    文章参考资料如下:1,官网:https://www.python.org/dev/peps/pep-0343/2

以上就是如何理解Python中with语句的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2265312.html

(0)
上一篇 2025年2月27日 08:38:40
下一篇 2025年2月25日 04:22:20

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 深度解析Python之字典表达式

    本篇文章给大家分享的是Python之字典表达式的操作详解,内容挺不错的,希望可以帮助到有需要的朋友。 一个Python字典表达式谜题 我们来探究一下下面这个晦涩的 Python 字典表达式,以找出在 Python 解释器内部到底发生了什么。…

    编程技术 2025年2月27日
    200
  • Python代码实现图片文字的识别

    本篇文章给大家分享的是Python代码实现图片文字识别,内容挺不错的,希望可以帮助到有需要的朋友 我们以识别诗词为例 下面是我们要识别的图片 先看下效果图 我们运行代码后识别的结果,有几个字没有正确识别,但是大多数字都能识别出来。 风急天高…

    2025年2月27日 编程技术
    200
  • 关于Python中的range 对象是不是迭代器的探讨

    迭代器(iterator)是惰性可迭代对象(lazy iterable),range 函数在 python 3 中是一个惰性的可迭代对象,那么 range 是不是迭代器呢?为什么。 TLNR:Python 3 中的 range 对象(Pyt…

    2025年2月27日 编程技术
    200
  • 详解Python的标准输入输出

    本篇文章给大家分享的是详解Python的标准输入输出,内容挺不错的,希望可以帮助到有需要的朋友 一、标准输入输出 1、打印到屏幕 产生输出的最简单方法是使用print语句,可以通过用逗号分隔零个或多个表达式。这个函数传递表达式转换为一个字符…

    编程技术 2025年2月27日
    200
  • python实现两个文件合并功能

    这篇文章主要为大家详细介绍了python实现两个文件合并功能,一个简单的文件合并程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文将会分析一个文件合并的程序,并指出在合并文件过程中需要注意的问题。 下面是需要合并的文件示例: 立即…

    2025年2月27日
    200
  • Python中一行和多行import模块问题_python

    我们通过本篇文章给大家分析了为什么python不建议使用一行import所有模块的原因,有兴趣的朋友学习下。 Python 不建议用一行 import 所有模块,而是推荐用多行 import 来导入模块。更多的是出于操作便利性的原因,与代码…

    编程技术 2025年2月27日
    200
  • python之DataFrame实现excel合并单元格_python

    这篇文章主要为大家详细介绍了python之dataframe实现excel合并单元格,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在工作中经常遇到需要将数据输出到excel,且需要对其中一些单元格进行合并,比如如下表表格,需要根据A列…

    2025年2月27日 编程技术
    200
  • 利用python执行shell脚本 并动态传参 及subprocess基本使用

    本篇文章给大家分享了利用python执行shell脚本 并动态传参  及subprocess基本使用,有感兴趣的小伙伴可以看一看 最近工作需求中 有遇到这个情况  在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行she…

    2025年2月27日
    200
  • Python 字典(Dictionary)操作详解_python

    这篇文章主要介绍了python 字典(dictionary)的详细操作方法,需要的朋友可以参考下 Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。一、创建字典字典由键和对应值成对组成。字典也被…

    编程技术 2025年2月27日
    200
  • 一篇不错的Python入门教程_python

    今天给大家分享一篇不错的python入门教程,有兴趣的朋友可以看一下 原文 http://www.hetland.org/python/instant-hacking.php Instant Hacking[译文] 译者: 肯定来过    …

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论