一、带参数的装饰器
-
普通函数和匿名函数使用无参装饰器的两种方式
# 一个无参装饰器,使返回的数据都是字符串格式 def out_str(fn): def new_f(*args, **kwargs): result = fn(*args, **kwargs) result = str(result) print('已转变为字符串') return result print('装饰器被调用') return new_f @out_str #只要有这个语法糖,那么装饰器中就会执行,即会输出'装饰器被调用' def func1(i: int): if i % 2: print('odd odd') return i * 2 else: print('even even') return i func2 = lambda x: {x: x * 3} # 加入装饰器后,调用输出为:'装饰器被调用',奇偶数, print('已转变为字符串'),print(kkk) kkk = func1(3) print(kkk, type(kkk)) fff = out_str(func2)(3) #匿名函数使用装饰器的方法 print(fff, type(fff))
============================================================== # 带有参数的装饰器在匿名函数和普通函数中的应用 def add_out_str(s: str): def out_str(fn): def new_f(*args, **kwargs): result = fn(*args, **kwargs) result = str(result) + s print('已转变为字符串') return result print('装饰器2被调用') return new_f print('装饰器1被调用') return out_str @add_out_str('ssss') def func1(i: int): if i % 2: print('odd odd') return i * 2 else: print('even even') return i func2 = lambda x: {x: x * 3} kkk = func1(3) print(kkk, type(kkk)) fff = add_out_str('ssss')(func2)(3) print(fff, type(fff))
二、模块和包
(一)模块
-
模块的概念?
- 一个.py文件就是一个模块
- 可以将同类的,功能相似的变量或方法(函数)集合到一个文件,便于管理
- 可以将模块中的全局变量导出
- 模块名的命名方式遵循变量命名
-
常见模块导入方式
-
import 模块名
-
import 模块名 as 新模块名
----这么做的原因通常有两个:1)原模块名太长,起个短的别名方便使用。2)导入该模块的文件中,有相同的名称。
-
from 模块名 import 变量1,变量2…
-
from 模块名 import 变量1 as 别名,变量2 as 别名…--------导入模块中的某些变量,并为其取新名
-
from 模块名 import * ---------------------导入模块中的所有全局变量
-
-
注意事项:
- 不管以哪种方式导入模块或模块中的变量,都会执行一遍模块中的代码,然后在根据导入的方法复制相应的全局变量到该文件中。
- 导入的全局变量的值也是执行后的值
- 如果在导入模块时,不想执行被导入模块中的代码,可以将其放入到if
__name__ == '__main__'
中。所以,这个条件语句中的全局变量也是不能导入的。__name__
的名字就是模块的名字。 - 一个文件中,导入两次同一个模块的话,只会执行一次。
(二)包
- 包的概念?
- 包就是一个包括
__init__.py
模块的文件夹。 - 文件夹的命名遵循标识符的命名。
- 包和模块相比,就是一个更大的工具箱
- 包就是一个包括
- 包的导入方式
- import 包名
- import 包名 as 新的包名
- import 包名.模块名1,包名.模块名2… -----导入一个包中的多个模块
- import 包名.模块名 as 新名字
- from 包名 import 模块名1, 模块名2…
- from 包名 import 模块名1 as 新名字, 模块名2 as 新名字…
- 包中
__init__.py
文件的使用- 只要导入包,不管以何种方式都会先执行
__init__.py
中的内容 - 可以在
__init__.py
文件中,事先导入该包中的一些常用模块或某些模块中的变量 - 即便是在本包中的
__init__.py
文件中导入本包中的模块或变量,也一定是import 包名…X的形式,即包名是不可以省略的。
- 只要导入包,不管以何种方式都会先执行
三、常用系统模块
-
OS 模块
- 模块的主要功能是对文件的一些操作
- import os
- os.getcwd() -------获取当前的工作目录
- os.getcwdb() ------以字节的方式来输出工作 目录,如果获得Unicode的形式,需要进行decode()
- os.listdir(path) ---------- 列出某个路径下的文件,注意输入路径的时候可以使用r语法。
-
random模块
- import random,通常是一些与随机数有关的函数
- random.randint(m,n) —取从m到n的随机整数,m,n都是可以取到的
- random.random() ----取0到1之间的随机数,随机数不包括0,1
- random.shuffle([]) ----对列表里的元素进行重新打乱,支持列表,字典(使键对应的值打乱),且改变原序列
- random.choice(序列) — 选择序列中的一个元素,支持列表、元组、字典、字符串,不支持集合
- random.choices(序列, k= N) —从序列中选取N次元素,组成列表进行返回。同上
-
time 和 datetime模块
- time.time()–获取时间戳,灭有参数。时间戳的概念是与1970年1月1日0时0分(格林威治时间)的时间差,返回的是一个浮点数,好处在于:1)节省内存,与用字符串比较起来。2)便于加密。
print(time.time()) #1615995450.5487132
-
time.localtime() – 获取本地时间,返回的是一个时间结构体,可以用.year,.month, .day, .hour, .second等操作获取相应字段.如果没有参数,则是现在时间。也可以传入一个时间戳。
time.struct_time(tm_year=2021, tm_mon=3, tm_mday=17, tm_hour=23, tm_min=39, tm_sec=43, tm_wday=2, tm_yday=76, tm_isdst=0)
-
time.sleep() – 让程序休息一段时间,单位时秒
-
from datetime import date, time, datetime, timedelta,导入相关类
-
datetime.now()—获取当前时间
2021-03-18 00:05:01.093233 1 93233, <class 'datetime.datetime'>
-
date.today() – 2021-03-18
-
datetime.deltatime()
t4 = tt - timedelta(days=10)
-
hashlib模块
-
哈希算法的特点:
- 不可逆
- 同一数据同一算法,得出的结果是不变的
- 不管数据大小,经过哈希加密(摘要)后,得到的长度是一样的
-
哈希摘要的步骤:
-
根据算法,创建哈希对象:hashlib.算法名()
import hashlib ha = hashlib.md5() ha = hashlib.sha1()
-
添加原文
t.update('abcd'.encode()) # 对字符串进行字节编码
- 获取加密后的密文
print(t.hexdigest())
-
-