包:
包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来
需要强调的是:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块
为什么要使用包:
包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来
随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性
导入包:
1 产生一个包的名称空间
2 执行包下的__init__.py文件,将产生的名字存放于包的名称空间中
3 在当前执行文件中拿到一个名字aaa,该名字指向包的名称空间
print(aaa.m1) #aaa.m1 就是问aaa.__init__.py要一个名字m1
1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:
凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
2、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
包的导入之import:
import 包名
包的使用之from ... import ...:
from 包名 import 模块
需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法
绝对导入和相对导入:
我们的最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
绝对导入:以glance作为起始
相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)
强调:
1、在导入时带点的,点的左边必须是一个包,这是导入包特有的语法
2、包内,模块直接的导入应该使用from。。。import 。。。
3、from 。。。 import。。。,import后必须是一个明确的名字,没有任何的前缀
from a.b.c.d.f import g.h.x #错误
1、f左边必须都是包
2、import后的名字不能有任何前缀
包以及包所包含的模块都是用来被导入的,而不是被直接执行的。而环境变量都是以执行文件为准的
time模块:
时间分为三种形式:
1、时间戳
time.time()#获得时间秒数
print(time.time())
start_time=time.time()
time.sleep(3)
stop_time=time.time()
print(stop_time-start_time)
2、格式化的字符串
time.strftime(格式化):根据你输入的格式化,得到你想要的时间
print(time.strftime('%Y-%m-%d %H:%M:%S %p')) #年月日时分秒 上下午判断
print(time.strftime('%Y-%m-%d %X %p'))
3、struct_time对象
time.localtime(): #本地时区的struct_time
print(time.localtime()) # 上海:东八区
print(time.localtime().tm_year)
print(time.localtime().tm_mday)
print(time.gmtime()) # UTC时区struct_time
datatime模块:
# print(datetime.datetime.now()) #返回具体时间 #print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 年-月-日 # print(datetime.datetime.now() ) # print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天 # print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天 # print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时 # print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分 # c_time = datetime.datetime.now() # print(c_time.replace(minute=3,hour=2)) #时间替换
shutil模块:
高级的 文件、文件夹、压缩包 处理模块
shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中
压缩文件:
import shutil
import time
ret = shutil.make_archive(
"day15_bak_%s" %time.strftime('%Y-%m-%d'),
'gztar',
root_dir=r'D:codeSH_fullstack_s1day15'
)
解压文件:
import tarfile
t=tarfile.open('day15_bak_2018-04-08.tar.gz','r')
t.extractall(r'D:codeSH_fullstack_s1day16解包目录')
t.close()
randon模块:
1.print(random.random())#(0,1)----float 大于0且小于1之间的小数
2.print(random.random())#(0,1)----float 大于0且小于1之间的小数
3.print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5]
4.print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合
5.print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716
6.item=[1,3,5,7,9]
random.shuffle(item) #打乱item的顺序,相当于"洗牌"
进度条功能:
def progress(percent,width=50): #定义一个输出格式方法:传入百分比和进度条长度
if percent > 1: #判断进度条是否大于百分之100
percent=1
show_str=('[%%-%ds]' %width) %(int(width*percent) * '#')# ([%-50s] 具体#号的数量,总长度*传来的百分比)
print(' %s %d%%' %(show_str,int(100*percent)),end='') #输出, 为顶头 ,%s传入的星,%d为百分比,end=''去除换行
import time
recv_size=0 #下载文件变量
total_size=8097 #被下载文件
while recv_size < total_size: #循环,下载文件小于被下载文件
time.sleep(0.1) #time.sleep方法:暂停0.1秒
recv_size+=100 #累计下载量
percent=recv_size / total_size #累计下载/总文件量,得到百分比
progress(percent) #将百分比的值传入输出功能
随机生成验证码:
import random
def make_code(n=5): #随机验证码功能
res='' #定义一个加载验证码的变量
for i in range(n): #循环
s1=str(random.randint(0,9)) #随机取出一个值
s2=chr(random.randint(65,90)) #随机取出一个值并转化成字母
res+=random.choice([s1,s2]) #随机取一个值 自加
return res
print(make_code(10)) #输出