【Python】-7.Python中的模块


1. 模块

1.1 模块介绍

模块是一个包含了Python定义和声明的 “.py” 文件。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。

定义 fibs.py 模块

# fibs.py

def fib(n):
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a + b
    print()


def fib2(n):
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a + b
    return result

import 导入模块

import fibs

print(fibs)

# <module 'fibs' from 'E:\\Develop\\xxxx\\fibs.py'>

1.2 __name__变量

模块的名字可以通过全局变量 __name__ 获取

import fibs

print(fibs.__name__) # fibs
print(__name__) # __main__

1.3 dir函数

dir函数可以列出对象的模块标识符,标识符有 函数、类和对象

import fibs

print(dir(fibs))
# ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']

1.4 使用模块

1.4.1 调用模块方法

import fibs

fibs.fib(10) # 1 1 2 3 5 8 

1.4.2 导入部分模块

from fibs import fib, fib2

fib(10) # 1 1 2 3 5 8 
print(fib2(5)) # [1, 1, 2, 3]

2. 包

Python通过模块来组织代码,模块即一个python文件,是通过包来加以组织的,而包则是一个包含 __init__.py 的文件夹。代码、模块和包它们三者的关系是:包 包含模块且至少包含一个 __init__.py ,模块包含代码。

包的结构如下:

package test
|– __init__.py
|– fun1.py
|– fun2.py

# test/__init__.py
if __name__ == "__main__":
    print("作为主程序运行")
else:
    print("package 初始化")


# test/fun1.py
def print1():
    print("fun1")


# test/fun2.py
def print2():
    print("fun2")

2.1 使用包

from test.fun1 import print1
from test.fun2 import print2

print1()
print2()

# package 初始化
# fun1
# fun2

3. 标准库

Python官方提供了很多包和模块,称之为标准库

3.1 sys

3.1.1 识别操作系统

import sys

print(sys.platform) # win32

3.1.2 处理命令行参数

import sys

print(sys.argv) # ['E:/Develop/xxxx/3.标准库.py']

3.1.3 退出程序

import sys

if len(sys.argv) <= 1:
    print("缺少参数") # 缺少参数
    sys.exit()

3.1.4 获取模块搜索路径

import sys

for path in sys.path:
    print(path)

# E:\Develop\xxxx\Anaconda3\envs\xxxx\python38.zip
# E:\Develop\xxxx\Anaconda3\envs\xxxx\DLLs
# E:\Develop\xxxx\Anaconda3\envs\xxxx\lib
# E:\Develop\xxxx\Anaconda3\envs\xxxx\lib\site-packages
# ...

增加模块搜索路径

import sys

def print_path():
    for path in sys.path:
        print(path)


print("---修改前---")
print_path()
sys.path.append("C:\\")
print("---修改后---")
print_path()

# ---修改前---
# E:\Develop\xxxx\Anaconda3\envs\xxxx\python38.zip
# E:\Develop\xxxx\Anaconda3\envs\xxxx\DLLs
# E:\Develop\xxxx\Anaconda3\envs\xxxx\lib
# E:\Develop\xxxx\Anaconda3\envs\xxxx\lib\site-packages
# ...
# ---修改后---
# E:\Develop\xxxx\Anaconda3\envs\xxxx\python38.zip
# E:\Develop\xxxx\Anaconda3\envs\xxxx\DLLs
# E:\Develop\xxxx\Anaconda3\envs\xxxx\lib
# E:\Develop\xxxx\Anaconda3\envs\xxxx\lib\site-packages
# ...
# C:\

3.1.5 查找已导入的模块

import sys

print(sys.modules.keys())
print(sys.modules.values())
print(sys.modules["os"])

# 太多,略

3.2 os

3.2.1 获取当前文件所在目录

import os

print(__file__) # E:/Develop/xxxxxxxx/chapter07/3.标准库.py
print(os.path.dirname(__file__)) # E:/Develop/xxxxxxxx/chapter07

3.2.2 获取当前路径及切换路径

import os

print(os.getcwd()) # E:/Develop/xxxxxxxx/chapter07
os.chdir("C:\\") # 切换路径
print(os.getcwd()) # 获取当前文件路径

3.2.3 重命名文件

import os

os.rename("a.txt", "a.txt")

3.2.4 查看路径是否存在

import os

folder = os.path.exists("c:\Windows")
print(folder) # True

3.2.5 判断路径是否为文件

import os

isfile = os.path.isfile("c:\\windows\\System32")
print(isfile) # False

3.2.6 判断路径是否为目录

import os

isdir = os.path.isdir("c:\\windows\\System32")
print(isdir) # True

3.2.8 获取系统环境变量

import os

for k, v in os.environ.items():
    print(k, "=>", v)

# 太多,略

3.2.9 创建多层目录

import os

os.makedirs("e:\\p1\\python1\\python2\\python3")

3.3 math

3.3.1 math库中的两个常量

import math

print("圆周率:", math.pi) # 圆周率: 3.141592653589793
print("自然常量:", math.e) # 自然常量: 2.718281828459045

3.3.2 math库的运算函数

import math

print('--------------------------------------- 1 ---------------------------------------')
# 向上取整
print("1.7向上取整:", math.ceil(1.7)) # 1.7向上取整: 2
print("0.3向上取整:", math.ceil(0.3)) # 0.3向上取整: 1
print("-1.7向上取整:", math.ceil(-1.7)) # -1.7向上取整: -1
print("-0.3向上取整:", math.ceil(-0.3)) # -0.3向上取整: 0

