函数的进阶

1  闭包

        如果在一个函数的内部定义了另一个函数,**外部的我们叫他外函数**,**内部的我们叫他内函数。

       闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数中声明的参数或变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

```python
def outer(a):
    def inner(b):
        return a+b
    return inner
```

函数inner就被包括在函数outer内部,这时outer内部的所有局部变量,对inner都是可见的。但是反过来就不行,inner内部的局部变量,对outer就是不可见的。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

```python
# 获取最外层的outer方法的返回值:inner
res = outer(5)
print(res(6))
```

> 注意:外层函数的变量将持久地保存在内存中。

      

  闭包函数:声明在一个函数中的函数,叫做闭包函数

# 闭包  闭包应用于数据共享
'''def outer(a):
    def inner(b):
        return a+b
    return inner

# res引用内部函数inner,并保存了外部函数参数的状态
res = outer(5)

print(res(3))

'''def counter(intial_value=0):
    count = [intial_value] # 使用列表来存储数值,以便在内部函数中修改

    def incerement():
        #增加数量
        count[0] += 1
        return count[0]

    def decrement():
        # 增加数量
        count[0] -= 1
        return count[0]

    # 返回两个内部函数
    return incerement,decrement

#创建闭包实列
inc, dec = counter(10)

# 使用闭包
print(inc()) # 输出11
print(dec()) # 输出10

'''

2 装饰器

        装饰器是闭包的一种应用。装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。 

# 开启事务
核心业务处理
# 提交/回滚事务

> 可以理解为Spring中的AOP

示例一:
def Transaction(func):
    def wrapper():
        print("开启事务处理")
        func()
        print("提交事务处理")
    return wrapper

@Transaction
def hello():
    print("hello python")
    
hello()
print(hello.__name__)   
 

> 注意:当使用装饰器@Transaction修饰方法时,`hello.__name__`返回的方法名称就不是当前hello方法了,而是被装饰器中的wrapper方法所取代。

示例二:带参数的装饰器

装饰器中可以传入参数,先形成一个完整的装饰器,然后再来装饰函数,当然函数如果需要传入参数也 是可以的,用不定长参数符号就可以接收。
def logging(level='debug'):
    print(level)
    def outer_wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print(f"{level}: enter {func.__name__}()")
            return func(*args, **kwargs)
        return inner_wrapper
    return outer_wrapper
    
@logging("info")
def hello():
    print("hello python")

hello()

> 注意:@logging装饰器带括号和不带括号的区别。
>
> 1) @logging不带括号,hello方法名作为参数传入,则在level参数接收到的是hello方法;
> 2) @logging()带括号,则使用logging中的level默认参数或者传入参数覆盖level默认参数;
def logging(logfile='out.txt'):
    def decorator(func):
        def wrapped_function(*args, **kwargs):
            log_string = func.__name__ + "被调用了"
            # 打开logfile,并写⼊内容
            with open(logfile, 'a') as opened_file:
                # 现在将⽇志打到指定的logfile
                opened_file.write(log_string + '\n')
        return wrapped_function
    return decorator

@logging()
def hello():
    pass

hello()

3 实战案例:电影管理系统

movies = [{"no": "1292052", "name": "肖申克的救赎", "rating": 9.7, "inq": "希望让人自由。"},
          {"no": "1291546", "name": "霸王别姬", "rating": 9.6, "inq": "风华绝代。"},
          {"no": "1292720", "name": "阿甘正传", "rating": 9.5, "inq": "一部美国近现代史。"},
          {"no": "1295644", "name": "这个杀手不太冷", "rating": 9.4, "inq": "怪蜀黍和小萝莉不得不说的故事。"},
          {"no": "1292722", "name": "泰坦尼克号", "rating": 9.4, "inq": "失去的才是永恒的。"},
          {"no": "1292063", "name": "美丽人生", "rating": 9.6, "inq": "最美的谎言。"},
          {"no": "1291561", "name": "千与千寻", "rating": 9.4, "inq": "最好的宫崎骏,最好的久石让。"},
          {"no": "1295124", "name": "辛德勒的名单", "rating": 9.5, "inq": "拯救一个人,就是拯救整个世界。"},
          {"no": "3541415", "name": "盗梦空间", "rating": 9.3, "inq": "诺兰给了我们一场无法盗取的梦。"},
          {"no": "3011091", "name": "忠犬八公的故事", "rating": 9.4, "inq": "永远都不能忘记你所爱的人。"}]

 

- 查询显示所有的电影方法
- 增加电影的方法 
- 电影集合排序,默认根据评分排序 
- 删除电影的方法,如果没有则默认删除最后一个 
- 修改电影的方法 
- 查询分页的方法(可以完成评分筛选)

  • 31
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值