申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。
定义一个函数只要以"def"开头即可,Python内置了很多有用的函数,我们可以直接调用。
def function_name(arg1):
function body
return value
#定义函数
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
深圳 广州
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表达式也称为匿名函数,不再使用 def 语句这样标准的形式定义一个函数,就是匿名函数。
a = lambda x, y : x + y
print(a(1,2))
执行结果:
3
如果一个函数在内部调用自身本身,这个函数就是递归函数。例如连加、连乘及阶乘等
#阶乘
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
一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!
如果看完觉得有所收获的话,记得一键三连哦,谢谢大家!