申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。
函数定义
定义一个函数只要以"def"开头即可,Python内置了很多有用的函数,我们可以直接调用。
def function_name(arg1):
function body
return value
- 函数名(function_name):函数名以字母或下划线开头,并且区分大小写
- 函数参数(arg1):调用一个函数时可以传递的参数,参数可以没有,也可以有一个或多个
- 函数内容(function body):在函数的内部,与"def"相比需要缩进4个空格
- 函数返回值(return value):函数执行完成后返回的值,也可以不返回内容,默认为none
函数参数
- 必须参数:如果函数内容中使用了此函数参数,此参数就是必须参数,调用函数时缺少的话就会报错
#定义函数 def fun1(a): print(a) #调用函数 fun1(1) 执行结果: 1
#定义函数 def fun1(a): print(a) #调用函数 fun1() 执行结果: 发生异常:TypeError fun1() missing 1 required positional argument: 'a'
- 关键字参数:使用关键字参数可以不按参数的顺序来调用函数
def fun1(a,b): print(a,b) fun1("深圳","广州") fun1(b="广州",a="深圳") 执行结果: 深圳 广州 深圳 广州
- 默认参数:在定义函数时给参数添加默认值,如果调用函数时没有传入参数,函数就会使用默认值。注意:默认参数一定要定义在必须参数的后面
def fun1(a,b = 1): print(a,b) fun1("深圳") fun1("深圳","广州") 执行结果: 深圳 1 深圳 广州
- 可变参数:如果我们不能在定义函数的时候确定参数的数量和内容,就可以使用可变参数。如下:用 * 分隔开,args表示一个元组,用 ** 分隔开,kwargs表示一个字典
def fun1(*args,**kwargs): print(args) print(kwargs) i = (1,2,3) j = {"sz": "深圳", "gz": "广州"} fun1(*i,**j) 执行结果: (1, 2, 3) {'sz': '深圳', 'gz': '广州'}
- 组合参数:顾名思义,就是将上面的必须参数、关键字参数、默认参数、可变参数组合到一起使用
变量作用域
变量的作用域相当于变量的命名空间,Python中变量赋值的位置决定了哪些范围的对象可以访问这个变量,这个范围被称为作用域。Python中有两种最基本的变量作用域:局部变量和全局变量。
-
局部变量:一般情况下,在函数内进行赋值的变量和不做特殊声明的变量都是局部变量
#变量a在函数内赋值,属于局部变量 def fun1(): a = 1 print(a) fun1() 执行结果: 1
#变量b属于函数的参数,也属于局部变量 def fun1(b): print(b) fun1(1) 执行结果: 1
-
全局变量:在函数外赋值的变量就属于全局变量,全局变量可以在整个程序范围内进行访问
#变量a在函数外赋值,属于全局变量 a = 1 def fun1(): print(a) fun1()
lambda表达式
lambda表达式也称为匿名函数,不再使用 def 语句这样标准的形式定义一个函数,就是匿名函数。
a = lambda x, y : x + y
print(a(1,2))
执行结果:
3
- ":“左边的"x”,"y"是函数的参数
- ":"右边的是要返回的值
- "a(1,2)"是调用此lambda函数
- 注意:lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
递归函数
如果一个函数在内部调用自身本身,这个函数就是递归函数。例如连加、连乘及阶乘等
#阶乘
def fact1(n):
if n == 1:
return 1
return n * fact1(n-1)
#fact1(5) = 5! = 5*4*3*2*1
print(fact1(5))
执行结果:
120
注意:使用递归函数需要注意防止栈溢出,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出,解决递归调用栈溢出的方法是通过尾递归优化
尾递归:在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况
def fact1(n):
return fact2(n, 1)
def fact2(a, b):
if a == 1:
return b
return fact2(a - 1, a * b)
print(fact1(5))
执行结果:
120
执行过程
fact1(5)
-》fact2(5, 1)
-》fact2(4, 5)
-》fact2(3, 20)
-》fact2(2, 60)
-》fact2(1, 120)
-》120
一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!
如果看完觉得有所收获的话,记得一键三连哦,谢谢大家!