Skr-Eric的Python课堂(十四)——Python的闭包和装饰器(难点)

闭包 closure

  什么是闭包

    闭包是指引用了此函数外部变量的函数

    如果一个内嵌函数访问了外部嵌套函数的变量,则这个内嵌函数就是闭包

  闭包必须满足三个条件:

    1. 必须有一个内嵌函数

    2. 内嵌函数必须引用外部函数中的变量

    3. 外部函数返回值必须是内嵌函数

  示例:

# 写一个函数来创建 x的y次方的函数
def make_power(y):
    def fn(x):
        return x ** y
    return fn

pow2 = make_power(2)
print('5的方平是:', pow2(5))

def pow3(x):
    return x ** 3

pow3 = make_power(3)
print('6的三次方是:', pow3(6))
print('5的三次方是:', pow3(5))

pow10 = make_power(10)
print("2的十次方法:", pow10(2))
# 用闭包来创建任意的函数
# f(x)  = ax2 + bx + c

def get_fx(a, b, c):
    def fx(x):
        return a * x ** 2 + b * x + c
    return fx

f123 = get_fx(1, 2, 3)
print(f123(20))
print(f123(50))

f654 = get_fx(6, 5, 4)
print(f654(10))  # ...

装饰器 decorator 

  什么是装饰器

    装饰器是一个函数,主要作用是用来包装另一个函数或类(后面才讲)

    包装的目的是在不改变原函数(或类名)的情况下改变被包装对象 的行为

函数装饰器

  是指装饰器是一个函数,传入的是一个函数,返回的是一个函数

  语法:

    def 装饰器函数名(参数):

        语句块

        return 函数对象

    @装饰器函数名<换行>

    def 函数名(形参列表):

        语句块

  原理:

    被装饰函数的变量(函数名)绑定装饰器函数调用后的返回的函数

  示例:

# 此示例示意装饰器函数的定义和调用及装饰原理
def mydeco(fn):  # <<<---- 装饰器函数
    def fx():
        print("fx被调用")
    return fx

@mydeco
def myfun():
    print("myfun被调用")

# 上述 mydeco的原理是在 def myfun语句调用之后加了如下语句
# myfun = mydeco(myfun)

myfun()  # 调用myfun
# 此示例示意装饰器函数用来包装被装饰函数
def mydeco(fn):  # <<<---- 装饰器函数
    def fx():
        print("----这是被装饰函数调用之前----")
        fn()  # 调用被装饰函数
        print("++++这是被装饰函数调用之后++++")
    return fx

@mydeco
def myfun():
    print("myfun被调用")

myfun()  # 调用myfun
# 此示例示意装饰器的应用场合及功能
# ------ 以下是小李写的一个装饰器函数------
def privileged_check(fn):
    def fx(name, x):
        print("正在进行权限验证.....")
        if True:
            fn(name, x)
        else:
            print("权限验证失败")
    return fx

# ------ 以下是Eric写的程序-------
@privileged_check
def savemoney(name, x):  # 存钱业务
    print(name, '存钱', x, '元')

@privileged_check
def withdraw(name, x):
    print(name, '取钱', x, '元')

# --------以下是调用者小张写的程序-------
savemoney('小王', 200)
savemoney('小赵', 400)

withdraw('小李', 500)
# 此示例示意装饰器的应用场合及功能
# ------ 以下是小李写的一个装饰器函数------
def privileged_check(fn):
    def fx(name, x):
        print("正在进行权限验证.....")
        if True:
            fn(name, x)
        else:
            print("权限验证失败")
    return fx


def message_send(fn):
    def fy(n, money):
        # print('-----')
        fn(n, money)  # 调用被装饰函数
        print("正在发送短信给", n, '...')
    return fy


# ------ 以下是Eric写的程序-------
@message_send
@privileged_check
def savemoney(name, x):  # 存钱业务
    print(name, '存钱', x, '元')
# 实质:
# savemoney = privileged_check(savemoney)
# savemoney = message_send(savemoney)


