Python之旅.第四章.模块与包

包:

包就是一个包含有__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:\code\SH_fullstack_s1\day15'
)

解压文件:

import tarfile
t=tarfile.open('day15_bak_2018-04-08.tar.gz','r')
t.extractall(r'D:\code\SH_fullstack_s1\day16\解包目录')
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('\r%s %d%%' %(show_str,int(100*percent)),end='') #输出,\r为顶头 ,%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)) #输出

 



posted @ 2018-04-08 16:05  yangli0504  阅读(168)  评论(0编辑  收藏  举报