10月8日学习总结
一、装饰器
1.作用
装饰器的作用:给已经写好的函数新增功能
2.给函数新增功能
1.方案一:接修改原函数,把新增功能添加进去
存在的问题:如果多个函数都需要新增相同的功能,相同功能的代码需要写多遍
2.方案二:实参高阶函数
3.方案三:使用装饰器
二、装饰器语法
1.固定结构
装饰器=实参高阶函数+返回值高阶函数+糖语法
# 1.固定结构
'''
def 装饰器名称(旧函数):
def 新函数(*args,**kwargs):
result=旧函数(*args,**kwargs)
实现新增的功能
return result
return 新函数
'''
def add_logo(fn):
def new_fn():
fn()
print('千锋教育!')
return new_fn
@add_logo
def func():
print('hello world!')
func()
# hello world!
# 千锋教育!
# 练习1:写一个统计函数执行时间的装饰器
import time
def total_time(fn):
def new_fn(*args,**kwargs):
start=time.time()
result=fn(*args,**kwargs)
end=time.time()
print(f'执行时间{end-start}s')
return result
return new_fn
@total_time
def func5(x):
return x*10
print(func5(10))
# 练习2:写一个装饰器在原函数的开头打印 start
def start(fn):
def new_fn(*args,**kwargs):
print('start')
result=fn(*args,*kwargs)
return result
return new_fn
@start
def func1(x):
return x * 10
print(func1(5))
# 练习3:将返回值是数字的函数的返回值变成原来的10000倍
def blow_up(fn):
def new_fn(*args,**kwargs):
result=fn(*args,**kwargs)
if type(result) in (int,float):
return result*10000
return result
return new_fn
@blow_up
def func1(x):
return x * 10
print(func1(5))
三、模块的导入
1.模块
1.一个py文件就是一个模块
2.可以在一个模块中使用另一个模块的内容,前提:
(1)被另外一个模块使用的模块的名字必须符合变量名的要求
(2)被使用之前需要导入
2.导入模块
1) import 模块名 - 直接导入指定模块,导入后能通过"模块名."的方式使用模块中所有的全局变量
2) from 模块名 import 变量名1,变量名2,变量名3,... - 通过模块导入指定变量,导入后直接使用指定的变量
3) from 模块名 import * - 通过模块导入模块中所有全局变量,导入后直接使用变量
4) 重命名
import 模块名 as 新模块名 - 使用模块的时候用新模块名来使用
from 模块名 import 变量名1,变量名2,变量名3......
方式一:
import test
print(test.a)
print(test.x)
print(test.func1())
import random
random.randint(10,20)
方式二:
from test import a,x,func1
print(a)
print(x)
print(func1())
方式三:
from test import *
print(a)
print(x)
print(func1())
方式四:
import test as ts
import numpy as np
import pandas as pd
test='i love you'
print(test,ts.a)
from test import x as t_x,a
x='小明'
print(x,t_x)
print(a)
四、导入模块的原理
1.原理
1.当代码执行到导入模块的时候,系统会自动进入该模块将模块中所有代码都执行
2.if语句
1.这个if语句的特点:在if语句中的代码当前模块被别的模块导入的时候不会执行;如果直接运行当前模块又会执行
if __name__ == '__main__':
pass
五、包的导入
1.导入包中的模块
1) import 包名 - 要修改__init__.py文件才有意义
2) import 包名.模块名
3) from 包名 import模块名1,模块2,...
4) from 包名.模块名 import 变量1,变量2,...
# ========导入方式1===========
# import fileManager
# ======导入方式2========
# a.不重命名
# import fileManager.csvFile
# print(fileManager.csvFile.aa)
# fileManager.csvFile.read_file()
# b.重命名
# import fileManager.csvFile as csvFile
# print(csvFile.aa)
# csvFile.read_file()
# =========导入方式3=======
# from fileManager import csvFile,jsonFile
# print(csvFile.aa)
# jsonFile.write_dict()
# =======导入方式4=========
# from fileManager.jsonFile import write_dict
# write_dict()
2.导入包的原理
导入包中的模块的内容的时候,系统会先执行__init__.py文件中的内容,再执行模块中的内容
# 功能一
import file_manager
file_manager.csvFile.read_file()
file_manager.textFile.del_file()
# 功能二
from file_manager import write_dict
write_dict()
import file_manager
file_manager.write_dict()
file_manager.open_file()
from file_manager import open_file
open_file()
六、数学模块
1.match和cmatch
math :普通数字相关的数学函数
cmath:复数相关的数据函数
普通数字:100、-23.8、0.23
复数(complex):a+bj (a-实部,b-虚部,j是虚数单位;j**2 == -1)
import math, cmath
x = 10 + 2j
y = 20 + 1j # 1必须写
z = 20 - 3j
print(type(x))
print(x + z) # 30 - 1j
print(x * z) # 206+10j
# ceil(浮点数) - 将浮点数转换成整数(向大取整)
print(math.ceil(1.9)) # 2
print(math.ceil(1.1)) # 2
# floor(浮点数) - 将浮点数转换成整数(向小取整)
print(math.floor(1.9)) # 1
print(math.floor(1.1)) # 1
# round() - 将浮点数转换成整数(四舍五入)
print(round(1.9)) # 2
print(round(1.1)) # 1
2.random
1.randrange(M, N, step) - 随机整数
import random
print(random.randrange(10, 20, 2))
2.randint(M, N) - 随机整数
import random
print(random.randint(10, 20))
3.random() - 产生0~1的随机小数
import random
print(random.random()) # 0 ~ 1
print(random.random() * 10) # 0 ~ 10
print(random.random() * 9 + 1) # 1 ~ 10
4.choice(序列) - 从序列中随机获取一个元素
5.choices(序列, k=数量) - 从序列中随机获取指定数量的元素(有放回抽取)
nums = [1, 2, 3, 4, 5]
print(random.choices(nums, k=3))
6.sample(序列, k=数量) - 从序列中随机获取指定数量的元素(无放回抽取)
import random
print(random.sample(nums, k=3))
7.shuffle(列表) - 将序列中的元素的顺序随机打乱
import random
random.shuffle(nums)
print(nums)
七、时间模块
import time
import datetime
# 1.获取当前时间
# 时间戳:以当前时间到1970年1月1日0时0分0秒(格林威治时间)的时间差来记录一个时间(时间差的单位是秒)
t1=time.time()
print(t1)
# 2.获取本地时间
# localtime() - 获取当前的本地时间(返回值是结构体时间)
t2=time.localtime()
print(t2)
# localtime(时间戳) - 获取指定时间戳对应的本地时间
t3=time.localtime(1633684406.1188622)
print(t3)
# 3.睡眠 - 让程序停止运行
# sleep(时间) - 时间单位:秒
time.sleep(2)
print('=========')
# 4.将结构体时间转换成时间戳
# mktime(结构体时间)
t5=time.mktime(t2)
print(t5)
import time
from datetime import datetime,time,date,timedelta
# 1.datetime
# 1) 获取当前时间
t1=datetime.now()
print(t1,type(t1)) # 2021-10-09 09:43:53.315789 <class 'datetime.datetime'>
# 2) 创建datetime对象(时间对象)
t2=datetime(2002,10,1)
print(t2) # 2002-10-01 00:00:00
t3=datetime(2012,9,3,minute=30)
print(t3) # 2012-09-03 00:30:00
# 3) 单独获取时间数据
print(t3.year)
print(t3.month)
print(t3.day)
print(t3.hour)
print(t3.minute)
print(t3.second)
print(t3.weekday())
# 4) 时间对象和字符串时间的转换
# 将字符串时间转换成时间对象:datetime.strptime(字符串时间,时间格式)
t4_str='2001-8-3 11:32:40'
t4=datetime.strptime(t4_str,'%Y-%m-%d %H:%M:%S')
print(t4.weekday())
# 5) 将时间对象转换成字符串
t7=datetime(2020,1,5,23,50,34)
print(t7) # 2020-01-05 23:50:34
# xxxx年xx月xx日 xx时xx分xx秒
t7_str=t7.strftime('%Y年%m月%d日 %H时%M分%S秒')
print(t7_str) # 2020年01月05日 23时50分34秒
# xx月xx日 星期
t7_str1=t7.strftime('%m月%d日 %a')
print(t7_str1)
# 2.timedelta - 对时间进行加减操作的
t8=datetime(2020,12,31,23,59,10)
print(t8) # 2020-12-31 23:59:10
# 加1天
result = t8+timedelta(days=1)
print(result) # 2021-01-01 23:59:10
# 加1天零5个小时
result = t8+timedelta(days=1,hours=5)
print(result) # 2021-01-02 04:59:10
# 25小时之前
result = t8 - timedelta(hours=25)
print(result) # 2020-12-30 22:59:10
result = t8-timedelta(weeks=7)
print(result) # 2020-11-12 23:59:10
# 练习:封装一个函数可以将指定的字符串时间转换成时间戳
# xxxx-xx-xx xx:xx:xx
t4_str='2001-8-3 11:32:40'
def t(str1:str):
import time
struct_t=time.strptime(str1,'%Y-%m-%d %H:%M:%S')
return time.mktime(struct_t)
print(t('2001-8-3 11:32:40'))