一、模块

1、什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀

  模块的本质:模块的本质是一个py文件

2、模块分为三类:1)内置模块;2)第三方模块;3)自定义模块

3、使用模块的目的:

  退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

  随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,

4、模块的使用:通过import 调用

示例文件:spam.py,文件名spam.py,模块名spam

 #spam.py
print('from the spam.py') money= def read1():
print('spam->read1->money',money) def read2():
print('spam->read2 calling read')
read1() def change():
global money
money=

4.1模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下

 #test.py
import spam #只在第一次导入时才执行spam.py内代码,此处的显式效果是只打印一次'from the spam.py',当然其他的顶级代码也都被执行了,只不过没有显示效果.
import spam
import spam
import spam '''
执行结果:
from the spam.py
'''

我们可以从sys.module中找到当前已经加载的模块,sys.module是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。

4.2 每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

 #测试一:money与spam.money不冲突
#test.py
import spam
money=
print(spam.money) '''
执行结果:
from the spam.py '''
 #测试二:read1与spam.read1不冲突
#test.py
import spam
def read1():
print('========')
spam.read1() '''
执行结果:
from the spam.py
spam->read1->money
'''
 #测试三:执行spam.change()操作的全局变量money仍然是spam中的
#test.py
import spam
money=
spam.change()
print(money) '''
执行结果:
from the spam.py '''

总结:首次导入模块spam时会做三件事:

  1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。

  2.在新创建的命名空间中执行模块中包含的代码,见初始导入import spam

  3.创建名字spam来引用该命名空间

1.#为模块名起别名,相当于m1=1;m2=m1
2.import spam as sm
3.print(sm.money) #在一行导入多个模块
1.import sys,os,re

二、常用内置模块

1、time模块

  1、时间的表示形式    

    在Python中,通常有这三种方式来表示时间:时间戳元组(struct_time)格式化的时间字符串

    (1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

    (2)格式化的时间字符串(Format String): ‘1988-03-16’

    (3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

 # <> 时间戳
>>> import time
>>> time.time() #--------------返回当前时间的时间戳
1493136727.099066 # <> 时间字符串
>>> time.strftime("%Y-%m-%d %X")
'2017-04-26 00:32:18' # <> 时间元组
>>> time.localtime()
time.struct_time(tm_year=, tm_mon=, tm_mday=,
tm_hour=, tm_min=, tm_sec=, tm_wday=,
tm_yday=, tm_isdst=)

    小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的

附:python中时间日期格式化符号

python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

  

  2、几种时间形式的转换

    (1)

Python基础(11)_python模块之time模块、rando模块、hashlib、os模块-LMLPHP

 # print(time.time())   #  仅仅是当前时间的时间戳     float型
#------------------------------------------------
#print(time.localtime()) # 当前时间的结构化时间对象 s=time.localtime() # 结构化时间对象 将时间戳------->结构化时间
s2=time.gmtime() # 结构化时间对象 UTC时间 # print(s.tm_year)
# print(s.tm_wday)
#------------------------------------------------
t="2012-12-12"
ret=time.mktime(time.localtime()) # 将结构化时间------->时间戳
print(ret)
#------------------------------------------------
ret2=time.strftime("%Y-%m-%d",time.localtime()) # 将结构化时间------>字符串时间
print(ret2)
#------------------------------------------------
ret3=time.strptime("1900:03:12","%Y:%m:%d") # 将字符串时间----->结构化时间
print(ret3)

    (2)

Python基础(11)_python模块之time模块、rando模块、hashlib、os模块-LMLPHP

 >>> time.asctime(time.localtime())
'Sun Nov 25 10:03:43 1979'
>>> time.ctime()
'Sun Nov 25 10:03:43 1979'
#--------------------------其他方法
# sleep(secs)
# 线程推迟指定的时间运行,单位为秒。

2、random模块

  1、random模块的使用

>>> import random
>>> random.random() # 大于0且小于1之间的小数
0.7664338663654585 >>> random.randint(1,5) # 大于等于1且小于等于5之间的整数 >>> random.randrange(1,3) # 大于等于1且小于3之间的整数 >>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5] >>> random.sample([1,'23',[4,5]],2) # #列表元素任意2个组合
[[4, 5], '23'] >>> random.uniform(1,3) #大于1小于3的小数
1.6270147180533838 >>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 打乱次序
>>> item
[5, 1, 3, 7, 9] >>> random.shuffle(item)
>>> item
[5, 9, 7, 1, 3]

  2、random模块的应用:最近生成五位数的验证码

#练习: 随机生成五位数验证码
def valdate_code():
ret=""
for i in range(5):
num=random.randint(0,9)
alfa=chr(random.randint(97, 122))
alfa2=chr(random.randint(65, 90))
s=random.choice([str(num),alfa,alfa2])
ret=ret+s
return ret # 思路2
# ret=random.sample([1,2,3,4,5,6,7,8,9,0],5)
# print(ret)
# print(type(ret))
# #
# ret=''.join(ret)
# # return ret print(valdate_code())

3、hashlib

  1、hash:一种摘要算法 ,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

  2、摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
  三个特点:
    1.内容相同则hash运算结果相同,内容稍微改变则hash值则变
    2.不可逆推
    3.相同算法:无论校验多长的数据,得到的哈希值长度固定。

  3、以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

import hashlib

md5 = hashlib.md5()
md5.update('how to use md5 in python hashlib?')
print md5.hexdigest() 计算结果如下:
d26a53750bc40b38b65a520292f69306

  如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

md5 = hashlib.md5()
md5.update('how to use md5 in ')
md5.update('python hashlib?')
print md5.hexdigest()

  MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

import hashlib

sha1 = hashlib.sha1()
sha1.update('how to use sha1 in ')
sha1.update('python hashlib?')
print sha1.hexdigest()

  SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

  4、摘要算法应用

    4.1网站存储用户登录的用户名和登录密码

username | password
---------+---------------------------------
michael | e10adc3949ba59abbe56e057f20f883e
bob | 878ef96e86145580c38c87f0410ad153
alice | 99b1c2188db85afee403b1536010c2c9

    4.2,防止网站数据泄露后,黑客“撞库”,对网站存储用户登录的用户名和登录密码进行“加盐”,即通过对原始口令加一个复杂字符串来实现

hashlib.md5("abc".encode("utf8"))

    经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

4、os模块

  1、os模块是与操作系统交互的一个接口 

'''
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
'''

 

 1 os路径处理
2 #方式一:推荐使用
import os
#具体应用
import os,sys
possible_topdir = os.path.normpath(os.path.join(
os.path.abspath(__file__),
os.pardir, #上一级
os.pardir,
os.pardir
))
sys.path.insert(,possible_topdir) #方式二:不推荐使用
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
05-11 11:36
查看更多