前言:本文为小编自主学习python的过程中的笔记和对应的练习应用 ,希望能帮助到大家,也希望大家能一起交流学习。
目录
一、异常
1.捕获异常(try/except语句)
try:
被检测的代码块
except 异常类型:
try中一但检测到异常,就会执行这个位置的逻辑
如:
try:
x = int(input('请输入被除数:'))
y = int(input('请输入除数: '))
print(x / y)
except ZeroDivisionError:
print("除数不能为0")
try:
x = int(input('请输入被除数:'))
y = int(input('请输入除数: '))
print(x / y)
except ZeroDivisionError:
print("除数不能为0")
except ValueError:
print("请输入数字")
try:
x = int(input('请输入被除数:'))
y = int(input('请输入除数: '))
print(x / y)
except (ZeroDivisionError, ValueError):
print("请正确输入数字")
还能用万能异常
except Exception as e: # 万能异常
print(e) # 报错详细信息
2.else和finally
# else 代码不出现异常的时候执行的 放在except后面,可以省略的
# finally 代码无论有没有异常都会进行输出 finally一定要放到最后,可以省略的
try:
print(name)
except Exception as e:
print(e)
else:
print("成功获取到了数据")
finally:
print("成功执行了")
在这个代码里,因为已经出现异常所以只会执行except和finally里的代码,如果在这串代码前补上变量name对应的值,那么就会执行else和finally里的代码
3.主动抛出异常 raise
raise[exceptionName[(reason)]]
1.创建一个Exception的对象
2.raise抛出这个异常对象
def funa(age):
if age<=0 or age>120:
raise ValueError("值错误")
print(123)
else:
print(f"您的年龄为{age}")
# 捕获异常
try:
funa(-18)
except ValueError as e:
print(e)
# raise 抛出错误,解释器不会主动捕获
# 这里注意到raise后面的语句是不会执行
二、模块
为了使代码更容易维护,提高代码重用价值,可以将一组相关功能的代码写入一个单独的py文件中供别人导入使用,这个.py文件就被称作是一个模块
1.模块分类
-
内置模块
也叫标准库。此类模块就是python解释器给你提供的。不需要额外去下载,直接import导入就可以了,大约有200多个。
-
第三方模块
第三方库。一些python大神写的非常好用的模块,必须通过pip install指令安装的模块。即需要下载然后再导入使用
-
自定义模块
我们自己在项目中定义的一些模块,本质就是新建一个py文件在其他的文件中导入使用
2.模块的导入方式
有下面几种导入方式:
import 模块名
import 模块名 as 别名
import 模块名1,模块名2
from 模块名 import 函数名 [as 别名]
from 模块名 import *
例如现自定义一个py文件,命名为demo.py 其内容如下:
a = 10
print(a)
def funa():
print("123")
funa()
然后我们在另一个新的py文件中运行一下代码
# import 模块名
import demo # 加载文件,自动执行demo模块的功能
# 还可以通过模块名.的方式去使用
print(demo.a) # 输出demo文件a属性
demo.funa() # 调用demo文件funa()函数
还可以对导入的模块进行改名字来方便自己运用
# import 模块名 as 别名
import demo as de
# 别名.的方式去调用
print(de.a)
de.funa()
下面再创建一个名为demo2.py的文件,内容如下
print('hello word')
然后我们使用方法3,就可以同时导入2个模块且自动执行了
# import 模块名1,模块名2
import demo,demo2
下面重新定义demo文件内容
a = 10
def funa():
print("123")
然后通过方法4导入里面的函数funa
# from 模块名 import 函数名 [as 别名]
from demo import funa # 从模块中导入某个函数
funa()
而as是导入函数后对函数取别名
# from 模块名 import 函数名 as 别名
from demo import funa as fa # 从模块中导入某个函数,同时取别名
fa()
# from 模块名 import * 从模块里面导入所有
from demo import *
funa()
print(a)
3.__all__变量
__all__ 变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置 __all__ 变量,当其它文件以“ from 模块名 import * ”的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的成员
a = 10
def funa():
print("123")
__all__ = ["a"] # 变量和函数名都需要用双引号包裹起来
# 当其他文件导入这个文件只允许a这个变量可以使用
ps:import导入某个模块的整个功能,from.....import....导入模块的某个功能
py文件的两种功能:
- 脚本,一个文件就是整个程序,用来被执行
- 模块,文件中存放着一堆功能,用来被导入使用
4. __name__变量(入口)
是python的内置变量。它是每个python模块必备的属性,它的值取决于你是如何执行这段代码的。
print(__name__)
但你运行这个代码时,如果打印出的是__main__,说明你运行的是当前文件。
如果你是在其他文件导入了这个模块,运行后将打印出导入的文件块名
- if __name__ == "__main__": 当其他文件导入这个文件的时候这个里面的代码不执行
print(__name__) # 如果打印出了__main__,就说明运行的是当前文件
print(123)
if __name__ == "__main__": # 当前文件运行的代码
print(456)
快捷方式:main 回车 就可以快速编写 if __name__ == "__main__":
三、包
包是一个有层次的文件目录结构,它定义了由n个模块和n个子包
具体表现形式:包含__init__.py文件的目录,这个目录下一定得有这个__init__.py文件和其他模块或子包
为什么要使用包?
随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性
在python工程里,当python检测到一个目录下存在__init__.py文件时,python就会把它当成一个模块(module)
注意:__init__.py可以是一个空文件
创建方法:右键-new-python package创建一个包,包里面包含一个__init__.py文件,默认会执行这个文件
如:创建了一个包,名为bao,在这个文件夹里面创建一个py文件,名为test,里面内容如下
print(123)
然后我们就可以在一个新的py文件中导入它了,方法为
import bao
如果test文件内容改为
a = 10
def funa():
print("hello")
那么可以导入包里的具体文件,并使用具体的内容
from bao import test
test.funa()
print(test.a)
也可以对那个文件进行取别名
import bao.test as test1
test1.funa()
print(test1.a)
还可以用如下方法,不过需要在__init__.py文件去设置__all__,否则会报错。__all__列表里写对应的py文件名
from bao import *
test.funa()
print(test.a)
库:可以理解为包的集合
库>包>模块
如有哪些地方写错,欢迎纠正