模块
模块实际上就是 类似于 代码库的,模块中包含了一组函数文件,我们希望这个文件里面的函数代码能够被使用(引用)
创建模块
我们如果需要创建模块,就只需要把这个函数代码写进一个 文件名后缀为 (.py )的文件中,这个时候这个文件就是一个模块了,我们后序要引用这个模块就只需要 引用这个文件就行了。
这个时候我们在 MyModule.py 中保存 我们模块代码:
def MyFunc1(name):
print('you name is '+ name)
然后这个时候如果我们要在我们的程序执行文件里面执行我们的这个模块时候,就用 import +文件名:
import MyModule
MyModule.MyFunc1('zhangsan')
然后如果我们使用我们这个模块里面的文件模块的时候就可以在我这 文件名.函数名的方式来使用这个函数。这个就是类似于我们之前使用 对象里的方法一样。
调用模块里面的函数的方法 :
module_name.function_name
输出:
you name is zhangsan
这个时候我们在 MyModule 文件里面写的 函数逻辑就被执行了。但是我们的 import 一定是在我们使用这个模块里代码之前就要引用这个模块。
模块里面的变量
模块里面不仅仅可以是函数,也可以是 变量(例如列表,元祖,字典,对象):
在文件 mymodule.py
中保存代码:
list = {'name':'zhangsan',
'age':18,
}
这个时候我们可以在,我们程序执行代码中,访问这个模块里面的字典变量:
import MyModule
a = MyModule.list['name']
print(a)
输出:
zhangsan
当我们嫌弃这个文件名太长之后,我们可以使用 as 来在这个程序文件里面对这个模块的文件名进行暂时的修改:
import MyModule as mo
a = mo.list['name']
print(a) #这个时候我们还是输出 zhangsan
只要我们在用这个模块里面的代码之前就引用了这个模块,无论这模块在哪里引用都是没有问题的,但是我们一般还是在代码的开头进行引用。
dir() 函数
当我们不知道这个模块里面有多少的函数和变量的时候,就可以使用dir() 函数来把这个模块里的函数和变量名给列出来:
比如现在我们在文件里,里面写的就是这个代码内容:
def MyFunc1(name):
print('you name is '+ name)
list = {'name':'zhangsan',
'age':18,
}
def Myfunc2():
print('hello world')
我们这个时候就使用 print() 函数来帮我们打印这个模块里面的内容:
import MyModule as mo
print(dir(mo))
输出:
['MyFunc1', 'Myfunc2', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'list']
当然这个 dir 函数 可以作用于所有的模块,不仅仅是你自己的模块,也可以是 第三方模块和 python内建的模块。
从模块导入
当然,如果你不想使用这个模块里面的全部内容,你也可以选择性的调用这个模块里的一个人内容:
from MyModule import list
a = list['age']
print(a) #18
这个引用的代码,意思就是,我们 MyModule 模块中只调用 list 这个内容,这个时候我们在使用这个list这个变量的时候(或者是函数),就可以不需要在前面 使用这个 模块名称了。
但是我们在使用 from 之后,是不可以使用 模块名.变量/函数名 的方式来使用这个内容,如果这样写,编译器就会报错:
from MyModule import list
a = MyModule.list['age']
print(a) #18
所以我们在使用 from 之后就直接使用这个模块里面的 变量/函数名就行了,不能在起前面用模块名。
日期模块
python中的这个日期不是类型,而是我们导入的一个模块,我们在python中导入一个 datetime 的模块,然后就可以使用日期对象进行关于日期的操作了。
例:我们导入这个 datetime 模块 打印当前的日期:
import datetime
a = datetime.datetime.now()
print(a)
输出:
2022-11-22 08:42:04.862197
我们发现这个输出的结果是从年开始然后是月、日、小时、分钟、秒一直到微秒的。
我们上处用 a = datetime.datetime.now() 这个方法取得的 a 是一个日期对象,这个对象里面包含了很多的内容:
import datetime
a = datetime.datetime.now()
print(a.year) #2022
print(a.strftime("%A")) #Tuesday
接下来我们来具体说说这个datetime 模块创建日期的方式:
首先是 datetime ()这个类来实现,这个类中的参数列表是:(年,月,日,时,分,秒)我们可以直接传入对应的参数进行日期的创建,这个参数的默认值是0:
import datetime
a = datetime.datetime(2022,8,29,16,20,30)
print(a) #2022-08-29 16:20:30
除了 上述的日期时间的混合 创建,这个 datetime 的参数列表中还可以是 时区,即:(小时、分钟、秒、微秒、tzone),这个参数是可选的,而且默认值也是0
sriftime 方法:
这个方法可以把日期对象格式化为字符串的形式,而这个方法使用一个 format参数来进行字符串格式化的选定:
import datetime
a = datetime.datetime(2022,8,30)
print(a.strftime("%B")) #August
我们发现此时就按照 这个日期的 月份输出了这个字符串。
%a | Weekday,短版本 | Wed | |
%A | Weekday,完整版本 | Wednesday | |
%w | Weekday,数字 0-6,0 为周日 | 3 | |
%d | 日,数字 01-31 | 31 | |
%b | 月名称,短版本 | Dec | |
%B | 月名称,完整版本 | December | |
%m | 月,数字01-12 | 12 | |
%y | 年,短版本,无世纪 | 18 | |
%Y | 年,完整版本 | 2018 | |
%H | 小时,00-23 | 17 | |
%I | 小时,00-12 | 05 | |
%p | AM/PM | PM | |
%M | 分,00-59 | 41 | |
%S | 秒,00-59 | 08 | |
%f | 微妙,000000-999999 | 548513 | |
%z | UTC 偏移 | +0100 | |
%Z | 时区 | CST | |
%j | 天数,001-366 | 365 | |
%U | 周数,每周的第一天是周日,00-53 | 52 | |
%W | 周数,每周的第一天是周一,00-53 | 52 | |
%c | 日期和时间的本地版本 | Mon Dec 31 17:41:00 2018 | |
%x | 日期的本地版本 | 12/31/18 | |
%X | 时间的本地版本 | 17:41:00 | |
%% | A % character | % |
Python JSON
JSON 是python用于储存和交换数据的语法规则。这个 JSON 用的是 JavaScript 对象表示法(JavaScript object notation)编写的文本。
在python中有一个内置模块 json ,这个模块可以处理 JSON 数据
字符串格式化
我们除了在print()函数中可以对字符串进行,我们想要的格式打印出来,我们还可以使用format()方法来格式化字符串:
tmp = 'lisi'
txt = "my name is {}"
print(txt.format(tmp)) #my name is lisi
这个时候我们 txt 字符串里面的 { } 里面内容就可以被修改为 我们 tmp 的内容,当然这个tmp 的值只需要是字符串规定的值,都可以写入。
但是需要注意的是,这个 format 方法需要搭配 print()函数来使用,但是使用是没有效果的:
tmp = 'lisi'
txt = "my name is {}"
txt.format(tmp)
print(txt) #my name is {}
我们发现此时的 { } 内的值并没有被修改!
format 方法如果传入的参数是 数字的类型的话,我们在 字符串中的 { } 中可以写入我们想要的这个数字所输出的 数字格式:
tmp = 56
txt = "the num = {:.2f}" #以两位小数的形式输出
print(txt.format(tmp)) #the num = 56.00
{:b} | 将数字用二进制表示 |
{:c} | 将整数转换为对应的Unicode字符串 |
{:d} | 将数字用十进制整数表示(format中相应内容应是整数) |
{: o} | 将数字用八进制表示 |
{:x} | 将数字用十六进制表示 |
{:f} | 将数字用浮点数表示 |
{:e} | 将数字用科学计数法表示 |
{:%} | 将数字用百分数表示 |
{:,} | 用逗号分隔数字 |
{:.3f} | 保留三位小数 |
{:.2%} | 将数字用百分数表示,且小数点后保留两位小数 |
这个format也是可以进行多个赋值的,这个赋值的规则就是,按照 format 方法传入参数的顺序,和 字符串中 { } 的顺序一个参数对应一个 { } 来进行赋值:
tmp = 'lisi'
tmp1 = 'zhangsan'
tmp2 = 'wangwu'
txt = "my name is {} ; you name is {} ; he name is {}"
print(txt.format(tmp,tmp1,tmp2)) #my name is lisi ; you name is zhangsan ; he name is wangwu
如果你觉得这样不太好操作,你还可以使用索引的方式来对这个字符串 {} 里面的内容进行赋值,类似:{0} 这样的操作,把需要赋值的地方,把需要的值的参数的位置下标写在 {} 中,其中参数下表位置从第一个开始使用 下标0开始依次加1的,和列表一样:
name = 'zhangsan'
age = 18
txt = "my name is {1} ; i am {0} ; my name is {1}" #以两位小数的形式输出
print(txt.format(age,name)) #my name is zhangsan ; i am 18 ; my name is zhangsan
这样就不是 参数跟 {} 一一对应了,可以使用所以来对不同位置的 {} 和不同个数的 {} 进行赋值操作。
而且你还可以使用 像之前的关键字赋值一样,使用传入format 中传入参数的名字(新命名)来进行关键字赋值,但是在 format () 传入参数的时候,必须给这个参数命一个名,然后使用这个新命的名来进行字符串里面的赋值操作:
name = 'zhangsan'
age = 18
txt = "my name is {name} ; i am {age} ; my name is {name}" #以两位小数的形式输出
print(txt.format(age = age,name = name))
#my name is zhangsan ; i am 18 ; my name is zhangsan
这个时候输出结果和之前是一样 的。
Python Try Except
当我们在写完代码运行的时候,发现程序出现了问题,在python中,官方给了我们一些解决问题的方法。
try:可以让你运行一部分的代码块,方便你检查这个代码块有没有问题,当我们的这个try所包含的代码块出现了问题,也就是程序应该报错的时候,我们如果在下面使用 except 这个关键字,
except 这个关键字也可以包含一个代码块,这个代码块里应该写:当我们try包含的代码块出现的问题,我们就是用except 包含的代码块里的代码。
try:
print(x)
except:
print('An exception occurred') #An exception occurred
输出:
#An exception occurred
此时我输入的 x 没有定义,那么此时如果没有 try 语句,那么程序应该报错,但是此时我们写了 try语句,那么此时程序不会报错,会执行 except 中的代码。
print(x)
如果我们不写 try 判断这个 print(x)那么就会报上面这个错。
当然我们 判断多个异常,我们也可以使用 多个 except 代码块,我们只需要在 except 后加上报错原因就可以 针对这个报错,来进行针对这个报错的 错误处理:
try:
print(x)
except NameError:
print("Variable x is not defined") #Variable x is not defined
except:
print("Something else went wrong")
当然如果没有发生报错,我们可以继续执行代码,我们可以直接在 try 下一行来进行继续写,我们也可以使用 else 语句来继续执行代码,如果这个try 里面的代码块没有报错,那么就执行 else里面的代码块。
try:
print('hello')
except NameError:
print("Variable x is not defined")
else:
print("nothing Error") #nothing Error
在使用了try 模块之后, 如果我们使用 finally 语句,那么不管这个 try 中的代码块有没有报错, 都会执行 finally 里面的内容。
这个 finally 非常的好用,因为我们在使用完文件之后我们都要关闭这个文件,那么不管这个 try 代码里面的 关于文件的操作没有 异常,我们都会执行 finally里面关闭文件的操作。
try:
f = open('xxxxxx.txt','r',encoding='UTF8')
except NameError:
print("Variable x is not defined")
else:
f.close()
而且这样做有一个好处,当我们打开这个文件出现错误的时候,我们的程序可以继续,但是不会打开文件对象。
我们在写python程序的时候,经常会写出 程序抛出异常的异常,那么如果可能会出现程序的抛出异常的话,就要使用 raise 关键字;
raise的格式:
raise [exceptionName [(reason)]]
raise 的使用方法有三种:
- raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
- raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
- raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
x = -1
if x < 0:
raise Exception("Sorry, no numbers below zero")
输出:
Traceback (most recent call last):
File "D:\python环境\pycharm代码\bite.py", line 4, in <module>
raise Exception("Sorry, no numbers below zero")
Exception: Sorry, no numbers below zero
例二:
x = "hello"
if not type(x) is int:
raise TypeError("Only integers are allowed")
输出:
Traceback (most recent call last):
File "D:\python环境\pycharm代码\bite.py", line 4, in <module>
raise TypeError("Only integers are allowed")
TypeError: Only integers are allowed