Python函数专题–函数的基本概念
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参 数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的 return相当于返回 None。
函数能提高应用的模块性,和代码的重复利用率
函数的分类
|-- 讲分类,一定要提标准
|-- 通过有无参数
|-- 有参函数
|-- 无参函数
将来的代码,我们函数定义者和函数的调用者不一定是一个人
|-- 有无返回值
|-- 有返回值的
|-- 无返回值的
如果函数运行完成,需要将某个结果给调用者 return 结果
格式:Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
全局变量和局部变量:全局流程下定义的变量以及函数体内部定义的变量
在内存中函数的调用
1、解释性的语言代码是从上而下执行的!!!
2、函数的调用过程
函数的调用过程,叫做压栈,等函数执行完成后,函数就立刻出栈(弹栈)
3、在函数中使用全局变量问题
在Python中,函数如果修改全局变量,一定要声明
global 全局变量
4、值传递和引用传递问题
参数
以下是调用函数时可使用的正式参数类型:
默认值参数:调用函数时,如果没有传递参数,则会使用默认参数,在函数的参数括号内默认给定的
命名参数(关键字):传入的参数类似这种name="runoob" 赋值命名类的参数
可变参数(不定长):分为*args 接受多余的变量默认存在元组中 **args接受多余的命名参数默认存在字典里
万能参数:一般参数后面加*args **kwargs来接受全部参数
函数递归
函数递归:
递归函数的优点:定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
递归函数的缺点:使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
例子:
def sum(n):
if n > 0:
return n + sum_recu(n - 1) #调用函数自身
else:
return 0
print("递归叠加-->",sum(100))
#实现的效果是:5050
匿名函数
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中 封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行
语句:lambda [参数1, 参数2... n]:语句
lambda x,y:x + y === def add(x, y):
return x + y
注意:在Python,lambda虽然简化了代码书写,增强了代码维护成本,代码的可读性下降了
return语句
return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None
全局函数
查看python的所有全局函数
>>> import builtins
>>> dir(builtins)