返回顶部
首页 > 资讯 > 后端开发 > Python >Python之路【第七篇】:Python
  • 589
分享到

Python之路【第七篇】:Python

之路第七篇Python 2023-01-31 00:01:45 589人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一、装饰器 1、装饰器的概念 #装饰器定义:本质就是函数,功能是为其他函数添加附加功能 二、装饰器需要遵循的原则 #原则: 1、不修改被修饰函数的源代码 2、不修改被修饰函数的调用方式 装饰器他人的器具,本事可以是任意可调用对象,被

一、装饰器

1、装饰器的概念

#装饰器定义:本质就是函数,功能是为其他函数添加附加功能

二、装饰器需要遵循的原则

#原则:
1、不修改被修饰函数的源代码
2、不修改被修饰函数的调用方式

装饰器他人的器具,本事可以是任意可调用对象,被装饰者也可以是任意可调用对象。

#强调装饰器的原则:
1、不修改被装饰对象的源代码
2、不修改被装饰对象的调用方式

#装饰器的目标:
在遵循1和2原则的前提下,为被装饰的对象添加新功能

三、实现装饰器知识储备

装饰器=高阶函数+函数嵌套+闭包

四、高阶函数

高阶函数的定义:
1、函数接收的参数是一个函数名
2、函数的返回值是一个函数名
3、满足上述条件任意一个,都可称之为高阶函数

五、函数嵌套

def father(name):
    print('from father %s' %name)
    def son():
        print('from the son')
        def grandson():
            print('from the grandson')
        grandson()
    son()

father('朱锐')

六、闭包

1、闭包

def father(name):
    print('from father %s' %name)
    def son():
        print('from the son')
        def grandson():
            print('from the grandson')
        grandson()
    son()

father('朱锐')

'''
闭包
'''

def father(name):
    def son():
        # name='simon1'
        print('我的爸爸是%s' %name)
        def grandson():
            print('我的爷爷是%s' %name)
        grandson()
    son()
father('simon')

2、函数闭包装饰器基本实现

import time
def timmer(func):
    def wrapper():
        # print(func)
        start_time=time.time()
        func() #就是在运行test()
        stop_time=time.time()
        print('运行时间是%s' %(stop_time-start_time))
    return wrapper
@timmer #语法糖,这个是重点

def test():
    time.sleep(3)
    print('test函数运行完毕')

# res=timmer(test) #返回的是wrapper的地址
# res() #执行的是wrapper()

# test=timmer(test) #返回的是wrapper的地址
# test() #执行的是wrapper()

test()
'''
语法糖
'''
# @timmer #就相当于 test=timmer(test)

3、函数闭包加上返回值

#未加返回值
import time
def timmer(func):
    def wrapper():
        # print(func)
        start_time=time.time()
        func() #就是在运行test()
        stop_time=time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return 123
    return wrapper
@timmer #语法糖

def test():
    time.sleep(3)
    print('test函数运行完毕')
    return '这是test的返回值'
res=test() #就是在运行wrapper
print(res)

运行结果如下:
C:\python35\python3.exe G:/Python_s3/day20/加上返回值.py
test函数运行完毕
运行时间是3.000171661376953
123
#加上返回值
import time
def timmer(func):
    def wrapper():
        # print(func)
        start_time=time.time()
        res=func() #就是在运行test()     ##主要修改这里1
        stop_time=time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res     ##修改这里2
    return wrapper
@timmer #语法糖

def test():
    time.sleep(3)
    print('test函数运行完毕')
    return '这是test的返回值'
res=test() #就是在运行wrapper
print(res)

运行结果如下:
C:\Python35\python3.exe G:/python_s3/day20/加上返回值.py
test函数运行完毕
运行时间是3.000171661376953
这是test的返回值

4、函数闭包加上参数

import time
def timmer(func):
    def wrapper(name,age):   #加入参数,name,age
        # print(func)
        start_time=time.time()
        res=func(name,age) ##加入参数,name,age
        stop_time=time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res
    return wrapper
@timmer #语法糖

def test(name,age): #加入参数,name,age
    time.sleep(3)
    print('test函数运行完毕,名字是【%s】,年龄是【%s】' % (name,age))
    return '这是test的返回值'
res=test('simon',18) #就是在运行wrapper
print(res)

使用可变长参数代码如下:达到的效果是传参灵活

import time
def timmer(func):
    def wrapper(*args,**kwargs): #test('simon',18)  args=('simon') kwargs={'age':18}
        # print(func)
        start_time=time.time()
        res=func(*args,**kwargs) #就是在运行test()     func(*('simon'),**{'age':18})
        stop_time=time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res
    return wrapper
@timmer #语法糖

def test(name,age):
    time.sleep(3)
    print('test函数运行完毕,名字是【%s】,年龄是【%s】' % (name,age))
    return '这是test的返回值'
def test1(name,age,gender):
    time.sleep(1)
    print('test函数运行完毕,名字是【%s】,年龄是【%s】,性别是【%s】' % (name,age,gender))
res=test('simon',18) #就是在运行wrapper
print(res)

