Loading

人生苦短,我用python-- Day5

本节目录                         

      模块定义

  包定义

  导入模块方法

  导入包的方法

  import模块本质

  import包本质

  路径搜索和搜索路径

  导入优化

  模块的分类

模块定义

  用来从逻辑上组织python代码(可以在里面定义变量、函数、类等,也可以写一些逻辑),本质上就是一个以.py结尾的python文件,来实现某些功能

    eg: 文件名 test.py 模块名 test

包的定义

  用来从逻辑上组织模块,包的本质就是一个目录(必须带一个__init__.py的文件)

导入模块方法

 1 # Author:Sean sir
 2 #方法一:
 3 #单独导入一个模块
 4 import module_test1
 5 #使用方法
 6 module_test1.fun1()
 7 
 8 #方法二:
 9 #同时导入多个模块
10 import module_test1,module_test2
11 #使用方法
12 module_test1.fun1()
13 module_test2.fun1()
14 
15 #方法三:
16 #同时导入某个某块中中的所有代码(如:变量、方法、类等),加入模块中有fun1方法
17 from  module_test1 import *
18 #使用方法
19 fun1()
20 
21 #方法四:
22 #也可是使用from来导入某个方法
23 from  module_test1 import fun1
24 #使用方法
25 fun1()
26 
27 print(module_test1.name)
28 module_test1.say_hello()

上面的方法三和方法四不建议使用,原因是这样会导致本地的方法会和模块中的方法冲突,如下:

# Author:Sean sir

# test1.py中也定义一个名为say_hello的方法
def say_hello():
    print('in the test1.py')
# 然后调用模块中的所有方法,当然这里是用方法四的方式饮用模块,同样也是这样的
from  module_test1 import *
# 执行say_hello方法
say_hello()
# 输出
in the module_test1.py

为了解决上面的问题,我们来看方法五:

# Author:Sean sir

# test1.py中也定义一个名为say_hello的方法
def say_hello():
    print('in the test1.py')
# 然后调用模块中的所有方法,在用模块中的方法的同时给方法名字重命名
from  module_test1 import  say_hello as test1_say_hello
# 执行say_hello方法
say_hello()

# 执行模块中的say_hello方法
test1_say_hello()

#输出
in the test1.py
in the module_test1.py

答惑解疑:

  我们使用方法四可以同时导入两个或者更多的方法,但是我们不能使用方法五来同时对两个或多个方法进行重命名的操作

# 错误的导入方式
from  module_test1 import  say_hello1,say_hello2 as test1_say_hello,test2_say_hello

导入包的方法

# 导入一个包
import  aa

倒入包且调用包中模块的方法

########run_test.py文件内容
'''
    需求说明:有两个包,分别为d5/modlue1 d5/modlue2,前者下面有一个fun_test模块,
            后者又一个run_test的代码程序文件,在run_test文件引用modlue1包的同时,
            执行fun_test里面的run方法
'''
# 调用os和sys模块
import os,sys
# 获取d5目录的绝对路径
PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 把d5目录的绝对路径加到搜索路径里面
sys.path.append(PATH)
# 引用modlue1包
import modlue1
# 运行modlue1包里面fun_test模块中的run方法
modlue1.fun_test.run()
######modlue1包下的init文件内容
# Author:Sean sir
print('in the modlue1 package')
# 调用本目录下的fun_test模块
from . import fun_test
# Author:Sean sir
# fun_test.py文件内容
def run():
    print('in the run')

输出一下执行结果

in the modlue1 package
in the run

import模块本质

  导入模块的本质就是把python文件解释一遍,但是使用from和直接使用impor是有本质区别的,我们来看一下:

# Author:Sean sir
# 使用这种方式导入,相当于把moule_test1里面的代码运行了一遍,切把代码的执行过程赋值给一个名为module_test1的变量名
import module_test1
# 所以如果使用上述中的方法,直接用module_test1加模块里面的方法名称就可以了,如下
module_test1.say_hello1()

