• python装饰器的应用案例


    目录

    一、过程编程

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

    三、二的加强版


    一、过程编程

    (一)需求:打印菱形

    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)
    

      

  • 相关阅读:
    phoneGap
    backbonejs使用
    优化后的光标插件
    选择文本,范围
    js最佳继承范型
    深入理解事件捕获冒泡
    keyCode,charCode,which
    与IE奋战的血泪史
    【程序员的自我修养】如何使用IRC
    【程序员的自我修养】写给新手程序员的一封信
  • 原文地址:https://www.cnblogs.com/andy9468/p/9844282.html
Copyright © 2020-2023  润新知