test1('simon',18,'male')

 

5、装饰器的使用

#无参装饰器
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper

@timmer
def foo():
    time.sleep(3)
    print('from foo')
foo()
#有参装饰器
def auth(driver='file'):
    def auth2(func):
        def wrapper(*args,**kwargs):
            name=input("user: ")
            pwd=input("pwd: ")

            if driver == 'file':
                if name == 'simon' and pwd == '123':
                    print('login successful')
                    res=func(*args,**kwargs)
                    return res
            elif driver == 'ldap':
                print('ldap')
        return wrapper
    return auth2

@auth(driver='file')
def foo(name):
    print(name)

foo('simon')

 #验证功能装饰器

#验证功能装饰器
user_list=[
    {'name':'simon','passwd':'123'},
    {'name':'zhurui','passwd':'123'},
    {'name':'william','passwd':'123'},
    {'name':'zhurui1','passwd':'123'},
]
current_dic={'username':None,'login':False}


def auth_func(func):
    def wrapper(*args,**kwargs):
        if current_dic['username'] and current_dic['login']:
            res=func(*args,**kwargs)
            return res
        username=input('用户名:').strip()
        passwd=input('密码:').strip()
        for user_dic in user_list:
            if username == user_dic['name'] and passwd == user_dic['passwd']:
                current_dic['username']=username
                current_dic['login']=True
                res=func(*args,**kwargs)
                return res
        else:
            print('用户名或者密码错误')

        # if username == 'simon' and passwd == '123':
        #     user_dic['username']=username
        #     user_dic['login']=True
        #     res=func(*args,**kwargs)
        #     return res
        # else:
        #     print('用户名或密码错误')
    return wrapper

@auth_func
def index():
    print('欢迎来到某宝首页')
@auth_func
def home(name):
    print('欢迎回家%s' %name)
@auth_func
def shopping_car(name):
    print('%s购物车里有[%s,%s,%s]' %(name,'餐具','沙发','电动车'))

print('before----->',current_dic)
index()
print('after---->',current_dic)
home('simon')
# shopping_car('simon')

#带参数验证功能装饰器

#带参数验证功能装饰器
user_list=[
    {'name':'simon','passwd':'123'},
    {'name':'zhurui','passwd':'123'},
    {'name':'william','passwd':'123'},
    {'name':'zhurui1','passwd':'123'},
]
current_dic={'username':None,'login':False}

def auth(auth_type='filedb'):
    def auth_func(func):
        def wrapper(*args,**kwargs):
            print('认证类型是',auth_type)
            if auth_type == 'filedb':
                if current_dic['username'] and current_dic['login']:
                    res = func(*args, **kwargs)
                    return res
                username=input('用户名:').strip()
                passwd=input('密码:').strip()
                for user_dic in user_list:
                    if username == user_dic['name'] and passwd == user_dic['passwd']:
                        current_dic['username']=username
                        current_dic['login']=True
                        res = func(*args, **kwargs)
                        return res
                else:
                    print('用户名或者密码错误')
            elif auth_type == 'ldap':
                print('这玩意没搞过,不知道怎么玩')
                res = func(*args, **kwargs)
                return res
            else:
                print('鬼才知道你用的什么认证方式')
                res = func(*args, **kwargs)
                return res

        return wrapper
    return auth_func

@auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type  --->index=auth_func(index)
def index():
    print('欢迎来到某宝主页')

@auth(auth_type='ldap')
def home(name):
    print('欢迎回家%s' %name)
#
@auth(auth_type='sssssss')
def shopping_car(name):
    print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))

# print('before-->',current_dic)
# index()
# print('after--->',current_dic)
# home('simon')
shopping_car('simon')

 

--结束END--

本文标题: Python之路【第七篇】:Python

