python(三)
为什么要使用函数 ?
有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼 ,在程序设计中要善于利用函数,可以减少重复编写程序段的工作量,同时可以方便地实现模块化的程序设计
函数的作用
-
函数是Python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构
-
函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件
-
函数用于将相关功能打包并参数化
-
Python提供了很多的内置函数
-
Python中函数作用域查找,LEGB原则:
L: Local 函数内部作用域
E: Enclosing 函数内部与内嵌函数之间
G: Global 全局作用域
B: Build-in 内置作用域
函数的定义
Python 定义函数使用 def关键字,函数名为用户自定义名称,参数列表为传给此函数使用的参数,下面是函数体。一般格式如下:
def 函数名(参数列表):
函数体
规则:
1 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
2 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
3 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4 函数内容以冒号起始,并且缩进。
5 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
-
必须参数
参数在函数中相当于一个变量,而这个变量的值是在调用函数的时候被赋予的。在函数内部,你可以像过去使用变量一样使用它。
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
def add(a,b):
return a+b
c = add(2,3)
print(c)
5
-
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值
def add(a,b):
return a+b
c = add(b = 2,a = 3)
print(c)
5
-
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。需要函数声明时指定默认值
def add(a = 5,b = 5):
return a+b
c = add(b = 2,a = 3)
d = add()
print('c的值为',c)
print('d的值为',d)
c的值为 5
d的值为 10
- 不定长参数(可变参数)
- 你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数
- 和上述2种参数不同,声明时不会命名
- 加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组
def add(a,b = 3,*mut):
d = a+b*mut[0]
return d
c = add(1,2,3,4,5,6,7,8)
print(c)
7
-
关键字可变数量参数
允许在调用函数时,传入任意个含参数名的参数
def user_info(name,age,**other):
print(f'用户的名字为{name},年龄为{age},其他信息为{other}')
user_info('zhangsan',34,**{'phone':'1'})
用户的名字为zhangsan,年龄为34,其他信息为{'phone': '1'}
作用域
Pyhton 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。
两种最基本的变量:全局变量和局部变量。
m = 10 #全局变量
def muti():
m = 5 #局部变量
print('m的值为',m)
muti()
print('m的值为',m)
m的值为 5
m的值为 10
m = 10 #全局变量
def muti():
global m #引用全局变量
m = 5
print('m的值为',m)
muti()
print('m的值为',m)
m的值为 5
m的值为 5
Lambda函数
lambda关键词能创建小型匿名函数。lambda函数能接收任何数量的参数但只能返回一个表达式的值,它的一般形式如下:
lambda [arg1 [,arg2,.....argn]] : expression
例:
func = lambda f : f.center(50,'*')
print(func('这是lambda函数'))
********************这是lambda函数********************
注意:
lambda定义的是单行函数,如果需要复杂的函数,应该定义普通函数
lambda参数列表可以包含多个参数,如 lambda x, y: x + y
lambda中的表达式不能含有命令,而且只限一条表达式
作用:
对于单行函数,使用lambda可以省去定义函数的过程,让代码更加精简。
在非多次调用的函数的情况下,lambda表达式即用既得,提高性能。
递归函数
在函数体内,可以调用其他函数;当一个函数在函数体内调用其本身时,这个函数就称为递归函数。
如求1到100各位数相加之和,我们可以用for循环实现累加,代码如下:
def add_100():
sum = 0
for i in range(101):
sum += i
return sum
Sum = add_100()
print(Sum)
5050
若用递归函数来实现,我们可以得到:
def add_100(n):
if n == 1:
return 1
return n + add_100(n-1)
print(add_100(100))
5050
注意:
递归函数的优点是定义简单,逻辑清晰;理论上,所有的递归函数都可以写成循环的方式。但是使用递归函数需要注意防止栈溢出。
在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
当把上述实参改为1000时,就会导致栈溢出,报错提示递归超过最大深度
RecursionError: maximum recursion depth exceeded in comparison