# 向下取整
print('--------------------------------------- 2 ---------------------------------------')
print("1.7向下取整:", math.floor(1.7)) # 1.7向下取整: 1
print("0.3向下取整:", math.floor(0.3)) # 0.3向下取整: 0
print("-1.7向下取整:", math.floor(-1.7)) # -1.7向下取整: -2
print("-0.3向下取整:", math.floor(-0.3)) # -0.3向下取整: -1

# 指数运算
print('--------------------------------------- 3 ---------------------------------------')

print("15^3", math.pow(15, 3)) # 15^3 3375.0
print("29^-1", math.pow(29, -1)) # 29^-1 0.034482758620689655

# 对数计算
print('--------------------------------------- 4 ---------------------------------------')

print("log(3)", math.log(3)) # log(3) 1.0986122886681098
print("log(100, 10)", math.log(100, 10)) # log(100, 10) 2.0

# 平方根计算
print('--------------------------------------- 5 ---------------------------------------')

print("sqrt(4)", math.sqrt(4)) # sqrt(4) 2.0
print("sqrt(128)", math.sqrt(128)) # sqrt(128) 11.313708498984761

# 三角函数计算
print('--------------------------------------- 6 ---------------------------------------')

print("sin(pi/2)", math.sin(math.pi / 2)) # sin(pi/2) 1.0
print("cos(pi)", math.cos(math.pi)) # cos(pi) -1.0
print("tan(0)", math.tan(0)) # tan(0) 0.0

# 角度和弧度转换
print('--------------------------------------- 7 ---------------------------------------')

print(math.degrees(math.pi)) # 180.0
print(math.radians(90)) # 1.5707963267948966

3.4 random

random 包含了需要和随机数相关的方法

3.4.1 生成 0-1 之间的随机数

import random

print(random.random()) # 0.19076654911060498

3.4.2 生成指定范围内的随机浮点数

import random

print(random.uniform(1, 150)) # 100.27340910357168

3.4.3 生成指定范围内的随机整数

import random

print(random.randint(1, 150)) # 16

3.4.4 从序列中随机获取一个元素

import random

seq1 = (1, 15, 8, 97, 22)
seq2 = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

print(random.choice(seq1)) # 22
print(random.choice(seq2)) # 星期二

3.4.5 将列表中的元素打乱

import random

seq1 = list(range(1, 10))
seq2 = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

print("--------- 打乱前 ---------")
print(seq1)
print(seq2)

random.shuffle(seq1)
random.shuffle(seq2)

print("--------- 打乱后 ---------")
print(seq1)
print(seq2)

# --------- 打乱前 ---------
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
# ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
# --------- 打乱后 ---------
# [5, 8, 6, 1, 4, 3, 9, 2, 7]
# ['星期五', '星期二', '星期一', '星期六', '星期日', '星期三', '星期四']

4. 安装第三方库

4.1 使用pip管理包

4.1.1 查看版本

pip --version

4.1.2 搜索包

pip search 关键字

4.1.3 安装包

pip install 软件包名

4.1.4 安装指定版本的包

pip install 软件包名==版本号
eg: pip install django==2.0.6

4.1.5 卸载包

pip uninstall 软件包名
eg: pip uninstall django

4.1.6 根据 requirements.txt 导入包

pip install -r requirements.txt

4.1.7 列出已安装的包

pip list

4.2 使用Anaconda管理包

4.2.1 搜索包

conda search 关键字

4.2.2 安装包

conda install 软件包名

4.2.3 安装指定版本的包

conda install 软件包名==版本号
eg: conda install django==2.0.6

4.2.4 卸载包

conda uninstall 软件包名
eg: conda uninstall django

5. globals和locals函数

Python 内置了两个函数 globals 和 locals,提供了基于字典的访问 全局和局部变量的方式

首先,是关于名字空间的一个名词解释。Python使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个字典,它的键就是变量名,字典的值就是那些变量的值。实际上,名字空间可以象Python的字典一样进行访问,一会我们就会看到。

在一个Python程序中的任何一个地方,都存在几个可用的名字空间。

每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括 函数的参数和局部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。

当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

  1. 局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。
  2. 全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python将使用这个变量然后停止搜索。
    1. 内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python将假设 x 是内置函数或变量。

如果Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 的异常,同时传 递 There is no variable named ‘x’ 这样一条信息。

像 Python 中的许多事情一样,名字空间在运行时直接可以访问。特别地,局部名字空间可以通过内置的 locals 函数来访问。全局(模块级别)名字空间可以通过 globals 函数来访问

5.1 locals

5.1.1 返回内置本地变量

local_var = locals().copy()

for k, v in local_var.items():
    print(k, "=>", v)

5.1.2 返回内置本地变量+自定义本地变量、函数

a_string = "Hello"


def a_func():
    pass


class MyClass:
    pass


local_var = locals().copy()

for k, v in local_var.items():
    print(k, "=>", v)

5.2 globals

# 返回所有模块的变量、函数

from math import *

global_vars = globals().copy()

for k, v in global_vars.items():
    print(k, "=>", v)

文章作者: Soulballad
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Soulballad !
评论
 上一篇
【Python】-8.Python文件与IO 【Python】-8.Python文件与IO
1. 打开文件 在Python中无论是从文件中读取内容还是把内容写到文件,都需要先打开文件。打开文件使用内置函数 open open 函数有许多参数,它的定义如下: def open(file, mode=’r’, buffering=
2020-09-13
下一篇 
【Python】-6.Python中的错误和异常 【Python】-6.Python中的错误和异常
作为 Python 初学者,在学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。 Python 有两种错误很容易辨认:语法错误和异常。 1. 语法错误Python 的语法错误或者称之为解析错,一般
2020-09-10
  目录