模块基础 以及time模块和random模块
模块
模块其实就是一个个的 .py 文件,有内置的,第三方的,自定义的,而在执行文件中调用这些模块是用关键字 import 实现的
比如 main.py 这个文件是执行文件(在哪个文件执行程序哪个文件就是执行文件),可以用以下代码
import cal//先将cal文件执行一遍然后再执行下列代码 print(cal.add(3,5))//add()是cal里面定义的函数 也可以如下: from cal import add //这样的话就不用像上面一样要在 cal()函数前面加 cal. print(add(3,5)) 一般称cal这种文件为功能文件(功能模块),main这种文件叫逻辑文件(逻辑模块)
但如果执行文件是 bin.py 的话
import cal print(cal.add(3,5)) //这样的话结果会报错,必须如下调用 from my_module import cal print(cal.add(3,5)) //原因是python在执行文件时会有个路径,而python只认到执行文件的路径,也就是到 bin.py 这个文件的路径,在上面的例子中,cal.py 这个文件不是和 bin.py 同级,所以直接 //import的话会报错,只可以先到与 bin.py 同级的 my_moudule 同级的文件或文件夹中然后再调用 cal.py 这个文件 //bin.py 这种文件叫起始文件,作为程序的入口,如果在 bin.py 文件中调用 main.py 文件,则如果想在 main.py 文件中调用 cal.py 文件的话,也必须是 //from my_module import cal 这样,因为python只认执行文件也就是 bin.py 这个文件的路径,切记,在导入模块时,不要以当前文件作为参照,要以执行文件作为参照
比如你想在test.py文件中导入cal.py模块 有以下几种方法
from web.web1.web3 import cal print(cal.add(3,4)) 或者 from web.web1.web3.cal import add print(add(3,4)) 主要是这两种,当然还有第三种,第三种了解就好,不推荐用 在 web3 这个包的 __init__.py 文件中加入 from . import cal 然后在执行文件中加入 from web.web1 import web print(add(3,4))
//讲一下 __name__ 这个内置的变量的用法
在执行文件中 __name__变量的值为字符串 “__main__" ,良好的编程习惯是无论在哪个文件(逻辑文件看情况)中都加入 if __name__ == '__main__': 这段代码,在这段代码下面再写逻辑,因为我们写代码时无论是功能模块还是其他模块我们都需要测试这个模块的功能写得对不对,那在该文件中执行的话 __name__就是等价于 "__main__" 没有任何影响,可以执行,但是,我们写的文件都有可能会被其他的文件导入,而在其他的文件中导入该文件时,会把该文件的所有代码由上到下执行一遍,可是呢,人家导入你这个模块可能只是因为你这里写了某个函数,我就看上你这函数了,我只想调用你的这个函数,而你这个文件中其他无关代码我都不关心不想调用,那这个时候 if __name__ == '__main__': 就很有用了,因为如果该文件是被调用的文件,那在该文件中 __name__ 变量就不等于 "__main__" ,那这些在被调用文件里写的人家不需要的逻辑代码就不会被执行,这就是好处呀
还有就是我写的某个文件,我可以给你调用我在该文件写的函数或者接口,但是我在该文件写的逻辑代码我是不许别人调用的(因为有可能出大bug),那加上
if __name__ == '__main__': 就尤其重要啦
但是呀,我们在真正写大工程的时候,一般都是把全部的 .py 文件放在一个一个的包里,你给别人看到的就只有一个目录,是看不到bin.py这个文件的,那如果现在想在 bin.py里调用cal.py模块的话要怎么办呢
下面先介绍另一个内置变量
//__file__内置变量,值是当前执行文件的文件名而已
print(__file__) 结果 C:/python编程/test/bin/bin.py //这里其实是pycharm自作聪明给你加上的额,实际上只有 bin.py
那如果想在bin.py里导入cal.py的话要怎么办呢,这里需要在bin.py里临时修改path的路径
import sys,os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from module import cal print(cal.d_add(3,5)) 这样就可以用了 其实相当于将绝对路径 C:\python编程\test 加入了 sys.path这个模块查找路径当中,这样在执行 from module import cal 这个时就可以从 sys.path这个路径 列表中找到 C:\python编程\test 进而找到 C:\python编程\test\moudule\cal 因为__file__仅仅只是返回文件名不是返回绝对路径,而我们要加的是绝对路径,所以 os.path.abspath(__file__) 这句介绍返回 bin.py 文件的绝对路径C:/python编程/test/bin/bin.py os.path.dirname(os.path.abspath(__file__))是返回其上一级的绝对路径路径,就是 C:/python编程/test/bin ,再来一次就是返回了 C:\python编程\test,然后再添加进路径 列表 sys.path 中就可以了
//time模块
如上图,时间的表示有三种 ,结构化时间(struct_time),时间戳(timestamp),格式化时间(format string)
//显示时间戳(自1970年1月1日凌晨0点整开始到你执行显示时间戳的这段函数为止一共经历了多少秒) time()方法
import time print(time.time()) 结果 1533820160.8540502
//将时间戳转换成结构化时间 localtime()方法和gmtime()方法, localtime()方法是电脑本地的时间,gmtime()是国际时间 也就是西12区的时间 都是只有一个参数,接收时间戳,默认参数是调用这个方法时已经从1970年1月1日凌晨0点过去了多少秒(也就是time.time())
import time print(time.localtime(time.time()),type(time.localtime(time.time()))) 结果 time.struct_time(tm_year=2018, tm_mon=8, tm_mday=9, tm_hour=21, tm_min=12, tm_sec=23, tm_wday=3, tm_yday=221, tm_isdst=0) <class 'time.struct_time'>//返回的是一个time的对象 import time print(time.localtime()) 结果 time.struct_time(tm_year=2018, tm_mon=8, tm_mday=9, tm_hour=21, tm_min=14, tm_sec=8, tm_wday=3, tm_yday=221, tm_isdst=0) //gmtime()的用法和 localtime()的用法完全一样,只不过返回的是国际时间
//将结构化时间转换成时间戳 mktime() 方法
import time t = time.localtime(10000000000) print(t) print(time.mktime(t)) 结果 time.struct_time(tm_year=2286, tm_mon=11, tm_mday=21, tm_hour=1, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=325, tm_isdst=0) 10000000000.0
//转换成结构化时间有啥用呢?可以直接获取年,月,日,时,分,秒
import time t = time.localtime(10000000000) print(t.tm_year)#年 print(t.tm_min)#分 print(t.tm_wday)#星期几,从0开始算 结果 2286 46 6//星期天
//将结构化时间转换成格式化时间(就是你自己定义的时间表示方式) strftime()方法,两个参数,第一个参数自定义的格式化时间的格式,第二个参数结构化时间
import time t = time.localtime(10000000000) print(t) print(time.strftime('%Y--%m--%d--%H--%M--%S',t))//中间的分割符"--"是自己写的,随便写,年%Y 月%m 日%d 时%H 分%M 秒%S %X直接就是时分秒 结果 time.struct_time(tm_year=2286, tm_mon=11, tm_mday=21, tm_hour=1, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=325, tm_isdst=0) 2286--11--21--01--46--40
//将格式化时间转换成结构化时间 strptime() 方法 ,两个参数 自己感受
import time t = time.strptime('2018-3-29-5:20:0','%Y-%m-%d-%X') print(t) 结果 time.struct_time(tm_year=2018, tm_mon=3, tm_mday=29, tm_hour=5, tm_min=20, tm_sec=0, tm_wday=3, tm_yday=88, tm_isdst=-1) 或者 import time t = time.strptime('2018-3-29-5-20-0','%Y-%m-%d-%H-%M-%S') print(t) 结果 time.struct_time(tm_year=2018, tm_mon=3, tm_mday=29, tm_hour=5, tm_min=20, tm_sec=0, tm_wday=3, tm_yday=88, tm_isdst=-1)
上述的 strftime()将结构化时间转换成格式化时间需要自定义,如果你不想要那么麻烦,可以调用asctime()方法,传入一个结构化时间,它自己已经帮你定义好了一个格式,然后转换成格式化时间,默认参数是当前时间的结构化时间
import time t = time.strptime('2018-3-29-5-20-0','%Y-%m-%d-%H-%M-%S') print(t) print(time.asctime(t)) 结果 time.struct_time(tm_year=2018, tm_mon=3, tm_mday=29, tm_hour=5, tm_min=20, tm_sec=0, tm_wday=3, tm_yday=88, tm_isdst=-1) Thu Mar 29 05:20:00 2018
ctime() 也是转换成格式化时间,只不过是传入的是时间戳
import time print(time.ctime(1090000000)) 结果 Sat Jul 17 01:46:40 2004
//sleep()方法,延迟多少秒
还有另一个时间模块 datetime 只学一种用法就ok啦 因为time模块已经够用了
import datetime print(datetime.datetime.now()) 结果 2018-08-09 21:52:47.834247
random模块
//random.random()方法,生成0-1之间不包括头尾的小数
import random print(random.random()) 结果 0.8863760492598276
//random.randint()方法,两个参数,随机选取两个整型参数之间的某给整数,包括头尾
import random print(random.randint(3,6)) 结果 6
//random.randrange()方法,和上面的randint一模一样,只不过这个是包头不包尾
//random.choice()方法,传入一个列表,随机选取期间的某个元素
import random print(random.choice([1,2,3,4,5])) 结果 4
//random.sample()方法,两个参数,和上面的choice方法一样,只不过这个可以指定随机选取多少个元素,返回一个列表
import random print(random.sample([1,2,3,4,5],3)) 结果 [3,5,1]
//random.uniform()两个参数,随机选取两个参数之间的小数,不包头不包尾
import random print(random.uniform(2.3,4.5)) 结果 3.1385147214859597
//random.shuffle()方法,传入一个列表,将其中的元素顺序打乱
import random ret = [1,2,'asd','ss',4,6] random.shuffle(ret) print(ret) 结果 ['ss', 1, 4, 6, 'asd', 2]
给一个生成随机验证码的函数
import random def v_code(number): res = "" for i in range(number): num = str(random.randint(0,9)) while True: a = random.randint(65,122) if a >=91 and a<=96: continue else: alf = str(chr(a)) break res += random.choice([num,alf]) return res num = int(input("请输入要生成多少位验证码:")) rnd_code = v_code(num) print(rnd_code)