每日分享
An amateur practices until they can play it correctly, a professional practices until they can't play it incorrectly.
一个业余的练习直到他们能正确地演奏,一个专业的练习直到他们不能不正确地演奏。
小闫语录:
会与精是两种不同的概念,不要自满,请谦虚。
前言
昨天的文章『每天 3 分钟,小闫带你学 Python(二十五)』讲解了异常的相关知识,比如错误的分类、如何捕获异常、异常的传递等等。最重要的便是如何使用 try
捕获异常。
前面一直在讲包、模块、导入模块等等概念,但是这些东西是什么呢?今天的文章将进行讲解。
学习目标
1.了解模块的特点,概念以及表现形式。
2.学会制作模块。
3.熟练导入模块。
4.了解神奇的语句与 __all__
。
5.学习包的相关知识。
1.模块介绍
大家在练习的时候会发现,一个文件中写大量的代码会显得臃肿,好像穿了一件面包服,不那么灵活。如何才能像夏天一样清爽?那就是文件尽量的精简,只将相关的变量、函数等等放在文件中,这样执行起来方便,阅读时候也方便。Python 中就使用模块来管理具有相关性的代码,如果有些抽象,就说直白点,一个 .py
结尾的文件就是一个模块。
模块命名时要符合标识符命名规则,在模块中定义的全局变量、函数等都是提供给外界直接使用的工具,模块就好比是工具包,要想使用这个工具包中的工具,就需要先导入这个模块。
大家可能会想到,既然一个 .py
结尾的文件就是一个模块,那么我自己也可以制作模块咯?那是当然,只要你开心,什么都可以。
2.模块制作
模块制作有几点小要求:
1.首先它是一个 python 可执行的文件,即以 .py
结尾的文件。
2.模块名必须符合标识符规则,即只能包含数字、字母和下划线,且数字不能开头。
既然学习了编程,强烈建议大家以后所有的文件命名都符合此规则,这样在日常电脑使用中就不会因为文件名而报一些莫名其妙的错误了。
3.文件内只包含相关的内容,一些不想关的代码放置到其他模块中或者删除掉。
4.自我测试,即验证这个文件是否能正常执行,否则,其他人也没法使用。
5.测试成功,符合上述所有要求之后就可以将它称之为一个模块啦。
示例:
# 定义一个全局变量 msg = "这是小闫同学制作的模块" # 定义一个函数 def function(num): for i in range(num): print("媳妇儿我错了") # 测试函数 def test(): # 测试全局变量 print(msg) # 测试函数调用 try: function(3) except Exception as e: print(e) # 自己测试一下代码 test()
模块制作完成之后,当然要会导入模块啦?要不然其他人或者自己怎么使用呢?
3.模块导入
3.1 import
大家常见的方式。这种方式会一次性的将模块中所有的全局变量和函数之类的内容全部导入。导入模块的语法格式大家已经不陌生了:
import模块名1,模块名2
或者
import模块名1
import模块名2
如果要使用里面的内容该怎么办?用下面的方式:
模块名.全局变量名
模块名.函数名
...
3.2 from-import *
这种方式会一次性导入模块中所有的内容,如全局变量、函数等。但是!但是!但是!使用的时候不需要写模块名,可以直接使用全局变量名等。
导入模块语法格式:
from模块名import*
使用导入的模块内容:
全局变量名
函数名
...
就和自己的一样,想咋用咋用,随你开心。
但是不推荐使用此方式,因为你导入了一堆名字,也就意味着你自己文件中名字不能和这些名字冲突。当你的全局变量名和导入的模块中某名字相同时,不会提示你怎么错了,是个十分头疼的问题。
3.3 as
如果使用 import 模块名 方式导入模块,被导入的模块名又过长的时候,可以使用 as
指定模块的别名,以方便在代码中的使用。
示例:
import ethanyan as ey # 使用模块中的全局变量 ey.name # 使用模块中的函数 ey.function()
就是起个简单的名字,省事而已。
如果使用 from 模块名 imoport全局变量名,函数名 方式导入模块, 且被导入的全局变量、函数和本模块中的全局变量、函数的名字重名的时候,可以使用 as
指定全局变量、函数、类的别名。
示例:
from ethanyan import name as my_name
扩展小知识:导入模块的时候只写一个模块名,电脑怎么知道模块在哪里?系统其实有自己的规则,下面来讲讲。系统会提供搜索方式和匹配规则,也就是系统有一个包含搜索路径的列表,这个列表叫做
sys.path
。搜索路径由解释器在启动时按照优先级整理在这个列表中,其中过程很复杂,不需了解。那么搜索路径包含哪些呢?这个可以告诉你:程序根目录、环境变量(PATHONPATH)设定的路径列表、标准库的目录、第三方库等附加路径(也就是文件夹site-packages
中)。
4.神奇的语句
在导入模块的时候,所有没有缩进的代码都会被执行一遍,这就意味着,你写的一些测试代码也会被执行。可是我不希望那些被执行啊?可以删除掉,但是又想保留怎么办?可以使用一个神奇的语句:
if __name__ == '__main__': 执行测试内容
写在此语句内部的代码只有在测试时能被执行,其他人导入的时候不会被执行,厉不厉害?那么为什么呢?
答:__name__
是 Python 的一个内置属性(属性就和游戏中英雄人物属性一样,比如盖伦就是个坦克,它有大宝剑等等),它记录着一个字符串,如果是被其他模块导入的, __name__
的值就是该模块名;如果是执行当前程序, __name__
的值就是 __main__
。这就是为什么这个神奇语句如此书写了。
完善一下之前制作的模块:
# 定义一个全局变量 msg = "这是小闫同学制作的模块" # 定义一个函数 def function(num): for i in range(num): print("媳妇儿我错了") # 测试函数 def test(): # 测试全局变量 print(msg) # 测试函数调用 try: function(3) except Exception as e: print(e) if __name__ == '__main__': test()
可以根据
__name__
变量的值判断出,是直接执行的 python 脚本还是被引入执行的,从而能够有选择性的执行测试代码。
6. __all__
我们在模块中可以使用一个变量:
__all__ =[此列表中填写当前模块中变量名或者函数名,注意是元素是字符串形式]
如下:
__all__ = ["msg", "function"] # 定义一个全局变量 msg = "这是小闫同学制作的模块" # 定义一个函数 def function(num): for i in range(num): print("媳妇儿我错了") ......
__all__
列表中保存的全局变量、函数名等,在其他模块使用如下方式导入时,能够被使用:
from模块名import名称
也就是说, __all__
可以规定哪些变量和函数等被其他模块使用,哪些不能被使用,可以使用的写进列表中。
7.包
前面的文章中,因为没有学习本节知识,笼统的告诉大家模块和包其实一样,是因为他们导入的方式相同。但是他们是有些许差别的。
包是一个包含了很多模块的特殊目录(目录就是文件夹),特殊就特殊在包目录下会有一个文件 __init__.py
。包名一般由小写字母和下划线组成。
导入方式与模块就相同了。
比如:
import包名.模块名
# 使用方式
包名.模块名.函数名
再比如:
from包名import模块名
# 使用方式
模块名.函数名
还有:
from包名import*
# 使用方式
模块名.函数名
在包中,也可以使用 __all__
变量控制着那些,使用下列方式进行导入时可以被其使用的模块:
from包名import*
但是此变量不再写入模块中,而是在包中的 __init__.py
文件中定义 __all__
变量。
7.1 下载包
有些 Python 标准的包,我们是可以直接使用的,不需要下载,但是有些第三方包没有提供,我们需要下载。那么如何下载呢?(保证电脑有网络)
在电脑中安装 python 环境后,在命令行工具中输入如下命令,验证是否安装 pip 。
pip -V
如果计算机有 pip 命令,电脑会返回一些 pip 相关的介绍信息或者有可能返回 pip 的版本以及路径。如果计算机没有此命令会返回如下的信息:
C:\Users\ITxiaoyan>pip -V
'pip'不是内部或外部命令,也不是可运行的程序或批处理文件。
如果计算机有 pip 命令,那你可以使用如下命令进行安装第三方包:
pip install 包名
作业
1.自己制作一个模块,模块中定义一个全局变量和一个函数以及测试代码。要求测试代码在其他模块导入时,不会执行。
2.自己定义一个模块,并且定义哪些函数或者变量能被其他模块使用。
3.在一个模块中使用两种方法导入自己定义的模块。顺便练习一下如何起别名(使用 as 命令)
4.安装第三方模块 numpy
。