Python基础 之 模块
前置技术点:函数
模块概述
一个模块其实就是一个.py
文件,同时大部分模块命名规范都是小写的,如time
模块,os
模块,pygame
模块等
模块可分为三类:
-
内置模块:python官方收录的,不用下载的自带模块
-
第三方模块: python官方未收录的,要下载才能用的模块,如pygame, flask, django等
-
自定义模块:自已项目中写的 main.py
模块导入
1 什么时候要导入?
在我们自己的python程序中,要使用模块(也就是另一个.py
文件),是要先做导入操作的。
如:在 main.py 中要使用到 abc.py 中的函数,由于跨文件了,这时我们就要做导入操作。
2 如何导入?
方式一:
import
文件名称 (注意,只是文件名称,没有.py),在导入之后,就可以用这个 文件名称.方法()
import random # (注意,只是文件名称,没有.py)
print( random.randint(1,100) )
还可给导入的模块取别名
import
文件名称 as
别名, ,在导入之后,就可以用这个 别名.方法()
import random as r
print( r.randint(1,100) )
方式二:
from
模块名称 import
类/变量/方法 ,在导入之后,就可以直接使用这个 类/变量/方法
from random import randint
print( randint(1,100) )
from
模块名称 import
类/变量/方法 as
别名,就可以使用 别名来使用这个 类/变量/方法
from random import randint as ri
print( ri(1,100) )
3 练习案例
请在main.py
中导入main2, 之后使用main2.py
中的变量和函数。
main2.py
内的代码如下:
name = "张三丰"
def fun1():
print("我是main2中的fun1...")
def fun2():
print("我是main2中的fun2...")
def fun3():
print("我是main2中的fun3...")
main.py
的代码如下:
# 方式一:import xxx
import main2
print(main2.name)
main2.fun1()
main2.fun2()
main2.fun3()
# 方式二:from xxx import xxx
from main2 import *
print(name)
fun1()
fun2()
fun3()
4 __all__
和 __name__
关于__all__ = []
from 模块名 import *
# 从模块 导入所有
关于__all__ = [“类1”,“类2”]
from 模块名 import *
# 从模块导入所有,这个所有指的是__all__
中包含的
关于if __name__ = ‘__main__’: pass
在模块中,添加此属性,一般用来做测试代码,表示当前在独立运行此模块才调用
test.py
def fu1():
print("我是test这个模块的fun1 函数")
def fu2():
print("我是test这个模块的fun2 函数")
fu1();
if __name__ == '__main__':
fu2();
在独立运行test时,fun1函数、fun2函数会运行;
在其他模块中导入test时,fun1函数会运行,fun2函数不会直接运行;
5 关于包
当要分类管理不同的模块时,就可以用包来管理了,包“可以理解为”就是文件夹,当然做法上有点小区别
包有一个__init__.py
的文件(其实就是个空文件,只是为了让python知道,它到底是文件夹还是包)
一般,在一个大一点的项目中,会用模块和包来组织所有代码文件,包就有效的解决了,模块重名的问题
包1
模块1.py
模块2.py
__init__.py
包2
模块1.py
__init__.py
main.py
包下模块导入操作:
import 包1.模块2 # 导入模块
包1.模块2.gogogo() # 调用模块内函数
from 包1 import 模块2 # 导入模块
模块2.gogogo() # 调用模块内函数
内置模块
python官方收录的,不用下载, 导入后就可使用的自带模块
1 os模块
os.mkdir() & os.rename() & os.rmdir() & os.remove()
mkdir创建文件夹
rmdir删除文件夹
rename重命名文件/文件夹
remove删除文件
import os
# 创建nf1 nf2 nf3 nf4四个文件夹
os.mkdir("nf1")
os.mkdir("nf2")
os.mkdir("nf3")
os.mkdir("nf4")
# 删除nf3文件夹
os.rmdir("nf3")
# 重命名
os.rename("nf4","renamenf4")
print( os.getcwd() ); # 获取当前工作路径
print( os.path.exists("test.txt") );# 文件是否存在
os.system()
执行系统命令
import os
# notepad:记事本
# cmd:命令提示符
# calc:计算器
# mspaint:画图
# taskmgr:任务管理器
# msconfig:系统配置工具
# servicesmsc:服务管理工具
# regedit:注册表
# mstsc:运程管理
os.system("calc")
2 calendar模块
import calendar
# 生成日历
print(calendar.calendar(2023))
print(calendar.month(2022, 3))
3 time模块
import time
print( time.time()); # 返回从1970年1月1日0时0分0秒到现在经过的时间
print( time.localtime() ); # 获取本地时间,得到的是一个元组
print( time.localtime().tm_year ); # 年
print( time.localtime().tm_mon ); # 月
print( time.localtime().tm_mday ); # 日
print(time.strftime('%Y/%m/%d %H:%M:%S')) # 2023/02/28 22:11:25
4 练习案例
练习:设计一个函数,根据你的出生年份(参数),计算返回你的年龄
提示:用time模块来得到当前年份,再与你的出生年份做计算,返回结果
import time
# 函数定义
def getAge(myYear):
# 现在的年份
cy = time.localtime().tm_year
# 现在的年份 - 出生年份
age = cy - myYear
# 返回结果
return age;
# 函数调用
age = getAge(1998)
print( age )
5 math模块
数学模块
from math import *
print(pi) # 圆周率
print(e) # 自然常数
print(ceil(85.123)) # 向上取整
print(ceil(85.987))
print(floor(75.352)) # 向下取整
print(floor(75.959))
print(pow(7,3)) # 7的3次方
print(sqrt(2)) # 开平方根
print(sin(45)) # 正弦
print(cos(45)) # 余弦
print(tan(45)) # 正切
print(fabs(-1423.324)) # 绝对值
print(radians(50)) # 求弧度
print(fsum(range(1,101))) # 求和
print(log(16384,2)) # 以2为底的16384的对数
print(log2(65536)) # 以2为底的65536的对数
print(log10(100000000000)) # 以10为底的100000000000的对数
print(factorial(15)) # 阶乘:15!
6 练习案例
练习: 设计一个函数,计算两点间的距离,完成测试调用
两点的坐标是(x1,y1)和(x2,y2),则两点之间的距离公式为 d = 根号[(x1-x2)2+(y1-y2)2]。
print( math.pow(4,2) ) # 4的2次方 16
print( math.sqrt(9) ) # 9的平方根 3
参考代码如下:
import math
# 分别用x1,y1,x2,y2表示两点
x1 = 5;
y1 = 15;
x2 = 5;
y2 = 3;
# x1-x2的平方
a = math.pow(x1 - x2, 2);
# y1-y2的平方
b = math.pow(y1 - y2, 2);
# 平方根
d = math.sqrt(a+b);
# 输出结果
print(d)
7 random模块
import random
print( random.random()) #大于0小于1之间的小数
print( random.randint(80,100) ); # 获取一个随机整数,范围80-100
print( random.choice(['一等奖','二等奖','三等奖','欢迎再来'])) # 随机抽取一个样本
8 扩展练习案例
随机生成四位验证码
提示代码1: 关于随机数字
import random
random.randint(65, 65+25) # 生成出来的是数字
random.choice(["A","a","6"])# 随机选择一个
提示代码2: 关于Unicode编码
ord() # 返回字符对应的Unicode编码(如:A是65, a是97)
chr() # 与ord()相反
# A --> 65 a -->97 0 --> 48
步骤1 随机生成大写 or 小写 or 数字:
import random
t1 = random.randint(65, 65+25) # 65 - 90之间的随机数 (65 -->A , 90 -->Z)
t2 = random.randint(97, 97+25)
t3 = random.randint(48, 48+8)
t1 = chr(t1);
t2 = chr(t2);
t3 = chr(t3);
print(t1)
print(t2)
print(t3)
步骤2 随机生成一位验证码(大写 or 小写 or 数字,三选一), 执行四次生成四个
import random
for i in range(4):
t1 = chr(random.randint(65, 65+25));
t2 = chr(random.randint(97, 97+25));
t3 = chr(random.randint(48, 48+8));
# 从大写字母,小写字母,数字中随机三选一
t = random.choice([t1,t2,t3]);
print(t) # 现在仅仅是打印出来的
步骤3 将四个验证码数据连接成一个完整字符串
import random
code = '' # 定义一个用来保存完整验证码的字符串
for i in range(4):
t1 = chr(random.randint(65, 65+25));
t2 = chr(random.randint(97, 97+25));
t3 = chr(random.randint(48, 48+8));
# 从大写字母,小写字母,数字中随机三选一
t = random.choice([t1,t2,t3]);
# 验证码(字符串)连接
code = code+t;
print(f"验证码:{code}");
步骤4 重构代码, 整理为一个生成四位验证码的函数
以下代码在重构过程中, 将变量名称也标准化了, 不再是使用的t1,t2,t3,t这种随意的变量名称
import random
# 生成验证码:
# 1 每一位都可以是大写字母 小写字母 数字
# 2 要求共4位
def get_code():
# 用来保存生成的验证码
code = "";
for i in range(4):
r1 = chr(random.random(48, 48+8));
r2 = chr(random.random(97, 97+25));
r3 = chr(random.random(65, 65+25));
rand = random.choice( [r1,r2,r3] );
code = code+rand;
# 将此验证码返回
return code;
# 生成验证码,函数调用
result = get_code()
print( result )
9 turtle模块
turtle(海龟)是python中比较好玩一个模块,它有一个专有名称“海龟作图”,它可以通过某些语句来控制一个点在白板上的运动轨迹,它在白板上走过的地方会留下痕迹,就像一支笔在纸上写字画画一样,属于入门级的图形绘制函数库;
此模块被python官方收录了,可直接导入使用,无需安装,所以也可以认为是一个内置模块了
import turtle # 导入模块
turtle的使用主要分为以下三个方面:创建窗口,设置画笔,绘制图形
设置窗口
使用setup()函数创建图形窗口。
turtle.setup(width, height, startx=None, starty=None)
# width: 窗口宽度
# height: 窗口高度
# startx:窗口在计算机屏幕上的横坐标(当取值为None时,窗口位于屏幕中心)
# starty:窗口在计算机屏幕上的纵坐标(当取值为None时,窗口位于屏幕中心)
t.done() # 保持程序不关
turtle的空间坐标体系:
设置画笔
import turtle # 导入模块
turtle.penup() #表示抬起画笔;可以简写成turtle.pu()
turtle.pendown() #表示画笔落下;可以简写成turtle.pd()
绘制图形
在画笔状态为DOWN时,通过移动画笔可以在画布上绘制图形,可以将画笔想象成一只海龟(这也是turtle模块名字的由来):海龟落在画布上,它可以向前、向后、向左、向右移动,海龟爬动时在画布上留下痕迹,路径即为所绘图形。
(1)移动控制函数
turtle.forward(distance) # 向前移动 , 参数distance用于指定画笔移动的距离,单位为像素
turtle.backward(distance) # 向后移动
turtle.goto(x,y=None) # 移动到指定位置
(2)角度控制函数
turtle.right(degree) # 向右转动, 参数degree用于指定画笔向右与向左的角度
turtle.left(degree) # 向左转动
turtle.seth(angle) # 转动到某个方向, 参数angle用于设置画笔在坐标系中的角度
(3)绘制函数
turtle.circle(radius, extent=None, steps=None)
# 参数radius用于设置半径;
# 参数extent用于设置弧的角度。
# 当radius为正时,画笔以原点为起点向上绘制弧线;radius为负时,画笔以原点为起点向下绘制弧线。
# 当extent为正时,画笔以原点为起点向右绘制弧线;extent为负时,画笔以原点为起点向左绘制弧线。
t.pencolor("green"); # 设置颜色
t.pensize(16); # 设置粗细
(4)图形填充
turtle.begin_fill() # 开始填充
turtle.end_fill() # 结束填充
练习案例:turtle绘制三角形
三角形内角和 360 (360/3 => 120)
前进+转向即可完成
for i in range(3):
turtle.forward(200) # 前进
turtle.left(360/3) # 左转120度
练习案例:绘制多边形
练习案例: 绘制一个时针表盘效果
扩展案例:要求利用turtle和time绘制下图所示的钟表,并使钟表的日期、周日期、时间跟随本地时间实时变化。
10 logging模块
Python logging 模块定义了为应用程序和库实现灵活的事件日志记录的函数和类。
程序开发过程中,很多程序都有记录日志的需求,并且日志包含的信息有正常的程序访问日志还可能有错误、警告等信息输出,Python 的 logging 模块提供了标准的日志接口,可以通过它存储各种格式的日志,日志记录提供了一组便利功能,用于简单的日志记录用法。
日志分级别,标准级别及其适用性(从高到低的顺序):
日志级别等级排序:critical > error > warning > info > debug
级别越高打印的日志越少,反之亦然,即
- debug : 打印全部的日志( notset 等同于 debug )
- info : 打印 info, warning, error, critical 级别的日志
- warning : 打印 warning, error, critical 级别的日志
- error : 打印 error, critical 级别的日志
- critical : 打印 critical 级别
# 简单打印日志:
import logging
# 打印日志级别
def test_logging():
logging.debug('Python debug')
logging.info('Python info')
logging.warning('Python warning')
logging.error('Python Error')
logging.critical('Python critical')
test_logging()
输出如下:
WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical
设置日志级别
通过 logging.basicConfig()
可以设置 root 的日志级别,和日志输出格式。
注意:Logging.basicConfig() 需要在开头就设置,在中间设置并无作用。
import logging
# 打印日志级别
def test():
logging.basicConfig(level=logging.DEBUG)
logging.debug('Python debug')
logging.info('Python info')
logging.warning('Python warning')
logging.error('Python Error')
logging.critical('Python critical')
test()
输出如下:
DEBUG:root:Python debug
INFO:root:Python info
WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical
日志信息记录
# 日志信息记录到文件
logging.basicConfig(filename='D:/example.log', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
在相应的路径下会有 example.log 日志文件。
日志信息格式
import logging
# 打印日志级别
def test_logging():
# 设置日志级别
# logging.basicConfig(level=logging.DEBUG)
# 日志信息记录到文件,同时设置日志级别
# logging.basicConfig(filename='D:/example.log', level=logging.DEBUG)
# 日志信息记录到文件,同时设置日志级别, 消息时间
logging.basicConfig(filename='D:/example.log', level=logging.DEBUG,format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.debug('Python debug')
logging.info('Python info')
logging.warning('Python warning')
logging.error('Python Error')
logging.critical('Python critical')
test_logging()
第三方模块
python官方未收录的,要先下载到, 导入后就可使用的第三方模块
模块下载
pip install 模块名称
pip install 模块名称 -i https://pypi.tuna.tsinghua.edu.cn/simple/
几个常用国内镜像源:
下载后的第三方模块所在位置:
...\Python\Lib\site-packages
常用第三方库
二维码:pyqrcode
pyqrcode
是一款 老牌 二维码生成模块了,安装之后三行代码就能搞定一个简单的二维码图片。
安装
pip install pyqrcode
pip install pypng
代码如下:
import pyqrcode
import png
inpStr = "http://www.baidu.com"
qrc = pyqrcode.create(inpStr)
qrc.png("baidu.png", scale=6)
二维码:qrcode
安装
pip install qrcode
代码如下:
import qrcode
qr = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_L,
border=4,
box_size=10
)
img = qrcode.make('http://www.baidu.com',version=4,border=4,box_size=12)
img.save('bd.jpg') # 保存图片
qrcode
模块中最重要的方法是 qrcode.QRCode()
函数,其参数简单说明如下:
version
:二维码大小,1-40 不等;error_correction
:二维码纠错范围,4 个常量值在下文说明;box_size
:二维码中每个小格子包含的像素数;border
:边框,二维码与图片边界的距离。
其中,二维码纠错范围,可以选择 4 个常量:
- ERROR_CORRECT_L: 7%以下的错误会被纠正;
- ERROR_CORRECT_M (默认值): 15%以下的错误会被纠正;
- ERROR_CORRECT_Q:25%以下的错误会被纠正;
- ERROR_CORRECT_H:30%以下的错误会被纠正。
游戏:pygame
略~