22.Python函数Python模块

Posted 孤寒者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了22.Python函数Python模块相关的知识,希望对你有一定的参考价值。

目录:

每篇前言:


Python函数(七)

1.1 Python模块

  • 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。
  • 下面是一个使用 python 标准库中模块的例子。
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import sys
print('\\n'.join(sys.path))
  • 输出:
(base) D:\\PycharmProjects\\demo1>python pythonlearn/test.py
D:\\PycharmProjects\\demo1\\pythonlearn
D:\\Anaconda3\\python37.zip
D:\\Anaconda3\\DLLs
D:\\Anaconda3\\lib
D:\\Anaconda3
D:\\Anaconda3\\lib\\site-packages
D:\\Anaconda3\\lib\\site-packages\\win32
D:\\Anaconda3\\lib\\site-packages\\win32\\lib
D:\\Anaconda3\\lib\\site-packages\\Pythonwin
  • 可修改PYTHONPATH环境变量,增加模块搜索路径:
(base) D:\\PycharmProjects\\demo1>set PYTHONPATH=.
(base) D:\\PycharmProjects\\demo1>python pythonlearn/test.py
D:\\PycharmProjects\\demo1\\pythonlearn
D:\\PycharmProjects\\demo1
D:\\Anaconda3\\python37.zip
D:\\Anaconda3\\DLLs
D:\\Anaconda3\\lib
D:\\Anaconda3
D:\\Anaconda3\\lib\\site-packages
D:\\Anaconda3\\lib\\site-packages\\win32
D:\\Anaconda3\\lib\\site-packages\\win32\\lib
D:\\Anaconda3\\lib\\site-packages\\Pythonwin

1.1.1 import 语句

语法如下:

  • import module1[, module2[,... moduleN]

一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
当我们使用import语句的时候,Python解释器会到搜索路径中查找,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。

实战讲解:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
# 导入模块
from pprint import pprint

nested = [list("abcs"), list("sdff"), [1, 45, 4, 6, 7, 8], list(range(12))]

# 现在可以调用模块里包含的函数了
pprint(nested)

1.1.2 from…import 语句

Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。
from…import相当于java的静态导入,只导入一个模块的指定部分
语法如下:

  • from modname import name1[, name2[, ... nameN]]

例如,要导入模块 datetime 的 datetime函数,使用如下语句:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
from datetime import datetime 

d = datetime.now()
print(d)

和import的区别:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
import datetime

d = datetime.datetime.now()
print(d)
  • 从上面的示例可以看出,from…import导入的方法可以直接调用,import导入的方法必须加上类名。

  • 把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
    from modname import *

例如我们想一次性引入 math 模块中所有的东西,语句如下:

from math import *

1.1.3 模块的搜索路径

默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中:

>>> import sys
>>> sys.path
['', '/Library/Python/2.7/site-packages/pycrypto-2.6.1-py2.7-macosx-10.9-intel.egg', '/Library/Python/2.7/site-packages/PIL-1.1.7-py2.7-macosx-10.9-intel.egg', ...]

如果我们要添加自己的搜索目录,有两种方法:
一是直接修改sys.path,添加要搜索的目录:

>>> import sys
>>> sys.path.append('E:/demo')

这种方法是在运行时修改,运行结束后失效。
第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。
例如:

set PYTHONPATH=.

1.1.4 dir()找到模块内定义的所有名称

dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:

# coding=utf-8

import math
print(dir(math))

在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名。

如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:

['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'math']

1.1.5 globals() 和 locals() 函数

  • 根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
  • 如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
  • 如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
  • 两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。

1.1.6 __all__&从一个包中导入*

from sound.effects import *

会执行effects 包下面的__init__.py并导入里面定义的内容,如果存在 __all__ 列表变量,那么就可以导入该列表指定的模块。
在:file:sounds/effects/__init__.py中包含如下代码:

__all__ = ["echo", "surround", "reverse"]

这表示当你使用from sound.effects import *这种用法时,会导入包里面这三个子模块。

1.1.7 __main__

Python解释器会将运行入口模块文件的__name__置为__main__

if __name__=='__main__':
    test()

当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

Python模块总结:

①总共有这几种导入的方式:

from car import Car               #从一个只包含一个类的模块中导入这个类

from car import ElectricCar       #从一个包含多个类的模块中导入一个类

from car import Car, ElectricCar   #从一个有多个类的模块中导入多个类

import car                         #导入整个模块         我们使用语法 module_name.class_name 访问需要的类

from  module_name import *         #导入模块中的所有类       (不建议使用,如果要用,推荐使用导入整个模块)

②代码实战使用:

第一种:

import datetime 					     # 导入整个datetime模块
a = datetime.datetime.now()    			 # 获取当前时间
#第一个datetime是模块,第二个datetime是模块里面的类,,now()是类里面的方法

第二种:
(1)

from datetime import datetime   		 #导入模块里面的一个类
a = datetime.now()        				 #直接就一个datetime就是模块里的类

(2)

from datetime import *         			 #导入这个模块里的所有类
a = datetime.now()						 #直接就一个datetime就是模块里的类

第三种:

from datetime import datetime as y   	 #取别名
a = y.now()

知识点补给站:

sys.path  		用于存放导入路径的列表,类似于环境变量中的 PATH
sys.argv        查看当前文件路径
__pycache__:	缓存文件

例子:

import sys
print(sys.path)		#在这个路径下面,就可以通过import直接导入。一个列表,在前面的路径优先级高。
					#只有在这个列表里面的路径的才能被导入。
  • 下面有两个问题,大家可以先自行思考,再看答案:

第一个问题:
如果自己写的一个文件和python自带的一个模块重名,而且自己写的这个文件在本目录下,那么如果直接导入这个模块,本目录下的优先级最高,就导入不了自带的那个模块,该怎么办呢?

解决方法: sys.path.insert(0,路径名),把想要导入的那个模块的路径改到列表的前面。

第二个问题:
如果需要导入的模块在别的盘,即不在这个路径列表里,该怎么导入?

sys.path.append(r'路径名')  

以上是关于22.Python函数Python模块的主要内容,如果未能解决你的问题,请参考以下文章

1.22 Python基础知识 - 正则表达式

22.Python模块

22. Python 模块2

22Python标准库系列之Redis模块

22.Python安装和卸载第三方模块方法

被使用次数最多的22个Python外部模块