本文链接: https://lsjlt.com/news/181909.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python之路【第七篇】:Python
    一、装饰器 1、装饰器的概念 #装饰器定义:本质就是函数,功能是为其他函数添加附加功能 二、装饰器需要遵循的原则 #原则: 1、不修改被修饰函数的源代码 2、不修改被修饰函数的调用方式 装饰器他人的器具,本事可以是任意可调用对象,被...
    99+
    2023-01-31
    之路 第七篇 Python
  • Python之路【第八篇】:Python
    一、模块和包 模块(module)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码会越来越长,越来越不容易维护。 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较...
    99+
    2023-01-31
    之路 第八篇 Python
  • Python之路【第六篇】:Python
    一、迭代器 1、迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 代码如下: while True: print('==========&...
    99+
    2023-01-31
    之路 第六篇 Python
  • Python之路【第五篇】:Python
    一、文件操作 1、介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分。 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的...
    99+
    2023-01-31
    之路 第五篇 Python
  • Python之路,Python基础篇(第
    一、Python介绍: python的创始人为吉多·范罗苏姆(Guido van Rossum),俗称龟叔。在圣诞节期间为打发无聊而开发得语言。 Python是一门什么语言: Python是一门解释性的语言 Python的优缺点: Py...
    99+
    2023-01-31
    之路 基础 Python
  • 【Python之旅】第七篇(一):再谈P
        主要是再进一步加深Python中关于多线程相关函数join()的理解以解多线程的执行过程。这里通过下面的例子来作进一步的说明。1.多线程与主程序代码的执行顺序关系    给出下面程序代码:#!/usr/bin/env python ...
    99+
    2023-01-31
    之旅 再谈 第七篇
  • 第七篇:suds.TypeNotFoun
    想要用Python的suds模块调用webservice地址做自动测试,但是找了很多方法都失败了,最终找到另外一个模块可以作为客户端访问服务器地址。 1.针对非安全的http from zeep import Client url = "...
    99+
    2023-01-30
    第七篇 suds TypeNotFoun
  • Python成长之路第一篇(3)_初识字
    经过上章的学习我们已经了解到了列表可以通过索引来获取对应的值,在本章我们将学到通过名字来索引数据,这种结构的类型称之为映射(maooing),在Python中字典是唯一内建的映射类型,其中的值我们称之为键值对,也就是由(键,值)组成映射关系...
    99+
    2023-01-31
    第一篇 成长之路 Python
  • Python成长之路第二篇(3)_字典的
    字典的置函数用法(字典dict字典中的key不可以重复)class dict(object):"""dict() -> new empty dictionarydict(mapping) -> new dictionary in...
    99+
    2023-01-31
    字典 第二篇 成长之路
  • python之路 第一篇 编程语言简介及
    一 编程语言: 1.机器语言:直接用二进制编程,直接操作硬件。  优点:执行效率快  缺点:学习难度大,开发效率低 2.汇编语言:用英文标签来代替一串特定意义的二进制,直接操作硬件 优点:执行效率快,不如机器语言快 缺点:学习难...
    99+
    2023-01-30
    之路 第一篇 编程语言
  • python之路,Python基础篇3
    1、set 无序,不重复序列、可嵌套 2、函数 ==》 定义函数,函数体不执行,只有调用函数时,函数体才执行 1、def 2、名字 3、函数体 4、返回值 5、参数 普通参数 指定参数 默认参数 动态参数 ...
    99+
    2023-01-31
    之路 基础 python
  • python之路,Python基础篇2(
    一、.pyc是个什么鬼: pyc文件其实是PyCodeObject的一种持久化保存方式。 二、数据类型 1、数字: 2 是一个整数的例子。 长整数 不过是大一些的整数。 3.23和52.3E-4是浮点数的例子。E标记表示10的幂...
    99+
    2023-01-31
    之路 基础 python
  • python之路-基础篇
    python基础第一章1、python介绍python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。  ...
    99+
    2023-01-31
    之路 基础 python
  • 【Python之旅】第三篇(三):Pyt
    说明:    Python的正则表达式功能强大,使用灵活,但由于目前对Python中正则表达式的使用和认识都比较浅,因此急于做笔记和总结显然是不可行的,因此,这里给出下面几篇不错的参考文档:1.较为详细的Python正则表达式功能介绍的文档...
    99+
    2023-01-31
    之旅 第三篇 Python
  • 【Python之旅】第四篇(一):Pyt
        有时候拿到一个程序接口,需要对其进行扩展,但是又不能修改原来接口的源代码,这时候就需要使用装饰器了。    有下面一个小程序,假如是别人提供给我们的调用接口:import time def sayHi():         tim...
    99+
    2023-01-31
    之旅 第四篇 Python
  • 【Python之旅】第五篇(三):Pyt
        前面的几个例子都是单线程的,下面再来说说多线程的。1.多线程模块    主要是socketserver模块,如下图示:2.多线程原理    如下图示说明:3.SockteServer例子说明服务器端:客户端:4.演示    还是以前...
    99+
    2023-01-31
    之旅 第五篇 Python
  • 【Python之旅】第四篇(二):Pyt
        在Python程序的执行过程中,难免会出现异常的情况,如果做的是跟用户交互的程序,当用户输入不可接受的内容时,在可预见的范围内,我们当然是希望可以给用户一些提示,而不是原来Python内置异常中的那些提示语句,毕竟那些语句只适合给程...
    99+
    2023-01-31
    之旅 第四篇 Python
  • 【Python之旅】第二篇(一):Pyt
    说明:    主要是file()和open()函数的使用,但在查open()函数的帮助时,会有下面的说明:>>> help(open) …… Open a file using the file() type, retur...
    99+
    2023-01-31
    之旅 第二篇 Python
  • 【Python之旅】第五篇(一):Pyt
        只要和网络服务涉及的,就离不开Socket以及Socket编程,下面就说说Python Socket通信的基本原理。1.Socket    socket也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“...
    99+
    2023-01-31
    之旅 第五篇 Python
  • python安装-ubuntu之第一篇
    第一步:安装ubuntu后,了解自带的python 理解python的版本 python --version 终端输入命令: which python 显示 usr/bin/python 说明终端调用是 该文件夹下的python。 whe...
    99+
    2023-01-31
    第一篇 python ubuntu
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作