Python 装饰器、模块

本文介绍了Python装饰器的概念和作用,阐述了函数作为参数和返回值的特性,以及装饰器在不修改原函数的基础上添加新功能的应用。此外,还讲解了如何在Pycharm中设置和使用断点进行程序调试,包括各种断点操作。接着,讨论了Python的模块,包括内置模块、三方模块和自定义模块的分类和使用方法,强调了模块的复用性和简化代码的重要性。最后,详细说明了如何导入和使用模块,以及安装三方模块的不同方式。
装饰器

一. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值