Python快速学习——第9章:函数
第九章函数9.1 什么是函数函数就像一个可以重复使用的工具包你把原材料放进去它就能按照预定的方式加工并返回结果。使用函数可以避免重复编写相同的代码让程序更加模块化和易于维护。# 简单的函数示例defgreet(name):向指定的人问好returnf你好{name}# 使用函数messagegreet(张三)print(message)# 你好张三9.2 函数的定义和调用9.2.1 定义函数使用def关键字定义函数语法格式def函数名(参数1,参数2,...):函数文档字符串可选# 函数体代码return返回值# 可选# 示例计算两个数的和defadd(a,b):计算两个数的和resultabreturnresult9.2.2 调用函数定义函数后可以通过函数名和参数来调用它# 调用add函数sum_resultadd(3,5)print(sum_result)# 8# 直接使用返回值print(add(10,20))# 309.3 函数的参数9.3.1 位置参数位置参数是按照定义时的顺序传递的参数defintroduce(name,age,city):自我介绍函数returnf我叫{name}今年{age}岁来自{city}# 必须按照顺序传递参数resultintroduce(张三,25,北京)print(result)# 我叫张三今年25岁来自北京9.3.2 关键字参数关键字参数通过参数名来指定值可以不按顺序# 使用关键字参数顺序不重要resultintroduce(age25,city上海,name李四)print(result)# 我叫李四今年25岁来自上海# 混合使用位置参数和关键字参数resultintroduce(王五,city广州,age30)print(result)# 我叫王五今年30岁来自广州9.3.3 默认参数可以为参数指定默认值调用时可以不传递这些参数defgreet(name,greeting你好):问候函数带有默认参数returnf{greeting}{name}# 使用默认参数print(greet(张三))# 你好张三# 覆盖默认参数print(greet(李四,Hello))# Hello李四9.3.4 可变参数⚠️本人很少用9.3.4.1 *args - 可变位置参数接收任意数量的位置参数defsum_numbers(*args):计算任意数量数字的和total0fornuminargs:totalnumreturntotalprint(sum_numbers(1,2,3))# 6print(sum_numbers(1,2,3,4,5))# 159.3.4.2 **kwargs - 可变关键字参数接收任意数量的关键字参数defcreate_student(**kwargs):创建学生信息student{}forkey,valueinkwargs.items():student[key]valuereturnstudent# 使用可变关键字参数student1create_student(name张三,age20,major计算机)student2create_student(name李四,age22,city北京,score95)print(student1)# {name: 张三, age: 20, major: 计算机}print(student2)# {name: 李四, age: 22, city: 北京, score: 95}9.3.5 参数组合各种参数类型可以组合使用但必须按特定顺序defcomplex_function(a,b,c10,*args,**kwargs):复杂的参数组合print(fa{a}, b{b}, c{c})print(fargs:{args})print(fkwargs:{kwargs})complex_function(1,2,3,4,5,name张三,age20)# 输出# a1, b2, c3# args: (4, 5)# kwargs: {name: 张三, age: 20}9.4 返回值9.4.1 返回单个值defsquare(x):计算平方returnx*x resultsquare(5)print(result)# 259.4.2 返回多个值Python函数可以返回多个值实际上返回的是一个元组defcalculate(a,b):计算和、差、积、商sum_resultab differencea-b producta*b quotienta/bifb!0else除数不能为0returnsum_result,difference,product,quotient# 接收多个返回值s,d,p,qcalculate(10,2)print(f和{s}, 差{d}, 积{p}, 商{q})9.4.3 无返回值如果函数没有return语句或return后面没有值则返回Nonedefprint_hello(name):打印问候语没有返回值print(fHello,{name}!)resultprint_hello(张三)# Hello, 张三!print(result)# None9.5 变量的作用域9.5.1 局部变量和全局变量# 全局变量global_var我是全局变量deftest_function():# 局部变量local_var我是局部变量print(local_var)# 可以访问局部变量print(global_var)# 可以访问全局变量test_function()# print(local_var) # 错误不能访问局部变量9.5.2 global关键字在函数内部修改全局变量需要使用global关键字count0defincrement():globalcount# 声明使用全局变量count1print(f初始值{count})# 0increment()print(f调用后{count})# 19.5.3 nonlocal关键字⚠️本人没用过在嵌套函数中修改外部函数的变量需要使用nonlocaldefouter():x10definner():nonlocalx# 声明使用外部函数的变量x20print(f内部函数{x})inner()print(f外部函数{x})outer()# 输出# 内部函数20# 外部函数209.6 函数的类型9.6.1 内置函数Python提供的内置函数len()、max()、min()、sum()、sorted()…# 常见内置函数numbers[1,2,3,4,5]print(len(numbers))# 5print(max(numbers))# 5print(min(numbers))# 1print(sum(numbers))# 15print(sorted(numbers))# [1, 2, 3, 4, 5]9.6.2 用户自定义函数我们自己编写的函数defis_even(number):判断数字是否为偶数returnnumber%20print(is_even(4))# Trueprint(is_even(5))# False9.6.3 匿名函数lambda⚠️了解即可使用lambda关键字创建小型匿名函数语法lambda 参数: 表达式# 简单的lambda函数squarelambdax:x*xprint(square(5))# 25# 直接在需要函数的地方使用numbers[1,2,3,4,5]even_numberslist(filter(lambdax:x%20,numbers))print(even_numbers)# [2, 4]# 使用lambda排序students[(张三,85),(李四,92),(王五,78)]students_sortedsorted(students,keylambdax:x[1],reverseTrue)print(students_sorted)# [(李四, 92), (张三, 85), (王五, 78)]9.7 函数的高级特性⚠️了解即可9.7.1 函数作为参数函数可以作为参数传递给其他函数defapply_operation(numbers,operation):对数字列表应用操作results[]fornuminnumbers:results.append(operation(num))returnresults# 定义操作函数defsquare(x):returnx*xdefdouble(x):returnx*2# 使用函数作为参数numbers[1,2,3,4,5]squaresapply_operation(numbers,square)doublesapply_operation(numbers,double)print(squares)# [1, 4, 9, 16, 25]print(doubles)# [2, 4, 6, 8, 10]9.7.2 函数作为返回值函数可以返回另一个函数defcreate_multiplier(factor):创建乘法器函数defmultiplier(x):returnx*factorreturnmultiplier# 创建特定的乘法器doublecreate_multiplier(2)triplecreate_multiplier(3)print(double(5))# 10print(triple(5))# 159.7.3 装饰器装饰器是一种修改函数行为的高级技术deftimer(func):计时装饰器defwrapper(*args,**kwargs):importtime start_timetime.time()resultfunc(*args,**kwargs)end_timetime.time()print(f函数{func.__name__}运行时间{end_time-start_time:.6f}秒)returnresultreturnwrapper# 使用装饰器timerdefslow_function():模拟耗时操作importtime time.sleep(1)return完成resultslow_function()# 输出函数 slow_function 运行时间1.000123秒9.8 递归函数⚠️了解即可函数调用自身称为递归deffactorial(n):计算阶乘递归实现ifn0orn1:return1else:returnn*factorial(n-1)print(factorial(5))# 120deffibonacci(n):计算斐波那契数列递归实现ifn1:returnnelse:returnfibonacci(n-1)fibonacci(n-2)# 打印前10个斐波那契数foriinrange(10):print(fibonacci(i),end )# 0 1 1 2 3 5 8 13 21 349.9 文档字符串为函数添加文档说明defcalculate_bmi(weight,height): 计算身体质量指数(BMI) 参数: weight -- 体重单位千克 height -- 身高单位米 返回: BMI值保留两位小数 bmiweight/(height**2)returnround(bmi,2)# 查看文档字符串print(calculate_bmi.__doc__)# 使用help函数查看help(calculate_bmi)本章笔记函数是可重用的代码块提高代码的模块化和可维护性。使用def关键字定义函数通过函数名和参数调用函数。函数参数有多种类型位置参数、关键字参数、默认参数、可变参数。函数可以返回单个值或多个值没有return语句时返回None。变量作用域分为全局作用域和局部作用域使用global和nonlocal修改变量作用域。函数类型包括内置函数、用户自定义函数和匿名函数lambda。函数可以作为参数传递也可以作为返回值支持装饰器等高级特性。递归函数调用自身解决特定类型的问题。文档字符串为函数提供说明文档。函数中可以使用异常处理来提高健壮性。