# 使用这种方式导入,相当于把moule_test1中的say_hello1方法赋值给say_hello1
from  module_test1 import say_hello1
# 调用这个方法,直接使用方法名就可以了
say_hello1()

import包本质

  执行该包下的__init__.py文件

搜索路径和路径搜索 

  我们在python中不管是导入模块还是导入包,python自己会有一个列表,python会根据这个列表的路径进行搜索我们所需要的模块或包名字,如果找到则导入,如果找不到,则抛出异常,我们来看看这个搜索路径是什么呢?

>>># 这就是搜路径
>>> import sys >>> sys.path ['', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']

当我们导入包或模块的时候,系统就会按照这个路径进行搜索。

下面需求来了,假如我们要导入一个不在同一个目录中的模块,当然这个模块是我们手动定义的且不在上面路径中,我们怎么办呢?

# Author:Sean sir
'''
    需求说明: 路径结构 d5/modlue1/fun_test.py d5/modlue2/run_test.py
             要在run_test.py文件中调用fun_test.py模块,且运行里面的方法
'''
# 调用os和sys模块
import os,sys
# 查找到d5的绝对路径
PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 把d5的绝对路径加到python的搜索路径中
sys.path.append(PATH)
# 导入模块d5/modlue1/fun_test模块
from modlue1 import fun_test
# 运行d5/modlue1/fun_test模块里的run方法
fun_test.run()

# 输出
in the run

解释下上面的代码,__file__显示的是当前文件的相对路径,os.path.abspath()显示的是当前文件的绝对路径,os.path_dirname()显示的是当前文件的所在目录,也就是说上一层的目录

导入优化

  假如有一个方法要被重复调用N次,如果我们还是使用import module_name的方式进行调用的话,那么在找模块的时候会消耗很大的时间,这个时候我们就建议使用from module_name import fun_name as fun_new_name的方式进行调用了。

模块分类

  标准库模块、开源模块、自定义模块

  标准库模块

  1.time 和 datetime模块

    在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素。由于Python的time模块实现主要

    调用C库,所以各个平台可能有所不同。

    UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令

    时。

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

    float类型。返回时间戳方式的函数主要有time(),clock()等。

eg:  

>>> import time
>>> time.time()
1472203851.802466

      元组(struct_time)方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。下面列出这种方式元

    组中的几个元素

eg:

>>> import time
>>> time.localtime()
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=26, tm_hour=17, tm_min=33, tm_sec=51, tm_wday=4, tm_yday=239, tm_isdst=0)

说一下time模块中的方法:

1.daylight

# 测试是否使用了夏令时时间
>>> print(time.daylight) 0

2.time()

#获取过去时间戳 从1970年到现在的秒数
>>> time.time() 1472206530.91158

3.sleep()

# 等待2秒钟在执行下面代码
>>> time.sleep(2)

4.gmtime()

#传入一个时间戳,返回一个元组格式的时间(UTC时间,比北京时间晚8个小时),如果不传的话,默认使用当时时间。
>>> a = time.time()
>>> time.gmtime(a)
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=26, tm_hour=10, tm_min=19, tm_sec=2, tm_wday=4, tm_yday=239, tm_isdst=0)
>>> time.gmtime()
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=26, tm_hour=10, tm_min=19, tm_sec=13, tm_wday=4, tm_yday=239, tm_isdst=0)

5.localtime()

#把时间戳转换成元组格式时间(转换成本地时间,如北京时间),不传默认使用当前时间
>>> a = time.time()
>>> time.localtime(a)
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=26, tm_hour=18, tm_min=19, tm_sec=2, tm_wday=4, tm_yday=239, tm_isdst=0)
>>> time.localtime(19827643)
time.struct_time(tm_year=1970, tm_mon=8, tm_mday=18, tm_hour=19, tm_min=40, tm_sec=43, tm_wday=1, tm_yday=230, tm_isdst=0)
>>> 

 



 

posted @ 2016-08-26 10:16  屌丝逆袭记  阅读(323)  评论(0编辑  收藏  举报