一、介绍
在Python中,程序都是以单个.py
为后缀的文件运行。随着程序的变长,可能需要将其拆分为几个文件以便于维护。有时候可能几个程序都需要相同的功能,显然每次把需要的功能复制到文件中并不利于维护,如果我们要修改功能,就必须修改每个文件,这样不仅操作不方便,而且容易出错。
为了满足这些需求,Python引入了模块的概念,可以把需要重复利用的代码定义在一个文件中,并在脚本或者Python交互式解释器中使用它们。定义重复利用的代码的文件称为模块,模块中定义的代码可以被导入到另一个模块或者主模块(脚本执行时可以调用的变量集位于最高级,并且处于计算器模式)中。
二、模块
2.1、模块介绍
模块就是一个包含了Python定义和声明的.py
文件(模块命名规则和变量名规则相同),例如:新建一个fc.py
文件
# fc.py
def foo(a,b):
return a+b
接下来我们可以在与fc.py
同一个目录下使用这个模块,例如:
import fc
print(foo(1,2))
2.2、__name__变量
模块的模块名可以通过全局变量__name__
获得,例如:
import fc
print(fc.__name__)
print(__name__)
# 输出
# fc
# __main__
在Python中,__name__
是当前模块名。如果模块被运行时模块名为__main__
,则当前模块是被运行的,反之,则当前模块是被导入的。
if __name__ == "__main__":
print("直接运行")
else:
print("被作为模块导入")
2.3、dir函数
dir
函数可以列出对象的模块标识符,标识符有函数、类和变量。当你为dir
函数提供一个模块名的时候,它返回模块定义的名称列表。如果不提供参数,它返回当前模块中定义的名称列表,例如:
import fc
print(dir(fc))
# 输出
# ['__builtins','__cached__','__doc__','__file__','__loader__','__name__','__package__','__spec__','foo']
可以从结果中看出,模块fc
中定义了函数foo
,使用dir
函数可以方便我们了解对象(模块也是对象)的构造。
2.4、使用模块
模块也是对象,所以调用模块中的内容和调用对象中的内容的方法是一样的,但是要先引入模块,例如:
# 导入整个模块
import fc
fc.foo(1,2)
还可以导入模块中的部分功能函数,例如:
# 导入模块中的部分函数
from fc import foo
foo(1,2)
import
和 from...import...
的区别:
-
import
是导入整个模块,from...import...
是导入模块中的部分功能; - 使用
import
方式要通过对象调用模块内部的函数; - 使用
from...import...
方式可以直接使用函数,不需要通过对象调用;
三、包
3.1、使用包
Python通过模块来组织代码,模块即一个py文件,是通过“包”来加以组织的,而“包”
则是
一个包含__init__.py
的文件夹
,代码、模块和包,它们三者的关系就是:“包”包含模块且至少包含一个__init__.py
模块,模块包含代码。
简单来说,包就是文件夹,且该文件夹下必须有__init__.py
文件,该文件的内容可以为空。__init__.py
用于标识当前文件夹是一个包。
在包内目录下创建test.py
# test.py
import fun1
from package.fun2 import print2
fun1.print1()
print2()
3.2、包在多目录中使用
当你导入一个模块或者包的时候,Python解释器对模块位置的搜索顺序是:
(1)首先查找当前目录;
(2)如果不在当前目录,Python则会搜索Shell
变量PYTHONPATH
下的每个目录;
(3)如果都找不到,Python就会查看默认路径。Unix系统下,默认路径一般为/usr/local/lib/python/
;
四、标准库
Python官方提供了很多包和模块,我们称之为标准库。Python标准库会随着Python解释器一起安装到你的电脑中,在此只是简单介绍一些较为实用的功能。
4.1、sys
sys模块的功能很多,提供了许多函数和变量来处理Python运行时环境的不同部分。
1、识别操作系统
import sys
print(sys.platform)
# 输出
# win32
系统 | 执行结果 |
Linux | ‘linux’ |
Windows | ‘win32’ |
Windows/Cygwin | ‘cygwin’ |
Mac OS X | ‘darwin’ |
2、处理命令行参数
sys.argv
变量可以获取命令行的参数。argv
是一个list类型的变量,它会返回在命令行中用户输入的参数,例如:
import sys
print(sys.argv)
3、退出程序
执行到主程序末尾,解释器会自动退出,如果需要中途退出程序,可以调用sys.exit
函数,它带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit
的调用(0是正常退出,其他为异常)
import sys
if len(sys.argv) <= 1:
print("缺少参数")
sys.exit(1)
for arg in sys.argv:
print(arg)
如果直接执行该文件,则执行结果如下:
缺少参数
程序会提示“缺少参数”后退出程序;如果我们带上参数运行程序,该程序则会打印出所有的参数内容。
4、获取模块搜索路径
在sys.path
中存储了python结束其需要搜索的所有路径,并且我们可以通过该变量修改搜索模块的路径。
import sys
for path in sys.path:
print(path)
由于sys.path
是列表类型的变量,所以我们可以像修改列表一样修改sys.path
变量来增加python解释器查找模块的路径,例如:
import sys
def print_path():
for path in sys.path:
print(path)
print("修改前")
print_path()
sys.path.append("c:\\")
print("修改后")
print_path()
5、查找已导入的模块
sys.modules
是一个全局字典,该字典在Python启动后就加载到内存中。每当程序员导入新的模块时,sys.modules
就会自动记录该模块。当第二次导入该模块时,Python会直接到字典中查找,从而加快程序运行的速度。sys.modules
拥有字典所拥有的一切方法,例如:
import sys
print(sys.modules.keys())
print(sys.modules.values())
print(sys.modules["os"])
4.2、os
Python的os
模块封装了操作系统的文件和目录操作。
1、获取当前文件所在目录
import os
print(__file__)
print(os.path.dirname(__file__))
__file__
是Python的内置变量,os.path.dirname(__file__)
表示的是文件当前的位置。
2、获取当前路径以及切换当前路径
import os
print(os.getcwd())
os.chdir("c:\\")
print(os.getcwd())
os.getcwd
可以获取当前执行程序的路径,os.chdir
可以切换当前的路径。
3、重命名文件
import os
os.rename("before.txt","after.txt")
rename
函数会将文件before.txt
重命名为after.txt
4、查看指定的路径是否存在
import os
folder = os.path.exists("c:\\windows")
print(folder)
os.path.exists
可以判断目录或者文件是否存在,如果存在则返回“True”,反之则返回“False”。
5、判断给出的路径是否是一个文件
import os
folder = os.path.isfile("c:\\windows\\system32")
print(folder)
os.path.isfile
可以判断给出的路径是否是一个文件,如果不是文件或者文件不存在都会返回“False”,如果是文件则返回“True”。
6、判断给出的路径是否是一个目录
import os
folder = os.path.isdir("c:\\windows\\ststem32")
print(folder)
os.path.isdir
可以判断给出的路径是否是一个目录,如果不是目录或者目录不存在都会返回“False”,如果是目录则返回“True”。
7、获取系统环境变量
import os
for k,v in os.environ.items():
print(k,"=>",v)
8、创建单层目录
import os
os.mkdir("d:\\w01")
os.mkdir
方法只能创建一层目录,在有父目录的情况下创建子目录,如果父目录不存在则不能创建并输出错误。
9、创建多层目录
import os
os.makedirs("d:\\w01\\t1")
os.makedirs
和os.mkdir
的用法完全一样,区别是os.makedirs
可以创建多层目录,如果父目录不存在则先创建父目录。
4.3、math
1、math库中的两个常量
math
库中提供了两个常量供计算使用,包括圆周率和自然常数。
import math
print("圆周率:",math.pi)
print("自然常数",math.e)
2、math库中的运算函数
(1)向上取整
import math
print("1.7",math.ceil(1.7))
(2)向下取整
import math
print("1.7",math.floor(1.7))
(3)指数运算
import math
print("2^4",math.pow(2,4))
(4)对数运算(默认底数为e,可以使用第二个参数来改变对数的底数)
import math
print("log(3)",math.log(3))
print("log(100,10)",math.log(100,10))
(5)平方根计算
import math
print("sqrt(4)",math.sqrt(4))
(6)三角函数
import math
print("sin(pi/2)",math.sin(pi/2))
print("cos(pi)",math.cos(pi))
print("tan(0)",math.tan(0))
(7)角度和弧度互换
import math
print(math.degrees(math.pi)) # 弧度制转角度值
print(math.radians(90)) # 角度制转弧度制
4.4、random
- 使用
rand.seed(x)
改变随机数生成器的种子seed。 -
random.random
用于生成一个0-1的随机浮点数:0<= n < 1.0:
import random
print(random.random())
-
random.uniform
用于生成一个指定范围内的随机浮点数:
import random
# 输出一个1到150之间的随机浮点数
print(random.uniform(1,150))
-
random.randint
用于生成一个指定范围内的整数:
import random
print(random.randint(1,150))
-
random.choice
会从给定的序列中获取一个随机元素:
import random
seq1 = (1,15,8,97,22)
seq2 = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]
print(random.choice(seq1))
print(random.choice(seq2))
-
random.shuffle
用于将一个列表中的元素打乱:
import random
seq1 = list(range(1,10))
seq2 = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]
print("打乱前")
print(seq1)
print(seq2)
random.shuffle(seq1)
random.shuffle(seq2)
print("打乱后")
print(seq1)
print(seq2)
random.shuffle
会修改原来的序列,所以原来的序列必须是可修改的,因此元组等类型不能作为random.shuffle
的参数使用。
五、安装第三方库
如果你使用的是Ubuntu系统,请确保已经安装了python 3-pip
软件包。如果不确定或者未安装,请运算:
sudo apt install
如果你使用的是CentOS系统,请确保已经安装python 34-pip
软件包。如果不确定或者未安装,请运算:
sudo yum install
一切准备就绪之后,就可以在终端输入:
pip3 --version
来确认我们安装的pip是否正常工作。请注意输入的是pip3
,而不是pip
,因为许多版本的操作系统尤其是Linux操作系统都会预装Python 2版本的pip
,使用pip3
可以确保我们使用的是Python3版本的pip。
命令 | 功能 |
pip3 list | 列出已安装的软件包 |
pip3 search 关键字 | 搜索软件包 |
pip3 install 软件包名字 | 安装软件包 |
pip3 uninstall 软件包名字 | 卸载指定的软件包 |
如果我们有许多第三方库需要安装,可以把需要安装的软件写入到一个纯文本文件(一般命名为requirements.txt)中,一行写一个软件包。例如:
Jinja2==2.8
Mako==1.0.4
Markdown==2.6.6
PyMsSQL==0.7.5
six==1.10.0
然后我们可以使用命令:
pip3 install
一次性向安装这些软件,方便又快速。
六、globals和locals函数
Python内置了两个函数–globals和locals,它们提供了基于字典的访问局部和全局变量的方式。
在理解这两个函数是,我们首先要了解一下Python中的名字空间(或称为命名空间namespace)概念,Python使用名字空间记录变量的轨迹。名字空间只是一个字典,它的键就是变量名,值就是变量的值。实际上,名字空间可以像Python的字典一样进行访问。
每个函数都有着自己的名字空间,叫做“局部名字空间”,它记录了函数的变量,包括函数的参数和局部定义的变量。
每个模块都拥有自己的名字空间,叫做“全局名字空间”,它记录了模块的变量,包括函数、类、其他导入的模块、模块级的变量和常量。
还有就是“内置名字空间”,任何模块均可以访问它,它存放着内置的函数和异常。
当一行代码要使用变量x的值时,Python会按照如下顺序到所有可用的名字空间中查找变量:
(1)局部名字空间–特指当前函数或类的方法。如果函数定义了一个局部变量x,Python将使用这个变量,然后停止搜索;
(2)全局名字空间–特指当前的模块。如果模块定义了一个名为x的变量、函数或类,Python将使用这个变量,然后停止搜索;
(3)内置名字空间–对每个模块都是全局的。作为最后的尝试,Python将假设x是内置函数或变量;
如果Python在这些名字空间中都找不到x,它将放弃查找并引发一个NameError的异常,同时传递"There is no variable named x"这样一条信息。
像Python中的许多内置函数一样,名字空间在运行时直接可以访问。但是,局部名字空间也可以通过内置的locals
函数来访问,全局名字空间可以通过内置的globals
函数来访问。
local_var = locals().copy()
for k,v in local_var.items():
print(k,"=>",v)
locals()函数可以返回所有内置的本地变量。如果我们在文件中定义过任何东西,locals()函数也会返回。
from math import *
glocal_var = globals().copy()
for k,v in glocal_var .items():
print(k,"=>",v)
globals()函数可以返回所有模块级别的变量、函数等。