22.Python函数Python模块
Posted 孤寒者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了22.Python函数Python模块相关的知识,希望对你有一定的参考价值。
目录:
每篇前言:
🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者
- 🔥🔥本文已收录于Python全栈系列专栏:《Python全栈基础教程》
- 🔥🔥热门专栏推荐:《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《爬虫高级》、《前端系列教程》、《tornado一条龙+一个完整版项目》。
- 📝📝本专栏面向广大程序猿,为的是大家都做到Python从入门到精通,同时穿插有很多很多习题,巩固学习。
- 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
- 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
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模块的主要内容,如果未能解决你的问题,请参考以下文章