模块(model)

模块(module )

例子:

以Python内建的calendar模块为例,其名称为calendar.py,里面定义了一些日历格式。只要使用import指令导入此模块,就可以使用calendar模块了

模块的优点:

  • 提高了代码的可维护性
  • 提高了代码的复用性
  • 可以导入很多功能模块(标准库模块,自定义模块,第三方模块)
  • 避免了变量名重复

Python中导入模块的方法的简单形式主要如下三种:

import 模块名
import 模块名 as 新名称
from 模块名 import 函数名

二月:闰年29,平年28

  • import…

import calendar #导入calendar模块
print(calendar.month(2019,4))#调用模块中的month()函数
print(calendar.isleap(2019))#isleap函数是判断是否为闰年

     April 2019
Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

False
  • import … as …
  • anaconda
import calendar as cal
print(cal.month(2019,4))
print(cal.isleap(2019))

    April 2019
Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

False
  • from … import …

注意:

import语句块的模块顺序:

我们推荐所有的模块在Python模块的开头部分导入。而且最好按照这样的顺序:

  • python标准库模块
  • Python第三方模块
  • 应用程序自定义模块

然后使用一个空行进行分割这三类模块的导入语句,这将确保模块使用固定的习惯导入,有助于减少每个模块需要的import语句数目。其它的提示参考《Python风格指南》(Python’s Style Guide),PEP8。

*限制使用“from module import

在实践中, 我们认为 “from module import *” 不是良好的编程风格, 因为它"污染"当前名称空间, 而且很可能覆盖当前名称空间中现有的名字; 但如果某个模块有很多要经常访问的变量或者模块的名字很长, 这也不失为一个方便的好办法。

我们只在两种场合下建议使用这样的方法, 一个场合是:目标模块中的属性非常多, 反复键入模块名很不方便, 例如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模块, 可能还有socket 模块。另一个场合是在交互解释器下, 因为这样可以减少输入次数。

模块的路径查看:

模块名._file_

自定义模块

所谓函数自定义模块就是我们自已动手写的模块(.py文件),既可以是一个解决某个问题的独立程序也可以包含多个函数。

自定义模块命名的名称就是我们编写的Python程序名称

例子:

在前面的课程中,我们以及接触过斐波那契

现在我们创建一个名为fibo.py的文件,内容如下:

#程序名称为fibo.py
#斐波那契数列模块
def fib_01(n):    #输出最大数小于n的斐波那契数列
    i, j = 0, 1
    while j < n:
        print(j, end = ' ')
        i, j = j, i + j
        print()

def fib_02(n):    #以列表的形式输出最大数小于n的斐波那契数列
    result = []
    i, j = 0, 1
    while j < n:
        result.append(j)
        i, j = j, i + j
        return result

模块搜索路径

前面我们在导入惯块时是要求在fibo.py所在路径下打开命令窗口,为什么呢?

一般情况下 , Python解释器在运行程序时,在这之前会自动将程序所在的当前目录添加到sys.path路径列表下,然后,优先搜索当前路径下的模块。在Windows系统中,其默认模块搜索路径为Python安装目录及其安装目录下的几个子文件夹,我们可以在python解释器环境下,通过以下方式直看:

