第二课:更多函数和功能
(一)内置函数
1. 排序函数
list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
list3 = sorted(list1, key=len,reverse=False)
print(list3)
list1.sort(key=len,reverse=False)
print(list1)
# 两者等效,要注意一个是sort一个是sorted
(二)自定义函数
1. 函数的参数默认值
def test(a=1,b=2):
return a+b
result = test() # 使用默认值,a=1, b=2
print(result) # 输出结果为3,因为1 + 2 = 3
result = test(5, 10) # 提供参数值,a=5, b=10
print(result) # 输出结果为15,因为5 + 10 = 15
2. 不定参数
在参数名前面的*表示args是一个可变参数
def add(*args):
total = 0
for val in args:
total += val
return total
# 在调用add函数时可以传入0个或多个参数
print(add())
print(add(1))
print(add(1, 2))
# print(add([2,5,1]))报错
案例一:判断是不是回文联
huiwen=input("请输入要测试的值:")
def test(h):
lengh=len(h)
flag=True
for i in range(0,lengh//2):#注意在range内只能是整数不然会报错,所以不能用(lengh-1)/2
if h[i]!=h[lengh-1-i]:
flag=False
return flag
if test(huiwen):
print("是回文联")
else:
print("不是回文联")
案例二:用生成器写斐波那契数列的前n个
def fib(n): #这里fib 函数是一个生成器(generator)它允许你逐个地产生一系列值,而不是一次性地返回它们
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
yield a
def main():
for val in fib(20):
print(val)
if __name__ == '__main__':
main()
(三)异常处理
1. 异常抛出
指的是在程序执行过程中,当检测到一个错误或异常条件时,主动中断正常的控制流程,并生成一个异常对象。其实就是主动定义一个情况为异常
def divide(a, b):
if b == 2:
raise ValueError('除数不能为2') #括号里是报错信息
return a / b
# result=divide(10,2) #报错ValueError
try:
result = divide(10, 2)
except ValueError as e: #这里的异常形式必须要与raise出的异常一样。e保存报错信息
print(e) #除数不能为2
def div(a, b):
try:
print(a / b)
except ZeroDivisionError:
print("Error: b should not be 0 !!")
except Exception as e: #捕获除 ZeroDivisionError 之外的所有其他类型的异常,将捕获的异常对象赋值给变量 e
print("Unexpected Error: {}".format(e))
else: #没有任何错误时
print('Run into else only when everything goes well')
finally: #一定执行
print('Always run into finally block.')
# tests
div(2, 0)
div(2, 'bad type')
div(1, 2)
规则如下:
-
except语句不是必须的,finally语句也不是必须的,但是二者必须要有一个,否则就没有try的意义了。
-
except语句可以有多个,Python会按except语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except语句。
-
except语句可以以元组形式同时指定多个异常,参见实例代码。
-
except语句后面如果不指定异常类型,则默认捕获所有异常
-
如果要捕获异常后要重复抛出,请使用raise,后面不要带任何参数或信息。
2. 异常类型
| 异常类型 | 描述 | 示例代码 |
|---|---|---|
| SyntaxError | 语法错误,代码不符合 Python 语法规则 | print("Hello, world" |
| IndentationError | 缩进错误,代码块缩进不正确 | if True:\nprint("Indentation Error") |
| NameError | 名称错误,访问未定义的变量或函数 | print(variable_that_does_not_exist) |
| TypeError | 类型错误,执行不兼容的操作或函数调用 | 5 + "Hello" a = '1234'\na[1] = 0 |
| ValueError | 值错误,函数接收到不合法的参数值 | int("abc") |
| KeyError | 键错误,字典中查找不存在的键 | my_dict = {"key1": "value1"}\nvalue = my_dict["key2"] |
| IndexError | 索引错误,访问不存在的列表或序列元素 | my_list = [1, 2, 3]\nelement = my_list[4] |
| FileNotFoundError | 文件未找到错误,尝试打开不存在的文件 | with open("non_existent_file.txt", "r") as file:\n content = file.read() |
| IOError | 输入/输出错误,文件或数据的输入/输出操作错误 | file = open("readonly_file.txt", "w")\nfile.write("Hello") |
| ZeroDivisionError | 零除错误,尝试除以零 | result = 5 / 0 |
| AttributeError | 属性错误,访问对象不存在的属性 | my_list = [1, 2, 3]\nmy_list.upper() |
| ImportError | 导入错误,尝试导入不存在的模块或包 | import non_existent_module |
| KeyboardInterrupt | 键盘中断,用户中断程序执行(如 Ctrl+C) | 程序运行过程中按下 Ctrl+C |
| ArithmeticError | 数学运算错误,数学相关错误的基类 | # 该类本身较少单独使用,通常由其子类抛出 |