python模块相关知识点(random模块,sys模块,time模块)

285 阅读13分钟

目录

1.模块的概念

1.1模块的概念介绍

1.2创建模块

2.模块导入的原理

2.1原理的介绍

3.模块的导入方式

3.1import模块名

3.2import 模块 as 别名

3.3一行导入多个模块

3.4from ... import ...局部导入方式

3.5from ... import ... as 别名

3.6支持导入多行

3.7from 模块 import *

4.模块搜索路径

5.pyc临时文件

6.把模块当做脚本运行

7.random模块

8.sys模块

9.time模块

9.1time.sleep()

9.2时间戳

9.3时间元组

9.4时间字符串格式化

9.5 时间戳和时间元组之间的转换

9.6时间元组和格式化字符串之间的转换

9.7结构化时间 --> %a %b %d %H:%M:%S %Y时间串

9.8时间戳 --> %a %b %d %H:%M:%S %Y时间串


1.模块的概念

1.1模块的概念介绍

一个包含python代码的文件就是一个模块。

使用模块的作用:

1.现在程序开发文件比较大,都放在一个文件中维护不方便,拆分成多个文件方便维护与管理

2.模块可以增加代码的重用率

1.2创建模块

模块本身就是一个文件,所有py代码都可以在文件中直接书写。不过我们开发共用模块时,最好在模块中书写以下内容。

           变量           模块中的属性值
           函数             单独的功能
            类         相似功能的组合
     模块测试代码   临时使用,被导入时不会执行

注意:

  1. .模块名称遵循标识符。
  2. .模块只有第一次被导入的时候执行,多次导入不会执行。
#model.py  一个简单的打招呼模块

def say_hello():
    print('hello')
import model  #导入模块,不加py后缀名

model.say_hello() # 调用模块中的功能,使用模块名.方法名()

2.模块导入的原理

2.1原理的介绍

1. 模块导入会将要导入的文件执行一遍

2. 导入模块的名称就是我们定义的脚本或包的名称

3. 我们导入模块的过程总结就是:在指定的范围内搜索指定名称的python脚本或者包,将其运行,获取其中的方法

3.模块的导入方式

1 、import 模块名

2 、import 模块名 as 别名

3 、import 模块名1 ,模块名2 ,... 一行导入多个模块。

4 、from ... import ...

5 、from ... import ... as 别名

6 、from ... import 功能1 ,功能2 ,...

7 、from ... import * 导入所有

3.1import模块名

作用:直接导入模块

import model #导入模块

model.say() #调用模块中的方法

3.2import 模块 as 别名

如果模块的名称太长,我们可以这个模块起一个别名。

# import 模块 as 别名
import model as mk #为模块model取别名mk
mk.say() #用别名mk调用model中的方法

3.3一行导入多个模块

import model1,model2,model3 #一行调用多个模块,之间用','隔开
#分别调用不同模块中的say()方法
model1.say()
model2.say()
model3.say()

3.4from ... import ...局部导入方式

当使用模块中的部分功能的时候,就可以使用局部导入方式。

from 模块 import 某个函数或者类。

作用:直接导入模块中的某个函数或者某个类或变量

from model import say

def say():
    print('呵呵')

注意:如果当前文件中的变量或者函数名称和模块中的名称重复,会使用就近原则。

from model import say

def say():
    print('呵呵')

say() # 就近原则,调用的是自己的方法,输出-->呵呵

3.5from ... import ... as 别名

当导入的模块和当前模块中的名称相同的时候可以起别名进行区分。

from model import say as say1
def say():
    print('哈喽')

say1() # 调用model模块中say1方法
say() # 调用自己的say方法

3.6支持导入多行

import model1
import model2
import model3
model1.say()
model2.say()
model3.say()

3.7from 模块 import *

from my_module import *

把my_module中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差。

作用:直接导入模块中的所有方法和类和变量

school = '北大'
from model import *  # 可能会覆盖掉你定义的变量
say()
print(school)   # 在model模块中有变量school,就会覆盖自己的school变量

注意:如果my_module.py中的名字前加_,即_money,则from my_module import *,则_money不能被导入 

school = '大同大学'
print(school)
a = '2' 
_age = 13  # 变量age前有下划线

def say():
    print('hello')

下面导入model模板时,无法导入age变量

from model import *  # model存在__all__属性,只能导入all中的变量

s = school

n = name # 报错name没有被定义

__all__属性:

__all__ = [变量1,变量2 ...] 规定导入模块的功能。

__all__=['money','read1']

#这样在另外一个文件中用from my_module import *就这能导入列表中规定的两个名字

model.py

def say():
    print('hello')

school = '大同大学'
_age = 13
a = '2'

__all__ = ['school','a','_age']
from model import *  # model存在__all__属性,只能导入all中的变量

