python学习day9

python基础语法day9

一、装饰器前奏

  1. 作用
    装饰器是为了从已经存在的函数体上添加新功能,但是不对原函数体做修改。

  2. 装饰的对象:函数

a.函数能够作为参数传给另一个函数。

b.函数A还可以将函数B作为其返回值。

# 案例一:函数能够作为参数传给另一个函数
def func1(a, b):
    print('【函数func1】正在执行')
    return a + b


def func2(func, c, d):
    print('【函数func2】正在执行')
    return func(c, d)
# 案例2:函数内部还可以再创建函数
def func3(a, b):
    print('【函数func3】正在执行')

    def func4():
        print('【函数func4】正在执行')
        return a + b

    print(func4())


func3(10, 20)
# func4()
# 案例3:函数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. 无参装饰器

在一个已经实现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))
  1. 有参装饰器
# 可以在函数体执行功能时在多做验证(Web权限验证)
def limit(kind):
    def inner(func):
        def outer(*args, **kwargs):
            result = func(*args, **kwargs)
            if result == '登陆成功':
                if kind == '会员':
                    return result, '尊敬的vvvvvvvip用户'
                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', '123457'))

二、模块

  1. 定义
    模块就是已经实现某些功能的代码合集,在Python中有些代码无需自己实现,已经有了现成的经过测试的实现了某类功能的代码,这写代码可以直接拿过来使用,他们就是以模块的形式存在的。

  2. 模块意义

  • 可以简化工作
  • 可以使代码更简洁(将某些功能写成一个模块(封装函数))、更具条理性
  • 封装成模块的代码可以复用
  1. 模块分类
  • 内置模块

常见的内置模块:安装python时随Python附带的一些功能模块。

  • random:随机事件的模块
  • time:和时间相关的模块
  • json:和字符串、json数据相互转换相关的模块
  • os:和系统功能相关的模块
  • 三方模块

一些python开发者提供的实现了某些功能的模块

  • Flask、Django:Web开发的模块
  • requests:发送http请求的模块
  • tqdm:进度条模块
  • ujson:功能等同于json,性能优于json(编写语言不同)
  • 自定义模块

个人根据业务需求对经常需要复用的功能进行封装的产物(等同于三方模块)

  1. 三方模块存在于Python的模块仓库中:Pypi

三、模块的使用

Python导入模块有5种方式

  1. import 模块名1,模块名2,模块名3,……
  • 使用import导入模块,相当于一次性将模块中的变量、函数、类等全部导入
  • 一个模块中的所有方法不可能全部被使用到,就会造成程序内存占用高,执行速度慢等问题。
  • 这种方式导入模块,想使用模块中的方法,必须 模块名.方法名,否则报错。
import random

random.randint(1, 100)
  1. import 模块名 as 别名:给导入的模块名设置别名,可以简化模块名
  • 使用时,就可以使用 别名.方法名
import random as rd

rd.randint(1, 100)
  1. from 模块名 import *
  • *代表所有,性质和第一种方法一样,造成的问题也和第一种方法一样
  • 只是在使用方法时不再需要 模块名.方法名,可以直接方法名
from random import *

randint(1, 100)

  1. from 模块名 import 方法1,方法2,方法3,……
  • 使用模块中的那几个方法,就导入那几个方法
  • 不过多的导入模块中的成员
from os import listdir, system

listdir()
system()
  1. from 模块名 import 方法名 as 别名
  • 当一个程序中需要导入多个模块时,有概率出现
  • 重名方法,可以使用别名进行方法区分。
# from module1 import a as a1
# from module2 import a as a2
# a1
# a2

四、安装三方模块

  1. 可视化安装。
  1. 找Pycharm提供的安装功能
  2. windows:File > settings > project:xxx > Python Interpreter > +

mac:Pycharm > preferences > project:xxx > Python Interpreter > +

  1. 命令安装
  1. 打开命令行(终端、Terminal)

  2. 先检查虚拟环境(venv)有没有激活

  3. 微软禁用了终端执行脚本的功能,要解除功能:https:/go.microsoft.com/fwlink/?LinkID=135170;

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser(一次修改,永久使用)

  4. 激活虚拟环境的命令:venv/Scripts/activate

  5. 使用pip/pip3 list命令查看已安装模块

  6. 修改镜像源pip config set global.index-url https://pypi.douban.com/simple
    windows:pip.ini; mac:pip.conf

  7. 在线安装模块: pip/pip3 install 模块名:pip install tqdm

from tqdm import tqdm
# 有进度条无打印,有打印无进度条
# tqdm方法操作的对象是容器
for i in tqdm(range(1,100000000),desc='这是一个进度条'):
    pass

5. 自定义模块

一个Python文件就是一个模块

创建一个python文件:moduleOne

导入模块相当于执行模块,和导入的模块中的成员无关

from moduleOne import numSum as n1
from moduleTwo import numSum as n2

print(n1(1, 100))
print(n2(1, 100))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值