装饰器
一. Python 中装饰器是为了在已存在的函数体上添加新功能,但是不对原函数题做修改。
二、为什么函数能被装饰?
a。函数能够作为参数传给另一个函数。
b。函数A还可以将 函数B作为其返回值
案例一.函数能够作为参数传给另一个函数
def func1(a, b):
print('【函数func1】正在执行')
return a + b
def func2(func, c, d):
print('【函数func2】正在执行')
return func(c, d)
# 分别调用函数
print(func1(1, 2))
print(func2(func1, 1, 2))
案例二: 函数内部还能创建函数
def func3(a, b):
print('【函数func3】正在执行')
def func4():
print('【函数func4】正在执行')
return a + b
print(func4())
func3(10, 20)
案例三:函数A还可以将 函数B作为其返回值
def A(a, b):
print('【函数A】正在执行')
def B(c):
print('【函数B】正在执行')
return a + b + c
return B
B=A(10, 20)
print(B)
print(B(30))
无参数函数
# 在一个已经实现1-100的求和功能的函数上,外加功能进行性能测试。
import time
# 测试函数
def inner(func):
def outer(*args, **kwargs):
start1 = time.time()
result = func(*args, **kwargs)
end1 = time.time()
print(f'程序执行花费{end1 - start1}秒')
return result
print(outer)
return outer
# 功能函数
def numSum(start, end):
total = 0
for i in range(start, end + 1):
total += i
return total
numSum = inner(numSum) # 函数numSum等于变量numSum传递给形参func,inner执行,先打印outer变量代表的函数,再将outer函数返回,重新给numSum赋值
print(numSum) # 打印numSum,等价于打印outer
print(numSum(1, 100))# 调用numSum等于调用outer变量等于调用outer函数
# 传参1和100,因为装饰器是具有通用性的,所以一个装饰器可以借用给任何函数,所有的函数传参不一定一致,所以使用不定长参数*args和**kwargs接受参数。
# 在outer函数内部有调用了func函数,func函数就是一开始的numSum,将传递的所有参数(*args,**kwargs)再传递给func函数,此时才开始真正的调用功能函数numSum
# 最终既能得到功能函数应该得到的结果,有能够测试成功功能函数的性能。
# 可以将测试函数inner写为语法糖的形式:@测试函数名
# 功能函数
@inner
def numSum1(start, end):
total = 0
for i in range(start, end + 1):
total += i
return total
print(numSum1(1, 50))
打断点
一.Pycharm 打断点 能够进行程序调试
for i in range(1,11):
if i %3==0:
print(f’{i}是三的倍数’)
else:
print(f’{i}不是三的倍数’)
打断点的作用: 能够让程序在断点位置停止
strp over:一步执行完一个函数题
step into :进入函数体,一步一步的执行
step into my code :进入自定义函数体,一步一步执行
step out:退出并执行完成当前函数体
run to cursor :运行到下一个断点
打断点测试
mport time
def inner(func):
def outer(*args, **kwargs):
start1 = time.time()
result = func(*args, **kwargs)
end1 = time.time()
print(f'程序执行花费{end1 - start1}秒')
return result
return outer
#@inner
def numSum1(start, end):
total = 0
for i in range(start, end + 1):
total += i
return total
#print(numSum1(1, 100))
numSum1=inner(numSum1)
print(numSum1(1,100))
有参修饰器
def limit(kind):
def inner(func):
def outer(*args, **kwargs):
result = func(*args, **kwargs)
if result == '登陆成功':
if kind == '会员':
return result,'尊敬的大冤种'
else:
return result,'感谢白嫖用户登录'
else:
return result
return outer
return inner
# 语法糖的参数是登录账号时程序同时验证账号权限得到的结果
@limit('会员')
def userLogin(username, pwd):
if username == 'admin' and pwd == '123456':
return '登陆成功'
else:
return '登录失败'
print(userLogin('admin', '123456'))
模块
什么是模块
‘’’
模块就是已经实现某些功能的代码合集。在Python中有些代码无需自己实现。
已经有了现成的经过测试的实现了某些功能的代码,这些代码也可以直接拿过来使用
‘’’
二.模块的意义
‘’’
1.可以简化工作。
2.可以使代码更简洁(将某些功能写成一个模块(封装函数))、更具条理性。
3.封装成模块的代码可以复用。
‘’’
三.模块的分类
1.内置模块、2.三方模块、3.自定义模块
常见的内置模块:安装Python时随Python附带的一些功能模块。
andom: 随机事件的模块
time:和时间相关的模块
json:和字符串、json数据相互转换的模块
os: 和系统功能相关的模块
三方模块: 一下python开发者提供的实现某些功能的模块
Flask,Django:wed开发的模块
reqyuests:发送http请求的模块
tqdm: 进度条模块
ujson: 性能等同于json,性能由于json(编程语言不同)
自定义模块: 个人根据业务需求对经常需要复用的功能进行封装的产物(等同于三方模块)
四.三方模块
** 模块如何使用**
想使用必须先导入,Python导入模块有5种方式
1.import 模块名1,模块名2,模块名3,…
使用import导入模块,相当于一次性将模块中的变量、函数、类等全部导入,但是
一个模块中的所有方法不可能全部被使用到,就会照成程序内存占用高,执行速度慢等问题
这种方式导入模块,想使用模块中的方法,必须 模块名.方法名,否则报错。
import random
random.randint(1,100)
2.inport 模块名 as 别名:给导入的模块名设置别名,可以简化模块名。
使用时,就可以使用 别名.方法名
import random as rd
rd.randint(1,100)
3.from 模块名 inport *:*代表所有,性质和第一种方法一样,照成的问题也和第一种一样
只是在使用方法时不在需要 模块名.方法名 可以直接方法名。
from random import *
randint(1,100)
4.from 模块名 import 方法1,方法2,方法3,…:使用模块中的那几个方法,就导入哪几种方法,
不过多的导入模块中的成员。
from os import listdir,system
listdir()
system()
5.from 模块名 import 方法名 as 别名:当一个程序种需要导入多个模块时,有概率出现
重名方法,可以使用别名进行方法区分。
安装三方模块有多种形式
1.可视化安装。2.使用命令安装。3.将某个模块源码拿下来,直接编译源码安装。
1.可视化安装。
找Pycharm提供的安装功能。
windows:File > settings > project:xxx > Python Interpreter > +
mac:Pycharm > preferences > project:xxx > Python Interpreter > +
2.命令安装
打开命令行(终端、Terminal)
1.先检查虚拟环境(venv)有没有激活。
只针对windows:
2.微软禁用了终端执行脚本的功能,要解除功能:https:/go.microsoft.com/fwlink/?LinkID=135170;
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser(一次修改,永久使用)
3.激活虚拟环境的命令:venv/Scripts/activate
4.使用pip/pip3 list命令查看已安装模块
5.修改镜像源
pip config set global.index-url https://pypi.douban.com/simple
pip3 config set global.index-url https://pypi.douban.com/simple
windows:pip.ini; mac:pip.conf
6.在线安装模块: pip/pip3 install 模块名
pip install tqdm
pip3 install tqdm
from tqdm import tqdm
有进度条无打印,有打印无进度条
tqdm方法操作的对象是容器
for i in tqdm(range(1,100000000),desc=‘这是一个进度条’):
pass
本文介绍了Python装饰器的概念和作用,阐述了函数作为参数和返回值的特性,以及装饰器在不修改原函数的基础上添加新功能的应用。此外,还讲解了如何在Pycharm中设置和使用断点进行程序调试,包括各种断点操作。接着,讨论了Python的模块,包括内置模块、三方模块和自定义模块的分类和使用方法,强调了模块的复用性和简化代码的重要性。最后,详细说明了如何导入和使用模块,以及安装三方模块的不同方式。
700

被折叠的 条评论
为什么被折叠?