s = school
say() # 无法调用
l = _age   #放入all属性中,又可调用

4.模块搜索路径

当你导入一个模块,Python解析器对模块位置的搜索顺序是:

1、当前目录

2、如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。

由sys模块的sys.path方法来规定

因为sys.path返回的数据类型是列表

1、列表可以修改、我们导入的范围也可以通过修改sys.path这个列表获得暂时的修改。例如通过        sys.path.append()添加目录,导入额外目录的模块。

2、列表是有序的,当搜索的过程当中,在第一个路径下搜索到了,就停止搜索。而且sys.path第一个路   径是脚本的当前路径,所以禁止大家讲自己的脚本命名成模块的名称。

因此需要注意的是:自己模块命名的时候不能和系统的模块名称相同。

import random #自己的random模块

n = random.randint(0,3) # 报错,自己的模板中没有randint方法
print(n)

5.pyc临时文件

为了提高加载模块的速度,python解释器会在__pycache__目录中下缓存每个模块编译后的版本,之后,再次被导入时,实际上导入的是这个.pyc的临时文件。

6.把模块当做脚本运行

我们可以通过模块的全局变量__name__来查看模块名:
当做脚本运行:
__name__ 的值 等于'__main__'

当做模块导入:
__name__的值等于模块名

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__':

       pass

def sum(x,y):
    print(x+y)

if __name__ == '__main__':    #当作模块,调用时不执行,在此可当作测试使用
    sum(2,5)

7.random模块

产生随机数

一、随机小数

1.random()

    - 产生大于0且小于1之间的小数

import random

ret = random.random()  # 0-1之间的随机小数,不能加参数 [0,1)
print(ret)

输出结果:

    

2.uniform(a,b)

- 产生指定范围内的随机小数

import random

ret = random.uniform(1, 4)  # 返回(start,end)的小数  [x, y)
print(ret)

输出结果 :

  

二、随机整数

1.randint(a,b)

-产生a,b范围内的整数,包含开头和结尾

import random

ret = random.randint(1, 99)  # 返回[start,end]的整数
print(ret)

输出结果:

      

2.randrange(start,stop,[step])

    - 产生start,stop范围内的整数,包含开头不包含结尾。

- step 指定产生随机数的步长。

import random

ret = random.randrange(1, 9, 2)  # 返回(start,end,step)的整数 含头不含尾
print(ret)

输出结果:

      

三、随机选择一个数据

1.random.choice(lst)

- 随机返回序列中的一个数据

import random

lst = [1,2,3]
ret = random.choice(lst)   #从序列中随机取出一个元素
print(ret)

输出结果:

    

四、打乱

1.shuffle()

   - 打乱列表顺序

import random

lst = [1, 2, 3]
random.shuffle(lst)  # 处理,没有返回值
print(lst)

输出结果:

   

练习:

随机生成验证码

源码:

def code():
    l = []
    for i in range(4): # 循环,控制验证码的长度
        n = random.randint(0, 9)  #随机生成0-9的整数
        s = chr(random.randint(65, 90)) #随机生成字母A-Z
        a = [n, s] # 将随机生成的字母和数字放到一个列表中
        ret = random.choice(a) #每次随机选择字母或数字
        l.append(ret) # 选出后添加到空列表中
    for i in l: # 循环打印输出
        print(i, end='')

code() # 调用方法

运行结果:

   

8.sys模块

1.sys.version返回解释器的版本号

import sys

print(sys.version)  # python解释器版本信息

#   输出:
#    3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]

2.sys.path 返回模块的搜索路径

import sys

print(sys.path)  # 返回模块搜索路径

''' 输出:
['D:\\pycharm工作空间\\day11', 'D:\\pycharm工作空间', 'D:\\pycharm工作空间\\day11', 'D:\\pycharm工作空间\\venv\\Scripts\\python36.zip', 
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'D:\\pycharm工作空间\\venv', 'D:\\pycharm工作空间\\venv\\lib\\site-packages', 
'D:\\pycharm工作空间\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg', 'D:\\pycharm工作空间\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg',
 'C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend']


'''

 3.sys.argv 接受命令行下的参数

import sys

ret = sys.argv  # 可接收命令行下的参数
file = ret[0]
user_name = ret[1]
pwd = ret[2]
print(ret)
if user_name =='zxb' and pwd =='555':
    print('登录成功')
else:
    print('用户名或密码错误')

在命令行下执行:

9.time模块

在Python中,通常有这三种方式来表示时间:

时间戳、时间元组(struct_time)、格式化的时间字符串。

  1. 时间戳(timestamp) :

时间戳表示的是从1970年1月1日00:00:00开始到现在的秒值。返回的是float类型。

(2)格式化的时间字符串(Format String): ‘1999-12-06’

