python从入门到就业-生成器函数、装饰器函数、递归函数

装饰器

作用:在函数体和函数名均不变的前提下,给一个函数附加另外一些额外代码。
方便代码的重用。
开放封闭原则:
1、已经写好的代码,尽可能不要修改
2、如果想要新增功能,可以在原有代码的基础上,单独进行扩展

单一职责原则
def CheckLogin(func):
    def inner():
        print("登陆验证...")
        func()
    return inner #闭包特性
def fss():
    print("发说说")
fss = CheckLogin(fss)
print(fss)
fss()     #登陆验证... 发说说
#语法糖 写法
def CheckLogin(func):
    def inner():
        print("登陆验证...")
        func()
    return inner #闭包特性

@CheckLogin #fss = CheckLogin(fss)等价于
def fss():
    print("发说说")
fss()   #登陆验证... 发说说
装饰器的 执行时间是立即执行
def check(func):
    print("xxx")
    def inner():
        print("登录验证操作...")
        func()
    return inner
@check #等于 fss = check(fss)
def fss():
    print("发说说") 
fss() #登录验证操作... 发说说

装饰器注意事项

装饰器叠加顺序:从上到下叠加,从下往上执行

def zhuangshiqi_line(func):
    def inner():
        print("-" * 30)
        func()
    return inner

def zhuangshiqi_star(func):
    def inner():
        print("*" * 30)
        func()
    return inner

@zhuangshiqi_line
@zhuangshiqi_star
def print_hello():
    print("Hello World")

print_hello() 
#------------------------------
#******************************
#Hello World

对有参数的函数进行装饰

def zsq(func):
    def inner(num):
        print("_" * 20)
        func(num)
    return inner

@zsq
def pnum(num):
    print(num)

pnum(10)
#____________________
#10
def zsq(func):
    def inner(*args, **kwargs): 
        print(args, kwargs) #(10, 20) {'num3': 666}
        func(*args, **kwargs)
    return inner

@zsq
def pnum(num1, num2, num3):
    print(num1, num2, num3)

pnum(10, 20, num3 = 666)#10 20 666

对有返回值的函数进行装饰

inner函数必须和func的形式一致
#通用装饰器
def zsq(func):
    def inner(*args, **kwargs): 
        print(args, kwargs) #(10, 20) {'num3': 666}
        result = func(*args, **kwargs)
        return result
    return inner

@zsq
def pnum(num1, num2, num3):
    print(num1, num2, num3)
    return num1 + num2 + num3
result = pnum(10, 20, num3 = 666)#10 20 666
print(result) #696

装饰器嵌套


先计算@后面的内容,把这个内容当作是装饰器。
def getzsq(char):
    def zsq(func):
        def inner(num):
            print(char * 30)
            func(num)
        return inner
    return zsq

@getzsq("-")
def pnum(num):
    print(num)
    
pnum(6) #------------------------------ 6

生成器

是一个特殊的迭代器,迭代器的抽象级别更高
拥有迭代器的特性:
1、惰性计算数据,节省内存
2.能够记录状态,并且使用next()函数,访问下一个状态
3.具有可迭代特性
但是,打造一个属于自己的迭代器比较复杂,因此,借助生成器这个方式。

创建

创建1将列表的推导式的[]改为()

#列表推导式
list1 = [x for x in range (10) if x % 2 == 0]
print(list1) #[0, 2, 4, 6, 8]

generate = (x for x in range (10) if x % 2 == 0)
print(generate)  #<generator object <genexpr> at 0x000001D7A63367B0>
#用next()访问
print(next(generate)) #0
#用next方法
print(generate.__next__()) #2
#用for访问 
for i in generate:
    print(i) #4 6 8

创建方式2 yield语句

#yield可以阻断当前函数执行
#使用next()或者__next__()都会让函数继续执行,当执行到下一个yield函数时候,会被暂停。
def test(): 
    print("hello world")
    yield 1 #状态值
    print("a")
    
    yield 2
    print(2)
    
    yield 3
    print(3)
g = test() 
print(g) #<generator object test at 0x000001D7A6350120>
print(next(g))#1
print("---")
print(next(g))#a 2
print(next(g))#2 3
print(next(g))#3 StopIteration:  
#会报错 没有下一个状态值
def test():
    for i in range(10):
        yield i
g = test()
print(next(g)) #0

send()方法

send方法有一个参数,指定的是上一次被挂起的yield语句的返回值
def test():
    res1 = yield 1 #先执行yield1 然后挂起 等到下一个next再执行赋值
    print(res1)
    res2 = yield 2
    print(res2)
g = test()
#可以给上一次被挂起的yield 传值
print(g.__next__()) #1
print(g.__next__()) #None 2
def test():
    res1 = yield 1 #先执行yield1 然后挂起 等到下一个next再执行赋值
    print(res1)
    res2 = yield 2
    print(res2)
g = test()
#可以给上一次被挂起的yield 传值
print(g.__next__()) #1
print(g.send("ooo")) #ooo 2 
def test():
    res1 = yield 1 #先执行yield1 然后挂起 等到下一个next再执行赋值
    print(res1)
    res2 = yield 2
    print(res2)
g = test()
#可以给上一次被挂起的yield 传值
print(g.send(None)) # 1 第一次必须传None 没有上一次
print(g.send(66)) # 66 2

close方法

def test():
    yield 1
    print("a")
    yield 2
    print("b")
    yield 3
    print("c")
g = test()
print(next(g)) #1
print(next(g)) #a 2
print(next(g)) #b 3 
def test():
    yield 1
    print("a")
    yield 2
    print("b")
    yield 3
    print("c")
g = test()
print(next(g)) #1
print(next(g)) #a 2
g.colse()#相当于把生成器的状态直接指到最后一个
print(next(g)) #b 3 

注意事项

插入return 语句
def test():
    yield 1
    print("a")
    yield 2
    print("b")
    yield 3
    print("c")
    return 10
g = test()
print(next(g)) #1
print(next(g)) #a 2
print(next(g)) #b 3 
print(next(g)) #StopIteration: 10 只要碰到return 就会报错 显示return的值
def test():
    yield 1
    print("a")
    return 10
    yield 2
    print("b")
    yield 3
    print("c")
    
g = test()
print(next(g)) #1
print(next(g)) #StopIteration: 10 只要碰到return 就会报错 显示return的值
print(next(g)) 
生成器只能用一次
用俩次需要重新创建
def test():
    yield 1
    print("a")
    yield 2
    print("b")
    yield 3
    print("c")
    
g = test()
for i in g: #可以把整个函数打印完毕 不会因为没有下一次的状态值而报错
    print(i)
for i in g:  #没作用
    print(i)

递归

def jiechen(n):
    if n == 1:
        return 1
    else:
        return n * jiechen(n-1)
print(jiechen(5)) #120

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值