ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[Python学习笔记]Python基础-15 关键字,上下文,异常处理

2022-08-17 15:03:41  阅读:172  来源: 互联网

标签:__ 15 Python self finally print return 上下文 def


finally关键字的使用

使用finally关键字可以在程序退出时继续执行需要执行的代码
不包含异常退出情况
例子:

try:
    pass
except:
    pass
else:
    pass
finally:
    pass  # 此处代码会在程序退出时继续执行完毕
  • finally关键字的注意事项
    • 如果函数中有finally语句,finally语句中的返回值会覆盖之前的返回值
def test(a,b):
    x = a + b
    return x
    return "hello"  # 此处语句不会被执行

def demo(a,b):
    try:
        x = a/b
    except ZeroDivisionError:
        print('除数不能为0')
    else:
        return x
    finally:
        return 'good' # 如果函数中有finally,finally中的返回值会覆盖之前的返回值

with语句的使用

  • with被称之为上下文管理器,可以关闭很多需要手动关闭的连接
    • 文件连接
    • socket连接
    • 数据库连接
  • with关键字后的对象,需要时限 __enter____exit__ 魔法方法

上下文管理器

  • with 语句后面的结果对象,需要重写 __enter____exit__ 方法
  • 当进入到with代码块时,会自动调用对象 __enter__ 方法中的代码
  • 当with代码块执行完成之后,会自动调用 __exit__ 方法
class Demo(object):
    def __enter__(self):
        print('__enter__方法被调用了')
        return self

    def __exit__(self,exc_type,exc_val,exc_tb):
        print('__exit__方法被调用了')

def create_obj():
    x = Demo()
    return x

with create_obj() as d:
    # 此处变量 d 不是 create_obj 的返回结果
    # 此处的 d 可以理解为 d = create_obj().__enter__()
    print(d)

自定义异常

  • 系统内置了很多异常
    • ZeroDivisionError:0作为分母
    • FileNotFoundError:文件不存在
    • ValueError:值错误
    • KeyError:key不存在
  • 使用 raise 关键字可以在程序出错时抛出异常
  • 通过定义一个错误类型,集成自 Exception 可以创建一个自定义的错误类型
class MyError(Exception):
    def __init__(self,x,y) -> None:
        self.x = x
        self.y = y

    def __str__(self) -> str:  # 通过重写自己定义的错误类的 __str__方法,可以自定义抛出的错误内容
        return '长度必须要在{}到{}之间'.format(self.x,self.y)
        

password = input('请输入你的密码:')
m = 12
n = 8
if n <= len(password) <= m:
    print('密码正确')
else:
    raise MyError(n,m)

高级装饰器

  • 高级装饰器本身带参数
def time(clock):
    def handle_action(fn):
        def do_action(name,game):
            if clock <= 21:
                fn(name,game)
            else:
                print ('太晚了可以睡觉了')
        return do_action
    return handle_action

@time(20)
def play_ganmes(name,game):
    print(name + '正在玩' + game)

play_ganmes('zhangsan','wzry')

可迭代对象

  • 可迭代对象
    • list
    • tuple
    • dict
    • set
    • str
    • range
    • filter
    • map
  • for...in...循环需要跟一个可迭代对象
# 测试一个对象是否算是可迭代对象
# 如果该实例是由collections.abc下的Iterable创建出来的
# 则该实例是一个可迭代对象
# 示例如下
from collections.abc import Iterable

class Demo(object):
    def __init__(self,x) -> None:
        self.x = x

class Demo_iter(object):
    def __init__(self,x) -> None:
        self.x = x

    def __iter__(self):  # 当类中存在__iter__方法时,使用该类创建出来的实例对象就是可迭代对象
        pass

d = Demo(100)
print(isinstance(d,Iterable))   # isinstance:用于判断一个实例对象是否是由指定的类创建出来的

d_iter = Demo_iter(100)
print(isinstance(d_iter,Iterable))  

names = []
print(isinstance(names,Iterable))

标签:__,15,Python,self,finally,print,return,上下文,def
来源: https://www.cnblogs.com/Lz-heng/p/16595205.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有