(3)时间元组(struct_time) :

struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一周的第几日,一年中第几天,夏令时。

小结:

时间戳是计算机能够识别的时间;

时间字符串是人能够看懂的时间;

时间元组则是用来操作时间的。

时间元组属性:

序号字段 属性
1年  tm_year   (4位数)2008
2月 tm_mon1 到 12
3日 tm_mday1到31
4小时 tm_hour0到23
5分钟 tm_min0到59
6秒 tm_sec0到61 (60或61 是闰秒)
7一周的第几日 tm_wday0到6 (0是周一)
8一年的第几日tm_yday1到366 (儒略历)
9夏令时 tm_isdst-1, 0, 1, -1是决定是否为夏令时的旗帜

格式化的时间字符串(Format String)表示方式: ‘1999-1-06’

 

%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 当前时区的名称

%% %号本身

 

9.1time.sleep()

睡眠功能,让程序等待多少s后再执行。

import time

print('程序开始了..')
time.sleep(3)  # 睡3秒
print('程序结束了..')
'''
输出结果:
   程序开始了..
  (中间停顿了3s)
   程序结束了..

'''

9.2时间戳

time.time()

时间戳表示的是从1970年1月1日00:00:00开始到现在的秒值。返回的是float类型。

import time

ret = time.time()
print(ret)  #  1546946173.998187

9.3时间元组

time.localtime()

import time

ret = time.localtime()
print(ret)
'''time.struct_time(tm_year=2019, tm_mon=1, tm_mday=8, tm_hour=16, tm_min=48, tm_sec=19, 
        tm_wday=1,           tm_yday=8,     tm_isdst=0)
    一周第几天(0为周一)   一年第几天      夏令时
'''

9.4时间字符串格式化

time.strftime('%Y-%m-%d %H:%M:%S')

import time

ret = time.strftime('%Y-%m-%d %H:%M:%S')
print(ret)  #  2019-01-08 19:17:28

ret = time.strftime('%Y-%m-%d %X')
print(ret) # 2019-01-08 19:17:28

9.5 时间戳和时间元组之间的转换

(1) 时间戳转换为时间元组

time.gmtime() 返回的是UTC时间与北京时间少8小时。

UTC 协调世界时,又称世界统一时间,世界标准时间,国际协调时间,简称UTC。

ret = time.gmtime() # 把当前的时间戳转换为时间元组
print(ret) # 返回的是UTC时间与北京时间少8小时。
# time.struct_time(tm_year=2019, tm_mon=1, tm_mday=9, tm_hour=1, tm_min=26, tm_sec=18, tm_wday=2, tm_yday=9, tm_isdst=0)

Time.localtime()

ret = time.localtime(888888888) # 传递时间戳,将指定时间戳转化为时间元组
print(ret) # time.struct_time(tm_year=1998, tm_mon=3, tm_mday=3, tm_hour=9, tm_min=34, tm_sec=48, tm_wday=1, tm_yday=62, tm_isdst=0)

( 2)时间元组转换为时间戳

Time.mktime()

ret = time.localtime() # 当前时间元组
ts = time.mktime(ret) # 传递元组,转换为时间戳
print(ts) # 1546997715.0

9.6时间元组和格式化字符串之间的转换

时间元组转换为字符串

time.strftime("格式定义","结构化时间")  结构化时间参数若不传,则显示当前时间

ret = time.localtime(900000000)  # 指定时间戳,转换为时间元组
ts = time.strftime('%Y-%m-%d %X',ret) # 将时间元组转换为字符串格式化
print(ts) # 1998-07-10 00:00:00

字符串转换为时间元组

time.strptime(时间字符串,字符串对应格式)

ret = time.strptime('2019-01-09','%Y-%m-%d') # 字符串转换为时间元组
print(ret) # time.struct_time(tm_year=2019, tm_mon=1, tm_mday=9, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=9, tm_isdst=-1)

9.7结构化时间 --> %a %b %d %H:%M:%S %Y时间串

time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串

ret = time.asctime() # 美国时间
print(ret) # Wed Jan  9 09:48:51 2019

9.8时间戳 --> %a %b %d %H:%M:%S %Y时间串

time.ctime(时间戳)  如果不传参数,直接返回当前时间的格式化串

print(time.ctime()) # Wed Jan  9 18:04:01 2019
print(time.ctime(90000000)) # Wed Nov  8 00:00:00 1972

练习题:计算从出生到现在过了多少秒

import time
ret = time.time() # 时间戳表示的是从1970年1月1日00:00:00开始到现在的秒值
ret2 = time.strptime('1996-05-17','%Y-%m-%d')
ts = time.mktime(ret2)
print('我出生到现在活了',ret - ts,'秒' ) # 我出生到现在活了 714765906.9782751 秒