zl程序教程

您现在的位置是:首页 >  后端

当前栏目

python装饰器的应用案例

2023-09-14 09:00:35 时间

目录

一、过程编程

二、面向装饰器和函数的编程

三、二的加强版

 


 

 

一、过程编程

(一)需求:打印菱形

1、空格、*号组成的菱形

2、输入菱形上半部分的行数即可打印

3、支持循环输入

(二)代码

from sys import stdout

while True:
    # n = 3
    num_str = input("请输入菱形上部的正三角的行数:")
    if num_str.isdigit():  # 判断字符串是否为纯整数字组成
        n = int(num_str)
        for i in range(1, n + 1):
            for j in range(1, n - i + 1):
                stdout.write(' ')
            for k in range(1, 2 * i - 1 + 1):
                stdout.write('*')
            print()

        for i in range(1, n - 1 + 1):
            for j in range(1, i + 1):
                stdout.write(' ')
            for k in range(1, 2 * (n - i) - 1 + 1):
                stdout.write('*')
            print()

    else:
        print("请输入整数!!!")

  

 

二、面向装饰器和函数的编程

(一)需求:打印菱形

1、空格、*号组成的菱形

2、输入菱形上半部分的行数即可打印。

3、支持循环输入

4、输入“q”、“exit”可以退出循环

 

 

(二)代码

简单的分析:

1、打印菱形:print_diamond(n)

2、验证输入是否是合法数字:@verify_number

3、永循环和n输入:@forever

这3层逻辑,分离开来。

 

from sys import stdout

def forever(fun):
    def inner():
        print("循环")
        while True:
            # nonlocal n
            n = input("请输入菱形上部的正三角的行数:")
            if n == "q" or n == "exit":
                print("程序已退出!")
                break
            fun(n)

    return inner


def verify_number(fun):
    def inner(n):
        print("验证输入的有效性")
        if isinstance(n, int) or n.isdigit():  # 判断字符串是否为纯整数字组成
            n = int(n)
            fun(n)
        else:
            print("请输入整数!!!")

    return inner


@forever
@verify_number
def print_diamond(n):
    for i in range(1, n + 1):
        for j in range(1, n - i + 1):
            stdout.write(' ')
        for k in range(1, 2 * i - 1 + 1):
            stdout.write('*')
        print()
    for i in range(1, n - 1 + 1):
        for j in range(1, i + 1):
            stdout.write(' ')
        for k in range(1, 2 * (n - i) - 1 + 1):
            stdout.write('*')
        print()


print_diamond()

  

三、二的加强版

from sys import stdout

def forever(fun):
    def inner(*args, **kwargs):
        print("循环")
        while True:
            if len(args):
                if len(args) == 1:
                    n = args[0]  # 获取第一个位置参数
                    args = ()  # 清空,避免重复循环
                    if n == "q" or n == "exit":
                        print("程序已退出!")
                        break
                    fun(n)
                else:
                    print("参数多了")
                    break
            else:
                n = input("请输入菱形上部的正三角的行数:")
                if n == "q" or n == "exit":
                    print("程序已退出!")
                    break
                fun(n)

    return inner


def verify_number(fun):
    def inner(n):
        print("验证输入的有效性")
        if isinstance(n, int) or n.isdigit():  # 判断字符串是否为纯整数字组成
            n = int(n)
            fun(n)
        else:
            print("请输入整数!!!")

    return inner


@forever
@verify_number
def print_diamond(n):
    for i in range(1, n + 1):
        for j in range(1, n - i + 1):
            stdout.write(' ')
        for k in range(1, 2 * i - 1 + 1):
            stdout.write('*')
        print()
    for i in range(1, n - 1 + 1):
        for j in range(1, i + 1):
            stdout.write(' ')
        for k in range(1, 2 * (n - i) - 1 + 1):
            stdout.write('*')
        print()


print_diamond(4)

  

其他;

一个已经存在 10 年,却被严重低估的库

https://mp.weixin.qq.com/s/oEc_m1_-hrRt1oYjvSfm8g

恶补了 Python 装饰器的六种写法,你随便问~

https://mp.weixin.qq.com/s?__biz=MzIzMzMzOTI3Nw==&mid=2247494951&idx=1&sn=43b65fade87940be918ff1ff066b9ca8&chksm=e8858dc5dff204d3571414164e63a1de715499418805477d012104fa12e6a2577ef5fa58e6a8&scene=21#wechat_redirect