目录

一、过程编程

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

三、二的加强版


一、过程编程

(一)需求:打印菱形

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)

  

python装饰器的应用案例的更多相关文章

  1. Python装饰器使用规范案例详解

    由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25') ... >> ...

  2. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  3. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  4. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  5. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  6. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  7. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  8. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  9. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

随机推荐

  1. hadoop基础学习---数据管理策略

    上图中的ABCDE都代表默认大小64M的数据块 nameNode与dataNode之间有一个心跳机制,datanode每隔多秒钟定期的发送心跳到nameNode

  2. NGUI与EasyTouch结合使用

    用了EasyTouch插件一段时间了,小问题还是有一些,总体来说用起来还行.这篇文章我就来说说EasyTouch和NGUI的结合. 总体来说触摸屏幕也就三种情况. 1.触摸事件只响应NGUI部分,不响 ...

  3. 手机web不同屏幕字体大小高度自适应

    body{font-size:0.6rem:} <script> //使用rem策略,不断更新html的fontsize (function(){     function sizeHtm ...

  4. 第四章 Spring.Net 如何管理您的类___对象、对象工厂和应用程序上下文

    在前面一章我们介绍了依赖注入,控制反转的概念,以及自己动手搭建了一下Spring.Net的环境.通过这些操作,我们知道了Spring.Net 的核心是使用依赖注入或控制反转这种思想来管理业务对象,降低 ...

  5. 工作流JBPM_day01:7-使用流程变量

    工作流JBPM_day01:7-使用流程变量 工作流就像流水线 对应数据库中的一张表 ProcessVariableTest.Java import java.util.List; import or ...

  6. laravel 使用验证码

    1)php.ini需要开两个扩展 extension=php_fileinfo.dllextension=php_gd2.dll 2)使用composer安装类包 composer require m ...

  7. Python 文件类型

    Python的文件类型分为以下几种: 1. 源代码文件,也就是以 .py 为扩展名的文件,由 python 程序解释,不需要编译 2. 字节代码文件,python 源代码文件经过编译后生成的扩展名为 ...

  8. Unity随机Prefab,自动前往某点处理

    对与U3D  AI,看了下,自己做了小功能,以备后用啊! 一,在某区域随机产生某个对象 C# 文件名称为RadomAPoint.cs using UnityEngine; using System.C ...

  9. C++11新特性之七——final/override控制

    重载和重写的区别参见: C++继承中重载.重写.重定义的区别: 在了解C++11中的final/override关键字之前,我们先回顾一下C++关于重载的概念.简单地说,一个类A中声明的虚函数fun在 ...

  10. C++11新特性之0——移动语义、移动构造函数和右值引用

    C++引用现在分为左值引用(能取得其地址)和 右值引用(不能取得其地址).其实很好理解,左值引用中的左值一般指的是出现在等号左边的值(带名称的变量,带*号的指针等一类的数据),程序能对这样的左值进行引 ...