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会到所有可用的名字空间去查找变量,按照如下顺序:
- 局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。
- 全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python将使用这个变量然后停止搜索。
- 内置名字空间 - 对每个模块都是全局的。作为最后的尝试,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)