一:模块
1.模块和包:
(1)模块
模块是一个包含所有你定义的函数和变量的文件,其扩展名为 .py ,模块也就是 .py 文件;模块可以被其它的程序引入,以使用该模块中的函数等功能;这也是使用Python标准库的方法
导入模块的方式:
import 模块名
-- 导入这个模块的所有功能(函数;属性;类等全部导入)
from 模块名 import 功能名(类名;函数名等)
-- 从这个模块中精准导入某一功能(类;函数等)
from 模块名 import
import 模块名 as 别名
-- 别名为自己现取的名字(防止原文件名过长,在这个文件中临时用的名字)
from 模块名 import 功能名 as 别名
注意: 在导入模块的时候不用写后面的后缀 .py ,只写文件名就可以了;如果在这个模块中功能过多,用
import
精准导入功能名可以节省内存
#导入模块的语法格式
import 模块名
a = 模块名.类名/函数名等 #调用这个函数的某一功能
print(a)
#导入模块的语法格式
from 模块名 import 功能名(类名;函数名等)
a = 功能名
print(a)
#导入模块的语法格式
import 模块名 as bieming
a = bieming.类名/函数名等 #调用这个函数的某一功能
print(a)
b = bieming.类名/函数名等 #调用这个函数的某一功能
if __name__ == '__main__': 文件中的代码块(在初始化时不直接执行的代码)
作用:
if
判断,指定在导入文件的过程中控制去执行哪些内容(在要导入的文件内使用)- 当
__name__
的属性输出是__main__
时,说明这个代码是在当前的文件中执行的;当__name__
输出的是当前文件的文件名时,说明__name__
是在另一个文件中执行的- 被
if __name__ == '__main__':
包裹的代码块不被调用是不会初始化不自动执行的,只有被调用了才会执行__all__ = []
作用:在
__init__.py
文件中添加__all__ = []
,控制允许导入的模块,只适用于from 包名 import 模 块名
的方式
__all__
变量的作用:控制import *
和from 包名 import *
能够导入的内容
(2)包
基于Python模块,在编写代码的时候,会导入许多外部代码来丰富功能;但是,如果Python的模块太多,就可能造成一定的混乱。这时候,可以通过Python包的功能来管理,包相当于一个文件夹,在该文件夹下包含了一个 __init__.py
文件,通过这个文件表示一个文件夹是Python的包,而非普通的文件夹
导入包的方式:
import 包名.模块名
from 包名 import 模块名
import urllib
注意:
urllib
就是包,按住CTRL
用鼠标左键点击urllib
,就进入了__init__.py
初始化的文件中,urllib
包中有很多的文件,如:import urllib.request
,按住CTRL
用鼠标左键点击request
,就进入了request
文件。包相当于是一个文件夹,模块就是.py文件,一个包里面可以存放多个.py文件,也就是多个模块
#导入包里面模块的语法格式
import urllib #导入包中所有的模块,如果包中模块太多可能会导致运行缓慢
import urllib.request
from urllib import request
#导入包中模块的功能的语法格式1
import urllib.request
urllib.request.Request() #Request()是功能名
#导入包中模块的功能的语法格式2
import urllib.request as R #R是别名
R.Request() #Request()是功能名
#导入包中模块的功能的语法格式3
from urllib import request
Request()
#同时在一个包中导入多个模块
from urllib import request,parse #request和parse是模块名
import request,parse
注意: 导入模块用import
;导入包用from
:如果只是单纯的模块就用import
;如果模块存放在包里面就用from
#导入其它路径下的.py文件
import sys
sys.path.append("绝对路径")
2.常用内置模块:
(1)time
模块
time
模块常用的方法:
-
time.sleep(秒)
:延迟执行时间,休眠,让程序在这里暂停多长时间 -
time.time()
:打印当前时间戳,单位秒 -
time.localtime()
:打印本地时间以时间元组的形式输出 -
time.strftime()
:接收时间元组,并返回以可读字符串表示的当地时间,格式由参数format
决定
-
%Y
:完整的四位数年份 -
%y
:两位数的年份 -
%m
:两位数的月份 -
%d
:两位数的日期 -
%H
:24小时制的小时数 -
%I
:12小时制的小时数 -
%M
:分钟数 -
%S
:秒数(最大为60)
import time
print(time.time()) #输出时间戳,以秒为单位
print(time.localtime()) #输出时间元组
print(time.sleep(3)) #运行到这里时,延迟3秒后继续往下执行
print(time.strftime('%y年 %m月 %d日', time.localtime())) #以字符串的形式输出当前时间
(2)datetime
模块
也是与时间相关的模块
import datetime
print(datetime.datetime.now()) #直接输出当前时间(年-月-日 时-分-秒)
(3)random
模块:
-
random.random()
:不用给参数,随机生成(0,1)区间的数,包含0不包含1,生成的都是小数 -
random.randint()
:随机生成(x,y)区间的数,生成数包含x;y本身 -
random.choice()
:从指定的序列中随机取出一个元素 -
random.shuffle()
:打乱一个列表的顺序 -
random.sample()
:从指定的序列中随机提取不重复的元素
import random
print(random.randint(1, 100)) #随机生成1~100的随机数,包含1和100
print(random.random()) #随机生成0~1,不包含1,生成的是小数,不需要传参数,传的话会报错
print(random.choice([12, 4, 56, 17, 78, 31])) #从这个列表中随机取出一个元素
print(random.choice(range(100))) #随机取出0~99之间的一个数
print(random.sample([4,90,56,89,54,34],2)) #有两个必备参数,缺一不可:一个是序列;一个是要随机取出多少个数,用sample取出的数不会发生重复,是唯一的
p = [45,32,57,8,43,11,50]
random.shuffle(p) #打乱列表p本身的顺序
print(p)
(4)join
模块
json
是一个序列化的对象或数组,一种使用广泛的轻量数据格式,Python标准库中的json
模块提供了json
数据的处理功能,由于json
与Python中的字典格式非常像,所以Python中的json
模块也相当于是用来使json
与字典做转换
注意: 对象和数组并不是Python中的对象和数组,而是json
中的专有名词;json
中的对象对应的是Python中的字典;json
中的数组对应的是Python中的列表;序列化指的是更标准的格式,序列化的数据是可以在多个平台上使用的,如:Python中的数据是不能与JAVA;C++中的数据混用的,但json
中的数据可以;因为json
中的数据是经过序列化的,是更标准的格式,可以跨平台使用的一种格式
json
模块常用的方法:
-
json.loads()
:json
转换为字典(适用于语句) -
json.dumps()
:字典转换为json
(适用于语句) -
json.load()
:json
转换为字典(适用于文件) -
json.dump()
:字典转换为json
(适用于文件)
#针对语句的示例代码
import json
A = {
"age":18} #字典格式
B = '{"age":18}' #json格式;属于字符串类型
print(type(B))
#把json格式的B转换成字典,通过json进行语句转换
#不能使用str进行强制转换,因为字典可以转换成其它的序列,但是其它的序列不能直接转换成字典;字典与字典可以互转
a = json.loads(B)
print(a,type(a))
#把字典A转换为json格式(str类型),通过json进行语句转换
b = json.dumps(A)
print(b,type(b))
C = {
"name":"张四"}
print(json.dumps(C)) #此时因为字典中有中文,json格式会把中文变成ASCII编码
print(json.dumps(C,ensure_ascii=False)) #此时中文便被固定住了,不会进行ASCII编码转换
#针对文件的示例代码
name = {
"name":"张四"}
import json
with open('json.txt','w',encoding='utf-8') as i:
json.dump(name,i,ensure_ascii=False)
with open('json.txt','r',encoding='utf-8') as i:
a = json.load(i)
print(a)
注意: json
是一种通用格式,是跨编程语言的工具
二:异常处理
- 当检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的异常
- 异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行,当Python脚本发生异常时我们可以捕获并处理它,不然程序会终止执行;当对异常进行捕获之后,它就不会影响整体程序的执行。只要是报错,它就是一个异常
1.异常语法:
#语法1
try: #这一句在异常语法里是必须要有的
程序正常执行的代码
except: #捕获异常
抛出错误时执行此代码块
#语法2
try:
程序正常执行的代码
except Exception as a:
抛出错误时执行此代码块
else: #检验代码的正确性
程序没有抛出错误时执行此代码块
finally:
不管程序有无异常,都会执行的代码块
#示例代码
a = "w"
try:
b = int(a) #try里面的代码无论如何都会执行
except:
print("这句代码有错误") #except里面的代码是当try里面的代码出现异常时执行
else:
print("代码正确") #else里面的代码是当try里面的代码没有异常出现时执行
finally:
print("我就是路过") #try里面的代码无论是否出现异常都会执行
print("dudu")
#输入一个数字并加上10
try:
num = int(input("请输入数字:"))
except:
num = 1
print("输入有误,已经强制为num赋值为1")
print(num+10)
注意: else
和finally
是可以省略不写的
2.常见的异常类型
异常名称 | 描述 |
---|---|
AttributeError |
对象没有这个属性 |
OSError |
操作系统错误 |
ImportError |
导入模块/对象失败 |
IndexError |
序列中没有此索引(index ) |
KeyError |
没有这个键 |
NameError |
未声明/初始化对象(没有属性) |
SyntaxError |
Python语法错误 |
TypeError |
对类型无效的操作 |
ValueError |
传入无效的参数 |
Warning |
警告的基类 |
注意: Warning
是警告,警告一般都不会影响程序的执行
3.主动触发异常
在实际开发中,在程序不满足某条件时,通常会主动抛出异常,语法如下:
raise Exception()
注意: raise
关键字表示自动触发异常,就算代码没有错误,也让它报错
#判断烧饼熟了没,当烹饪时间小于5分钟,主动触发没熟异常
def cooking(minutes):
if minutes < 5:
raise Exception(f'{minutes}分钟没熟,不能吃') #手动的去触发异常
else:
print("熟了,放心吃")
cooking(6)