函数无疑是程序设计中极其重要的一部分,它第一次提出了封装的概念,将一定的功能进行封装以便于使用,这无疑是需要让人非常理解的部分。虽然Python不像C++与Java一样以构造函数为主体的方式进行程序编译。但其依然不可小觑。本篇笔记直接从面向对象的角度学习函数。
一.函数的定义
作用:封存一定的代码段,以实现功能的重复使用,它实现了结构化的程序设计,减少了程序的复杂度,易于开发、调试,有时5也可实现特殊功能。
分类:内置函数、标准库函数、第三方库函数、自定义函数。
语法:
def 函数名([形参列表]):
'''注释'''
函数体
return 返回结果
注:形参列表不需要声明数据类型;函数内部允许嵌套定义。
开头注释的部分一般用来描述函数的功能,可以省略
调用:函数(实参列表)
二.函数的参数类型与传递
形参:声明函数时声明的参数,不占内存。
实参 :程序运行时实际需要的参数,占内存。
在输入实参时,要保证输入实参的数目和数据类型符合要求。
引用传递:因为Python中没有指针一说,故在函数传递中,直接进行地址传递而非值传递。
在进行不可变变量如:int、bool、str等数据的形参传递,且形参会在函数中更改数值时,不会影响原实参变量,会在内存中新开辟一个地址进行内容存放。如果传递的是可变变量,则 直接 更改实参。
参数类型:
位置参数:即按照形参顺序、数目进行实参传递。
关键字参数:以”形参名=实参“的形式进行传递,不在乎顺序。
默认参数:即直接在形参时赋值,在实参传递时可以省略。但必须在形参列表的最右端。eg:a=5.
注:默认参数存在重用现象,即如果默认参数在函数中会被修改值,并且程序中会多次使用该函数。则从第二次开始,默认参数会继承第一次的改变值,继续重复。解决方法即将默认参数设定为等于None,再在函数中设定一个if语句,判定默认参数是否等于None,等于则为[ ],接下来正常编译。
动态参数:
位置动态:*形参
收到多余位置会变成一个元组传递给形参。
关键字动态:**形参
收到多余关键字时当作字典传递给形参。
注意:动态参数必须在形参列表最后一位。
序列解包:
传递参数时,序列中的元素按照位置动态参数的方式传入函数。
注:序列元素个数必须和形参个数一致。
顺序:序列解包>关键参数解包>普通参数
return语句:
从函数中返回一个值,同时结束函数。可以省略,但最好别。
三.变量的作用域
变量起作用的范围叫变量的作用域。
局部变量:只在函数内部使用的变量,引用更快
全局变量:可以横跨多个函数,范围更大。
注:出现函数中局部变量和全局变量重名的情况,则自动引用局部变量。在函数体中引用全局变量时,若该变量名是在函数体中第一次出现且在赋值语 句之前,则解释为局部变量,除非使用global进行了声明。
两个关键字:
四.递归函数
组成:终止条件+递归步骤。
重点:
- 必须设置终止条件
- 必须保证整体问题是收敛的
- 必须保证内存和运算消耗控制在一定范围,过大计算机无法承受
匿名函数:
匿名函数是没有名称的函数,即不使用过def语句定义的函数,而使用lamda关键字。
语法:lamda arg1, arg2,…argn:expression
arg:若干参数; expression:单个表达式(不能使用if语句)
因为匿名函数简洁方便,也常用于赋值变量。(常用于sort函数的key值设计中)
五.常用函数
函数调用:
随机函数:
常用内置函数:
注:reduce函数需要引用functools库
END.