定义重复利用的代码的文件被称为模块。模块中定义的代码可以被导入到另一个模块或者主模块中。
其中,模块就是一个包含了python定义和声明的“ .py ”文件。例如我们定义一个“ fib.py ”的文件,内容如下:
def fib1(n):
a = 2
b = 2
while b < n:
print(b)
b *= 2
def fib2(n):
result = []
a = 2
b = 2
while b < n:
result.append(b)
b *= 3
return result
模块也是对象,所以调用模块中的内容和调用对象中的内容的方法是一样的。首先,我们需要在同级目录下再另建一个文件test.py,如下图👇:
然后我们再进入到test.py文件中去调用fib.py模块,例如👇:
import fib
fib.fib1(20)
print(fib.fib2(20))
#2
#4
#8
#16
#[2,6,18]
模块的模块名可通过全局变量“__name__”来获得。例如(此时我们还是在test.py中执行)👇:
import fib
print(fib.__name__)
print(__name__)
#fib
#__main__
可以看到,fib的“__name__”打印出来的是fib,但是第二个print也就是打印本文件的“__name__”却是“__main__”。
在python中,“__name__”是当前模块名,如果当前模块被直接运行,那么此时它的模块名就是“__main__”。(就像我们在test.py模块中直接运行它)。所以,我们在定义模块时,可以通过看当前的“__name__”变量的值是否为“__main__”来判断当前文件是被直接运行还是作为模块被导入。例如(在test中)👇:
if __name__ == "__main__":
print("直接运行")
else:
print("作为模块被导入")
#直接运行
import fib
if fib.__name__ == "__main__":
print("直接运行")
else:
print("作为模块被导入")
#作为模块被导入
d i r dir dir函数可以列出对象的模块标识符,标识符有函数、类和变量。当为 d i r dir dir函数提供一个模块名的时候,它返回模块定义的名称列表。如果不提供参数,则返回当前模块中定义的名称列表。例如👇:
import fib
print(dir(fib))
print(dir())
#['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib1', 'fib2']
#['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib']
从执行结果可以看到一些内置变量,也可以看到在fib中定义的两个函数fib1和fib2。
代码、模块、包它们三者的关系是:“包”包含模块且至少包含一个“__init__.py”文件,模块包含代码。
简单来说,包就是文件夹,且该文件夹下必须有“__inti__.py”文件,该文件的内容可以为空。__init__.py用于标识当前文件夹是一个包。
包可以在python中新建,如下图👇:
现在我们要来使用包,创建包后,需在它的目录下另外创建3个文件,一定要包含__init__.py,如下图👇:
fun1.py中的代码为:
def print1():
print("fun1")
fun2.py中的代码为:
def print2():
print("fun2")
__inti__.py中的代码为:
if __name__ == "__main__":
print("作为主程序运行")
else:
print("package 初始化")
然后我们需要在与Package1同级目录下创建一个文件来调用这个包,如下图👇:
这里创建的是一个work.py来调用包。work.py中的代码为:
from Package1.fun1 import print1
from Package1.fun2 import print2
print1()
print2()
#package 初始化
#fun1
#fun2
Python官方提供了不少包和模块,我们称之为标准库。下面介绍一些常用的标准库中的模块。
s y s sys sys模块的功能很多,这里介绍一些比较实用的功能。 s y s sys sys模块提供了许多函数和变量来处理python运行时环境的不同部分。
import sys
print(sys.platform)
#win32
处理命令行参数(sys.argv)
s
y
s
.
a
r
g
v
sys.argv
sys.argv变量可以获取命令行的参数。
a
r
g
v
argv
argv是一个list类型的变量,它会返回在命令行中用户输入的参数。
详情可以点击下面链接,来源:CSDN博主——流动的风与雪。
http://t.csdn.cn/s20Y8
退出程序(sys.exit)
执行到主程序末尾,解释器会自动退出,如果需要中途退出程序,可以调用
s
y
s
.
e
x
i
t
sys.exit
sys.exit函数,它带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对
s
y
s
.
e
x
i
t
sys.exit
sys.exit的调用。(参数0表示正常退出,其它为异常)。例如👇:
import sys
if len(sys.argv) <= 1:
print("缺少参数")
sys.exit(1)
for arg in sys.argv:
print(arg)
如果是直接执行该文件,则执行结果如下:
#缺少参数
import sys
for path in sys.path:
print(path)
执行结果如下:
❗️:不同的环境下执行结果可能不一样。
由于 s y s . p a t h sys.path sys.path是列表类型的变量,所以我们可以像修改变量一样修改 s y s . p a t h sys.path sys.path变量来增加python解释器查找模块的路径。例如👇:
import sys
sys.path.append("c:\\")
for path in sys.path:
print(sys)
此时调用“import”来导入模块时,python解释器会去“c:\”目录中查找模块。
import sys
print(sys.modules.keys())
print(sys.modules.values())
print(sys.modules["os"])
输出如下:
后面还有很多…
python中的os模块封装了操作系统的文件和目录操作。下面介绍一些常见的方法。
import os
print(__file__)
#D:/pycharm/pythonProject1/test.py
print(os.path.dirname(__file__))
#D:/pycharm/pythonProject1
__file__是python的内置变量,os.path.dirname(__file__)表示的是文件当前所在文件夹的位置。
import os
print(os.getcwd())
#D:\pycharm\pythonProject1
os.chdir("c:\\")
print(os.getcwd())
#c:\
os.getcwd()可以获取当前执行程序的路径,os.chdir()可以切换当前的路径。
import os
os.rename("test.py","test1.py")
上面代码将我们原来名为“test.py”的文件改为“test1.py”。
import os
a = os.path.exists("D:\\pycharm\\pythonProject1\\test1.py")
print(a)
#True
存在返回 T r u e True True,否则返回 F a l s e False False。
import os
a = os.path.isfile("D:\\pycharm\\pythonProject1\\test.py")
print(a)
#False
这里因为我们前面更改了名字,所以返回 F a l s e False False。
import os
a = os.path.isdir("D:\\pycharm\\pythonProject1\\test.py")
print(a)
#False
b = os.path.isdir("D:\\pycharm\\pythonProject1")
print(b)
#True
import os
os.mkdir("d:\\test1111111")
位置就能找到我们创建的目录了。但是os.mkdir函数只能创建一层目录,在有父目录的情况下创建子目录,如果父目录不存在则不能创建并输出错误。
import os
os.makedirs("d:\\test2\\test3")
——————————————————————————————
这时我们点进test2就会发现里面还有一个目录test3。
下面简单介绍几个math库中的函数。
import math
print(math.pi)
#3.141592653589793
print(math.e)
#2.718281828459045
import math
print(math.pow(2,3))
#8.0
import math
print(math.log(math.e))
#1.0
print(math.log(100,10))
#2.0
该函数默认底数为e,可以实用第二个参数来改变对数的底数。
import math
print(math.sin(math.pi/2))
#1.0
print(math.cos(0))
#1.0
import random
print(random.random())
#0.9822369992491721
#0.5783076696174532
#...
import random
print(random.uniform(1,10))
#5.49485532264801
#9.106030260288195
#...
import random
print(random.randint(1,10))
#1
#5
#...
import random
a = ["hello",1,2,"你好"]
print(random.choice(a))
#hello
#2
#...
import random
a = list(range(1,10))
print(random.shuffle(a)) #注意,该函数没有返回值
#None
import random
a = [1,2,3,4]
random.shuffle((a))
print(a)
#[2,3,1,4]
❗️:这个函数会修改原来的序列,所以原来的序列必须是可修改的,因此元组等类型不能作为该函数的参数。