Skip to main content

第二课:更多函数和功能

(一)内置函数

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数学运算错误,数学相关错误的基类# 该类本身较少单独使用,通常由其子类抛出

3. 自定义异常

自主抛出异常一个异常,可以使用raise关键字

raise NameError("bad name!")

(四)生成器

生成器yield和return的区别

def add(a, b):
    result = a + b
    return result  # 返回 result 的值并终止函数执行
def generate_numbers(n):
    for i in range(n):
        yield i 

调用一次,运行到yield输出一个值,然后冻结。再次被调用时在上次基础上继续运行,运行到到yield再冻结。以此类推。当执行到 yield 语句时,函数的执行状态被暂停,生成的值被返回,并保存函数的状态以便在下一次请求值时继续执行。yield 语句只能在生成器函数中使用。

for a in generate_numbers(5):
    print(a)

实际上for循环的本质是不断发起请求,所以 for a in generate_numbers(5): 中, 其实发起了5次请求

而每次请求都激活了已经冻结的field生成器