八、函数及常用的内置函数
函数的定义与调用
函数是将一段实现功能的完整代码,使用函数名称进行封装,通过函数名称进行调用。以此达到一次编写,多次调用的目的。函数的使用使得代码更加模块化、可重用,提高了代码的可维护性。
自定义函数:
def 函数名称(参数列表):#此处的参数为形式参数
函数体
[return返回值列表]
函数调用:
函数名(参数列表)#此处的参数为实际参数
#实现累加求和
def get_sum(num):
s=0
for i in range(1,num+1):
s+=i
print(f'1到{num}的累加和为{s}')
#函数的调用
get_sum(20)#1-20之间的累加和
get_sum(30)#1-30之间的累加和
函数使用的总结:
函数定义:
使用关键字def;确定函数名称、参数名称、参数个数、编写函数体(用于实现函数和功能的代码)。
函数调用:
通过函数名称进行调用函数;对函数的各个参数进行实际的赋值。
函数执行:
使用实际参数参与函数功能的实现。
函数返回结果:
函数执行结束后,如果使用return进行返回结果,则结果被返回到函数的调用处。
函数的参数传递
参数可分为以下类型:
1.位置参数:
是指调用时的参数个数和顺序必须与定义的参数个数和顺序相同。
def happy_birthday(name,age):
print('祝'+name+'生日快乐')
print(str(age)+'生日快乐')
#happy_birthday('liiud')#TypeError: happy_birthday() missing 1 required positional argument: 'age'
#happy_birthday(18,'jhfuhau')#TypeError: can only concatenate str (not "int") to str
happy_birthday('liuaa',18)
2.关键字参数:
是在函数调用时,使用“形参名称=值”的方式进行传参,传递参数顺序可以与定义时参数的顺序不同。
def happy_birthday(name,age):
print('祝'+name+'生日快乐')
print(str(age)+'岁生日快乐')
happy_birthday(age=18,name='hafj')
在同时使用位置传参和关键字传参时,要遵循的特点是:位置传参在前,关键字传参在后。
3.默认值参数:
是在函数定义时,直接对形式参数进行赋值,在调用时如果该参数不传值,将使用默认值,如果该参数传值,则使用传递的值。
def happy_birthday(name='hah',age=18):
print('祝'+name+'生日快乐')
print(str(age)+'岁生日快乐')
happy_birthday()#不传参,使用默认值参数
happy_birthday('dsav')#使用一个位置传参
happy_birthday(age=23)#使用一个关键字传参
在定义函数时,参数列表若有位置参数和默认值参数,则应遵循的特点为:位置参数在前,默认值参数在后。
4.可变参数:
可变参数又分为个数可变的位置参数和个数可变的关键字参数两种,其中个数可变的位置参数是在是在参数前加一颗星(*para),para为参数的名称,函数调用时可接受任意个数的实际参数,并放到一个元组中。个数可变的关键字参数在参数前加两颗星(**para),在函数调用时可接收任意多个“参数=值”形式的参数,并放到一个字典中。
#个数可变的位置参数
def fun(*para):
print(type(para))
for item in para:
print(item)
#调用
fun(10,20,30)
fun(10)
fun([11,12,13])#将整个列表作为一个参数进行传递
fun(*[11,12,13])#在参数前加一颗星,会对列表进行解包,将列表中每个元素作为一个独立的元素进行传递
#个数可变的关键字参数
def fun2(**kw):
print(type(kw))
for key,value in kw.items():
print(key,'----',value)
fun2(name='fsf',age=12,heig=123)
d={'name':'faf','age':23,'heig':1241}
fun2(**d)
函数的返回值
如果函数的运行结果需要在其他函数中使用,那么这个函数就应该被定义为带返回值的参数;函数的运行结果使用return关键字进行返回;return可以出现在函数中的任意一个位置,用于结束函数;返回值可以是一个值或多个值,如果返回的值是多个,结果是一个元组类型。
返回值是一个的情况:
def cacl2(a,b):
s=a+b
return s#将s返回给函数的调用处去处理
get_s=cacl2(1,2)
print(get_s)
get_s2=cacl2(cacl2(1,2),3)#计算1+2+3.先去执行cacl2(1,2)返回结果为3,再去执行cacl2(3,3)
print(get_s2)
返回值是多个的情况:
def get_sum(num):
s=0#累加和
odd_sum=0#奇数和
even_sum=0#偶数和
for i in range(1,num+1):
if i%2 !=0:
odd_sum+=i
else:
even_sum+=i
s+=i
return odd_sum,even_sum,s
result=get_sum(10)
print(result)
若将上述多个返回值的情况改为无返回值,则:
def get_sum(num):
s=0#累加和
odd_sum=0#奇数和
even_sum=0#偶数和
for i in range(1,num+1):
if i%2 !=0:
odd_sum+=i
else:
even_sum+=i
s+=i
print(s,odd_sum,even_sum)
get_sum(10)
变量的作用域
变量的作用域是指变量起作用的范围,根据范围作用的大小可分为局部变量和全局变量。
局部变量是在函数定义出的参数和函数内部定义的变量,仅在函数内部起作用,函数执行结束,局部变量的生命周期也结束;
def cacl(a,b):#a和b为在函数定义处的参数,所以是局部变量
s=a+b#s为函数内部定义的变量,所以是局部变量
return s
print(a,b,s)
#NameError: name 'a' is not defined,因为a,b,s都为局部变量,作用范围在1-3行
全局变量是在函数外定义的变量或函数内部使用global关键字修饰的变量,作用范围是整个程序,程序运行结束,全局变量的生命周期才结束。
a=100#全局变量
def cacl(x,y):
return a+x+y
print(a)
print(cacl(10,20))
注意:当全局变量和局部变量的名称相同时,局部变量的优先级高
匿名函数lambda
匿名函数是指没有名字的函数,这种函数只能使用一次,一般是在函数的函数体只有一句代码且只有一个返回值时,可以使用匿名函数来简化。
其语法结构为:result=lambda 参数列表:表达式
递归函数
在一个函数的函数体内调用该函数本身,该函数就是递归函数。一个完整的递归操作由两部分组成:一部分是递归调用另一部分是递归终止条件,一般可使用if-else结构来判断递归的调用和递归的终止。
以计算阶乘为例:
def fac(n):#计算n的阶乘
if n==1:
return 1
else:
return n*fac(n-1)
print(fac(5))
常用的内置函数
数据类型转换函数:
bool(obj):获取指定对象obj的布尔值
str(obj):将指定对象obj转成字符串类型
int(x):将x转成int类型
float(x):将x转成float类型
list(sequence):将序列转成列表类型
tuple(sequence):将序列转成元组类型
set(sequence):将序列转成集合类型
数学函数:
abs(x):获取x的绝对值
divmod(x,y):获取x与y的商和余数
max(sequence):获取sequence的最大值
min(sequence):获取sequence的最小值
sum(iter):对可迭代对象进行求和运算
pow(x,y):获取x的y次幂
round(x,d):对x进行保留d位小数,结果四舍五入
迭代器操作函数:
sorted(iter):对可迭代对象进行排序
reversed(sequence):反转序列生成新的迭代器对象
zip(iter1,iter2):将iter1与iter2打包成元组并返回一个可迭代的zip对象
enumerate(iter);根据iter对象创建一个enumerate对象
all(iter):判断可迭代对象iter中所有元素的布尔值是否都为True
any(iter):判断可迭代对象iter中所有元素的布尔值是否都为False
next(iter);获取迭代器的下一个元素
filter(function,iter):通过指定条件过滤序列并返回一个迭代器对象
map(function,iter):通过函数function对可迭代对象iter的操作返回一个迭代器对象
常用的其他内置函数:
format(value,format_spec):将value以format_spec格式进行显示
len(s):获取s的长度或s元素的个数
id(obj):获取对象的内存地址
type(x):获取x的数据类型
eval(s):它的作用是将字符串 s
当作一个表达式进行求值,并返回结果。换句话说,它可以执行字符串中包含的有效 Python 表达式,并返回表达式的结果。
本章总结
1、函数是将一段实现功能的完整代码,使用函数名称进行封装,通过函数名称进行调用
2、函数定义的语法结构:
def 函数名称(参数列表):
函数体
[return返回值列表]
3、函数的调用:
不带返回值的函数直接调用;
带返回值的函数调用之后要将结果保存到变量中。
4、函数的参数类型:
函数定义处的参数成为形式参数,形式参数可以定成:位置参数、默认值参数和可变参数
函数调用处的参数成为实际参数,在进行参数传递时可以使用关键字参数传参或位置参数传参。
5、按照变量的作用域可分为:局部变量和全局变量
6、只有一句函数体的函数可以使用匿名函数替代
7、递归的组成部分:递归调用与递归终止条件,可以使用if...else结构实现
8、常用的内置函数可分为:数据类型转换函数、数学函数、迭代器操作函数和其他函数