>>> import sys  *导入sys模块
>>> print(sys .path)  #输出当前的模块搜索路径,以列本形式显示

      [', 'D:\\Python36\\python36. zip', 'D:\\Python36\\DLLs','D:\Python36\\1ib', 'D:\Python36 '。'D:\\python36\\lib\\site-peckages ']
>>>

如果我们希望不在fibo.py文件所在目录路径下启动cmd命令窗口就可以导入fibo.py模块,我们可以用:

sys . path. append( AddPath)

临时添加fibo.py文件所在目录路径。

现在,打开cmd:


C:\Users\Administrator>python
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('F:\\untitled3')
>>> import funtion
>>> funtion.fib_01(100)
1
1
2
3
5
8
13
21
34
55
89

如果不同的人編写的模快名相同怎么办?为了避免模块名冲突, Python又引入了按目录来组织模块的方法,称为包( Package)。

举个例子,一个name1. py的文件就是一-个名字叫name1的模抉,一个name2. py的文件就是一个名字叫: name12的模块。

现在,假设我们的name1和name12这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycode’ ,按照如下目录存放:

mycode
 _init_.py
 name1.py
 name2.py

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与別人冲突。现在, name1.py模块的名字就変成了mycode .name1 , 类似的, name2. py的模块名変成了mycode .name2。

清注意,毎一个包目录下面都会有- -个_ init_ .py的文件 ,这个文件是必须存在的,否則, Python就把这个目录当成普通目录,而不是-个包。init__ .py 可以是空文件,也可以有Python代码,因为_ init_ .py本身就是一个模快,而它的模抉名就是mycode。

类似的,可以有多级目录,组成多级层次的包结构。比如以下的目录结构:

mycode
→web↓
     _init_.py↓
     utils.py↓
     www.py
→name1.py
→name2.py

文件ww. py的模块名就是mycode.web.ww

  Notes:自己创建模块吋要注意命名,不能和Python自带的模块名称冲突。例如,系統自带了sys模块,自己的模块就不可命名カsys.py ,否则将无法入系統自帯的sys模块。

Python常用内置模块之time、datetime

(1) time模块

在Python中,表示时间通常有以下几种方式:

- 时间戳(timetamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。如果运行“type(time.time())”,返回的是float类型。
- 格式化时间字符串(Format String)
- 结构化的时间(struct_time):struct_time元组中共有9个元素(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)

为方便理解,现在举例说明:

i.时间戳的理解

import time
print(time.time())#1555569190.5307221
time.sleep(1)#程序挂起进程1秒钟
print(time.time())#1555569191.5311413

ii.格式化时间字符串

print(time.strftime("%Y-%m-%d %x"))#2019-04-18 04/18/19
print(time.strftime("%Y-%m-%d %H:%M:%S"))#2019-04-18 14:37:02

iii.结构化的时间

print(time.localtime())#本地时区
输出:time.struct_time(tm_year=2019, tm_mon=4, tm_mday=18, tm_hour=14, tm_min=42, tm_sec=10, tm_wday=3, tm_yday=108, tm_isdst=0)

这里我们可以看出struct_time有9个元素,我们可以通过索引值引用某个值。

print(time.localtime()[3])#11

通过以上例子,可以看出时间戳是计算机能够识别的时间;时间字符串是我们人能够看懂的时间,而元组则是用来操作时间的。

几种时间格式的转换:

![](C:\Users\Administrator\Pictures\Saved Pictures\time.png)

时间戳和结构化时间的转化

print(time.gmtime(时间戳))
#UTC时间,与英国伦敦当地时间一致

time.localtime(时间戳)
#当地时间,例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时=北京时间

例子:

print(time.localtime(15000000000))
#time.struct_time(tm_year=2445, tm_mon=5, tm_mday=1, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=0, tm_yday=121, tm_isdst=0)


print(time.gmtime(1500000000))
#time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)

结构化时间和时间戳的转化

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

demo:

print(time.strptime("2018-10-23", "%Y-%m-%d"))
#time.struct_time(tm_year=2018, tm_mon=10, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=296, tm_isdst=-1)


print(time.strptime("10/23/2018", "%m/%d/%Y"))
#time.struct_time(tm_year=2018, tm_mon=10, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=296, tm_isdst=-1)

结构化时间和字符串时间转化

strftime(format[, t])

把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个元素越界,ValueError的错误将会被抛出。

例子:

print(time.strptime("%Y-%m-%d %x", time.localtime()))

结构化时间和字符串时间转化

time.asctime(结构时间)

如果不传参数,直接返回当前时间的格式化串。

例子:

print(time.asctime(time.localtime(1500000000)))
#Fri Jul 14 10:40:00 2017

print(time.asctime())
#Thu Apr 18 16:22:11 2019

(2)datetime模块

datetime模块用于是date和time模块的集合集,datetime有两个常量,MAXYEAR和MINYEAR,分别是9999和1。

datetime模块定义了5个类,分别是:

序号类名说明
1datetime.date表示日期的类
2datetime.datetime表示日期时间的类
3datetime.time表示时间的类
4datetime.timedelta表示时间间隔,即两个时间点的间隔
5datetime.tzinfo时区的相关信息

例子:

import time,datetime

print(datetime.datetime.now())#返回当前系统时间
#2019-04-18 16:35:26.709969

print(datetime.datetime.now().date())#返回当前日期时间的日期部分
#2019-04-18

print(datetime.datetime.now().time())#返回当前日期时间的时间部分
#16:35:26.709969

print(datetime.datetime.now() + datetime.timedelta(-1))#当前时间减1天
#2019-04-17 16:35:26.709969

print(datetime.datetime.now() + datetime.timedelta(hours = 1))#当前时间加1小时
#2019-04-18 17:35:26.709969
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值