一、异常处理
1、什么是异常、异常处理?
(1)异常是指程序在运行过程中发生的错误事件,影响程序的正常执行。异常并不是一定会发生,默认情况下,程序运 行中遇到异常时将会终止,并在控制台打印出异常出现的堆栈信息。
(2)异常处理是指程序设计时为了避免因异常而导致程序终止而做的一些额外操作。异常处理可以使得异常出现后,程 序依然可以执行
eg:
(1)未定义变量
print(a)#未定义变量
输出:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_10216\1189138062.py in <module>
----> 1 print(a)
NameError: name 'a' is not defined
(2)数据类型错误
a=input('请输入一个整数:')
12/a #数据类型错误
输出:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_10216\2557177083.py in <module>
1 a=input('请输入一个整数:')
----> 2 12/a
TypeError: unsupported operand type(s) for /: 'int' and 'str'
(3)语法错误
print('ok' #语法错误
输出:
File "C:\Users\Administrator\AppData\Local\Temp\ipykernel_10216\2956810423.py", line 1
print('ok' #语法错误
^
SyntaxError: unexpected EOF while parsing
2、如何处理异常
(1)Python中通常将可能发生异常的代码放在try语句中
如果发生异常则通过except语句来捕获异常并对做一些额外处理
如果没有发生异常则执行后面的else语句
最后执行finally语句做一些收尾操作。
(2)Python中还提供raise语句允许用户主动抛出异常,raise关键字后面需要提供一个异常实例或者异常类,如果传递的是异常类,则会调用无参数的构造方法来实例化对象。如果捕获到异常,但是暂时不处理,可以直接通过raise语句抛出异常,此时raise关键字后面什么都不用写。
eg:
(1)
a=int(input('请输入一个整数:'))
try:
b=12/a
except:
if a==0:
print('ZeroDivisionError:除数不能为0!')
else:
pass
finally:
print('b=',b)
输出:
请输入一个整数:0
ZeroDivisionError:除数不能为0!
b= 6.0
(2)
def check_str(content):
if (len(content)<6 or len(content)>12):
raise ValueError('长度应在6-12位之间,当前长度为:'+str(content))
else:
print('长度符合要求!')
ss=input('请输入一个长度在6到12位之间的密码字符串:')
check_str(ss)
输出:
请输入一个长度在6到12位之间的密码字符串:2423543sdt
长度符合要求!
二、 函数
1、参数类型
可变长度参数是指函数定义时,无法确定参数的个数。例如系统中的 print 函数,不知道用户需要打印多少个对象,此时将需要打印的内容定义为可变长度参数,根据调用者传递的实际参数来确定参数的长度。 Python 中可变长度参数有两种形式:*参数名和**参数名。
(1)*参数名:表示该参数是一个元组类型,可接受多个实参,并将传递的实参依次存放到元组中,主要针对以位置传值的实参;
(2)**参数名:表示该参数是一个字典类型,可接受多个实参,并将传递的键值对放到集合中,主要针对以关键字传值的实参。
eg:
(1)
def fun_1(a,*b):
print('a=',a)
print('b=',b)
fun_1(10,10,20,6,21)
输出:
a= 10
b= (10, 20, 6, 21)
(2)
def fun_2(a,**b):
print('a=',a)
print('b=',b)
fun_2(10,e=10,f=20,c=30,d=40)
输出:
a= 10
b= {'e': 10, 'f': 20, 'c': 30, 'd': 40}
三、变量作用域
根据变量定义的位置,可将变量分为全局变量和局部变量。
(1)全局变量:定义在函数外面的变量,可以在多个函数中进行访问,但不能执行赋值操作。如果有赋值语句,相当于创建了一个同名的局部变量;
(2)局部变量:定义在函数内部的变量,只能在它被定义的函数中使用。在函数外面无法直接访问。
(3)注意:当局部变量和全局变量同名时,在函数内部使用变量时,通常都是指局部变量,如果确实需要对全局变量进行修改,需要使用 global 关键字对变量进行声明,此时操作的就是全局变量了。
四、特殊函数:
匿名函数1ambda表达式:没有函数名字的临时使用的函数,可以将 lambda 表达式看成是函数的简写形式。
(1)1ambda表达式的语法:
lambda 参数列表:表达式
(2)与函数区别:关键字不同: def 、 lambdaj 没有名称;参数列表不需要一对圆括号,只包含一个表达式,不能包含多条语句。
(3) lambda 表达式的主体是一个表达式,而不是一个代码块,在表达式中可以调用其它函数,并支持默认值参数和关键字参数,表达式的结果相当于函数的返回值。
五、数据结构
1、元组:是不可变序列,不可修改里面的元素。元组中元素放在一对圆括号"()"中,并用逗号分隔,元素类型可以不同。注意:当元组中只包含一个元素时,元素后面的逗号不能省略,否则系统会将其看做是其他数据类型。
2、列表:是有序可变序列,列表的所有元素放在一对中括号"[]"中,并使用逗号隔开,元素的类型可以不同。
3、字符串:由字符组成的一个不可变序列,和元组作用类似,也支持索引、切片、重复、合并等操作。
4、字典:无序的映射类型,由若干"键( key ):值( value )"组成,"键"和"值"之间用冒号隔开,所有"键值对"放在一对大括号"{}"内,并用逗号分隔。其中"键"必须为不可变类型,在同一个字典中,"键"必须是唯一的,但"值"可以重复。
5、集合:是无序可变不重复的,不支持索引、切片等操作。元素放在一对大括号"0"中,并用逗号分隔,元素类型可以不同,但集合中元素不能重复。集合中不能包含可变元素,例如列表。注意:不能直接通过 a ={)创建空集合,此时创建的是一个空字典。可通过循环遍历集合中的所有元素。