Python--模块

一、介绍

在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)

importfrom...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.makedirsos.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 -y python3-pip

如果你使用的是CentOS系统,请确保已经安装python 34-pip软件包。如果不确定或者未安装,请运算:

sudo yum install -y python34-pip

一切准备就绪之后,就可以在终端输入:

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 -r requirements.txt

一次性向安装这些软件,方便又快速。


六、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()函数可以返回所有模块级别的变量、函数等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值