@privileged_check
def withdraw(name, x):
    print(name, '取钱', x, '元')

# --------以下是调用者小张写的程序-------
savemoney('小王', 200)
# savemoney('小赵', 400)
# withdraw('小李', 500)

 

函数的文档字符串:

  函数内第一次未赋值给任何变量的字符串是此函数的文档字符串

  语法:

    def 函数名(参数列表):

        '函数文档字符串'

        语句块

  说明:

    1. 文档字符串通常用来说明函数的功能和使用方法

    2. 在交互模式下,输入:

        >>> help(函数名) 可以查看函数的文档字符串

    3. 函数的文档字符串绑定在函数的__doc__属性上

  示例:

def mysum(n):
    '''mysum 函数用来求
    1 + 2 + 3 + .... + n 的和
    '''
    return 100

    >>> help(mysum)

函数的 __doc__ 属性

   __doc__ 属性用于记录文档字符串

 

函数的 __name__ 属性

  __name__属性用于记录函数名

 

说明:

  以双下划线开头,以双下划线结尾的标识符通常代表python的特殊变量

 

函数定义的完整语法:

  [@装饰器名1]

  [@装饰器名2]

  [...]

  def 函数名(位置形参, *元组形参名, 命名关键字形参, **字典形参):

      '文档字符串'

      语句块

 

今天没作业~吼吼吼~~~

 

想要看更多的课程请微信关注SkrEric的编程课堂

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以!一般来说,Python 写小游戏最简单的方式就是使用 Pygame 库,它可以让你创建出有趣的游戏程序。如果你想更深入地学习,可以参考 Python 官方文档中的教程,也可以看一些其他的书籍或教程。 ### 回答2: 好的,我来为您介绍一个简单的Python小游戏——猜数字游戏。 猜数字游戏是一个经典的游戏,在这个游戏中,计算机会随机生成一个数字,玩家需要不断猜测这个数字是多少,直到猜中为止。下面是一个Python实现的示例代码: ```python import random def guess_number(target): guess = None count = 0 while guess != target: guess = input("请输入一个数字:") guess = int(guess) count += 1 if guess < target: print("猜小了,请再试试!") elif guess > target: print("猜大了,请再试试!") else: print("恭喜你,猜对了!你总共猜了{}次。".format(count)) if __name__ == '__main__': target = random.randint(1, 100) guess_number(target) ``` 在这个代码中,我们首先使用`import random`引入random模块,以便随机生成待猜的数字。 在`guess_number`函数中,我们使用一个`while`循环,不断提示玩家输入数字,并将其转换为整数类型。然后与目标数字进行比较,根据猜测的结果提示玩家继续猜测。 当玩家猜中目标数字时,会输出恭喜信息以及玩家猜测的次数。 最后在`if __name__ == '__main__':`部分,我们使用`random.randint(1, 100)`生成1至100之间的随机整数作为目标数字,并调用`guess_number`函数开始游戏。 希望这个简单的示例能帮助您了解如何使用Python编写一个小游戏! ### 回答3: Python是一种广泛应用于软件开发和数据分析的编程语言,也可以用来编写小游戏。以下是一个简单的Python小游戏示例: ```python import random def guess_number(): target = random.randint(1, 100) guess = 0 num_attempts = 0 print("欢迎参加猜数字游戏!") while guess != target: guess = int(input("请输入一个猜测的数字:")) num_attempts += 1 if guess < target: print("猜测的数字太小了!") elif guess > target: print("猜测的数字太大了!") print(f"恭喜你猜对了!你一共猜了{num_attempts}次。") guess_number() ``` 这个小游戏是一个猜数字游戏,程序会随机生成一个1到100之间的数字,玩家需要通过输入数字进行猜测,直到猜对为止。程序会根据玩家的猜测提示猜测的数字是太大还是太小。最后,程序会告诉玩家猜对了,并显示玩家一共猜了多少次。 这只是一个简单示例,你可以根据自己的兴趣和创造力编写更复杂的小游戏。Python的易学易用使其成为编写小游戏的理想选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值