Python生成器、装饰器、异常

简介: 【10月更文挑战第15天】

【10月更文挑战第15天】
生成器的定义方式:在函数中使用yield

yield值:将值返回到调用处

我们需要使用next()进行获取yield的返回值

yield的使用以及生成器函数的返回的接收next()

def test():
    yield 1,2,3

t=test()
print(t)
#<generator object test at 0x01B77A48>
#生成器对象的意思


#我们在函数中使用这个yield关键字,那么这个函数就是一个生成器函数

#t存放的是生成器对象的信息
#yield的作用类似于return 将值返回到调用的地方

#我们如何获取这个1呢?

#next(生成器对象)
print(next(t))
#(1, 2, 3)

#yied返回的内容我们需要通过next()进行一个获取的操作

有yiled的函数被称为生成器函数

image.png

对于性质一来说的话,yield会将后面的数据进行返回,返回到调用处

对于性质二的话,我们运行完yield之后,这个函数的运行位置就会被记录下来了

然后我们在交互模式再次进行这个next()的使用,进行返回值的获取那么就会从上次函数中结束的位置进行开始寻找数据然后进行返回的操作

然后后面如果没有yield的话,有个print('abc')

那么这个函数会将abc进行返回的,但是最终会进行报错的

就像下图所示

image.png

从下面的图片我们可以看的出什么呢?

image.png

def test():
    yield 1,2,3
    print('abc')
    yield 'a'
t=test()
print(t)

print(next(t))
#(1, 2, 3)
print(next(t))
'''
abc
a
'''

我们在编辑模式第一次调用next()的时候打印出的返回值是1 2 3

我们在函数中又添加了一个yield关键字

然后我们在交互模式再次进行next的调用

这次的返回值是abc a

我们在调用next()的时候,这个我们会回到上一次yield结束的后面的一个位置

然后从那里开始寻找关键字yield进行数据的返回的操作

next()的作用就是获取yield后面的内容的

我们每次调用的时候就会回到上次yield结束的位置,从那个位置开始

yield和return的区别就是return会直接将函数进行结束,但是yield会保留此次的位置,下次调用的时候就从这个位置开始进行

yield只会中断,但是不会进行结束的操作

def testa():
    for i in range(1,10):
        yield i

t1=testa()
#获取yield返回值的方式:next()
print(next(t1))
#每次获取一个值,有多少个值就获取多少次
print(next(t1))
print(next(t1))
print(next(t1))
print(next(t1))
print(next(t1))
print(next(t1))
'''
1
2
3
4
5
6
7
'''
#如果我们超出了了的话就是会报错了
#因为最后一个yield后面没有数据了



t2=testa()
#获取yield返回值的方法二
for n in t2:
    print(n)

#我们通过for循环能够一次性拿完

#我们通过next()的时候我们需要的时候就可以进行调用,想拿几个就拿几个

print(next(t1))
#8
#我们需要用的时候就进行调用一下,不用就放着

对于获取yield我们有两种方法的,第一种就是进行Next函数的调用

第二种就是利用for循环,直接将对象当做条件进行循环,将这个函数中所有的yield后面的值进行返回

我们对于第一种的话,想什么时候用就什么时候用,随时能够进行调用的操作

image.png

装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象

image.png

image.png


'''在不改动函数的情况下,给函数添加内容
装饰器的定义:
1.嵌套函数
2.外函数返回内函数名
3.外函数中定义一个形参,形参用来接受被装饰的函数名信息
4.要添加的额外功能,写在内函数中

调用函数:函数名()

使用装饰器:@装饰器名(外部函数名)
'''
#定义装饰器
def funa(name):
    def funb():
        print('---开始执行函数---')
        #在这个中间执行被装饰的函数
        name()#这个形参是用来接受这个被装饰的函数名的信息
        '''
        name=testc
        name()=testc()
        '''

        print('---函数执行完毕---')
    return funb

#被装饰的函数
@funa
def testc():
    print('执行testc函数')

testc()

'''
---开始执行函数---
执行testc函数
---函数执行完毕---
'''
@funa
def testd():
    print('执行testd函数')
testd()
'''
---开始执行函数---
执行testd函数
---函数执行完毕--
'''

我们先进行装饰器的定义操作

1.嵌套函数

2.外函数返回内函数名

3.外函数中定义一个形参,形参用来接受被装饰的函数名信息

4.要添加的额外功能,写在内函数中

5.在内部函数中调用被装饰的函数,即外函数的函数名

我们的外函数有个形参name就是用来接受被装饰函数的函数名信息的

方便我们在内函数中进行调用

我们在被装饰的函数的定义上面加上 @外部函数名

那么就说明我们这个函数就已经被装饰好了

那么我们对testc进行调用的操作,那么就会运行我们之前在内部函数中做的装饰代码

总结:我们先会执行这个 @funa

@后面跟的是一个装饰器函数

然后就直接将这个testc的内容给到了name

给到name 之后我们就往后面走

执行内部函数,这个name=装饰的函数的函数名

我们先运行到@funa

然后就运行到def testc()

然后就def funa(name)

然后就运行到def funb()

运行到这个内部函数的时候

我们会直接返回这个funb()返回到被装饰的函数

就是返回到testc这里

那么到这里的话装饰就完成了

然后就直接跳到了testc()的带调用处

然后进行testc的调用的时候

我们就会直接调用装饰器内部函数

我们跳到testc()的地方的时候我们直接进行装饰器的内部函数的调用操作了

对于函数装饰的代码我们写在内部函数中

外部函数一定要定义形参,接受被装饰函数的函数名

不然我们在内部函数中无法进行被装饰函数的调用

那么装饰器的作用:在不改变原函数的情况下对函数进行一系列的装饰操作

就是一个外包操作的升级版本

def log(u):
    def aaa(name,pwd):
        d={'123456':{'pwd':'1234'},
              '1234567':{'pwd':'12345'}
             }
        if name in d:
            if pwd==d[name]['pwd']:
                print("登录成功")
                #调用被装饰的函数
                u(name,pwd)#外部参数的形参是u
            else:
                print("密码错误")

        else:
            print("用户不存在")
    return aaa


#取款
@log
def get_money(name,pwd):
    print(f"取款1000")
#查询
def set_money(name,pwd):
    print(f"存款1000")



get_money('1256','1234')

#通过装饰器我们能减少代码冗余的效果

不改变函数代码的情况下,对函数增加一系列的操作

image.png

相关文章
|
6天前
|
缓存 数据安全/隐私保护 Python
python装饰器底层原理
Python装饰器是一个强大的工具,可以在不修改原始函数代码的情况下,动态地增加功能。理解装饰器的底层原理,包括函数是对象、闭包和高阶函数,可以帮助我们更好地使用和编写装饰器。无论是用于日志记录、权限验证还是缓存,装饰器都可以显著提高代码的可维护性和复用性。
20 5
|
16天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
36 7
|
15天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
16天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
42 6
|
15天前
|
存储 缓存 Python
Python中的装饰器深度解析与实践
在Python的世界里,装饰器如同一位神秘的魔法师,它拥有改变函数行为的能力。本文将揭开装饰器的神秘面纱,通过直观的代码示例,引导你理解其工作原理,并掌握如何在实际项目中灵活运用这一强大的工具。从基础到进阶,我们将一起探索装饰器的魅力所在。
|
1月前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
54 11
|
2月前
|
测试技术 Python
Python中的装饰器:从入门到精通
【10月更文挑战第7天】本文旨在通过浅显易懂的方式,向读者介绍Python中装饰器的概念、用法和高级应用。我们将从装饰器的定义开始,逐步深入到如何创建和使用装饰器,最后探讨装饰器在实战中的应用。文章将结合代码示例,帮助读者更好地理解和掌握这一强大的工具。
|
2月前
|
缓存 开发者 Python
探索Python中的装饰器:从入门到实践
【9月更文挑战第36天】装饰器,在Python中是一种特殊的语法糖,它允许你在不修改原有函数代码的情况下,增加额外的功能。本文将通过浅显易懂的语言和实际代码示例,带你了解装饰器的基本原理,探索其背后的魔法,并展示如何在实际项目中运用这一强大工具。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往更高效、更优雅代码的大门。
63 11
|
18天前
|
开发者 Python
Python中的装饰器:从入门到实践
本文将深入探讨Python的装饰器,这一强大工具允许开发者在不修改现有函数代码的情况下增加额外的功能。我们将通过实例学习如何创建和应用装饰器,并探索它们背后的原理和高级用法。
34 5
|
24天前
|
设计模式 缓存 开发者
Python中的装饰器:从入门到实践####
本文深入探讨了Python中强大的元编程工具——装饰器,它能够以简洁优雅的方式扩展函数或方法的功能。通过具体实例和逐步解析,文章不仅介绍了装饰器的基本原理、常见用法及高级应用,还揭示了其背后的设计理念与实现机制,旨在帮助读者从理论到实战全面掌握这一技术,提升代码的可读性、可维护性和复用性。 ####
下一篇
DataWorks