Python函数
一. 函数的基础知识
- 函数定义及调用
1)什么是函数?
编写代码的效率
代码的重用
具有独立功能的代码块组织为一个小模块
2)定义函数:
def 函数名():
函数体
3)调用函数:通过函数名()可直接进行调用
需要先定义,再调用!!
通过函数进行封装,使用时直接调用该函数即可
def sum_two_nums():
a=23
b=45
result=a+b
print(result)
sum_two_nums()
练习:
定义一个函数,输出自己的姓名和年龄,并且可以定义该函数
def print_mess():
name=input('请输入姓名:')
age=input('请输入年龄:')
print('姓名:%s,年龄:%s'%(name,age))
print_mess()
- 函数的参数
1)定义带有参数的函数
形参:定义函数时,()小括号中的内容;用来接收实参中的内容。
实参:调用函数时,()小括号中的内容
eg1:
def sum_two_nums(a,b):
result=a+b
print(result)
#调用函数:29赋值给a,78赋值给b
sum_two_nums(29,78)
2)调用带有参数的函数
eg2:求三角形周长
#abc为形参
def print_perimeter(a,b,c):
per=a+b+c
print('三角形的周长是:%d'%per)
#调用三个实参
print_perimeter(3,4,5)
3)调用函数时参数的顺序
- 函数的返回值
1)定义:返回值就是程序中完成一件事情之后,最后给调用者的结果
2)带有返回值的函数:在函数中把结果返回给调用者,需要在函数中使用return
return相当于循环中的break,即在函数中,只要遇到return,就结束。
eg3:
def print_perimeter(a,b,c):
per=a+b+c
return per
print('三角形的周长:') #不会执行
#调用三个实参
per=print_perimeter(3,4,5)
print(per)
如果返回多个返回值,则可以将多个返回值组成列表、元组等,或用逗号将返回值分隔。
3)保存函数的返回值:
def add(a,b):
return a+b #思考:能不能返回多个值
result = add(11,15)
print(result)
-
函数的类型
根据参数、返回值
①无参数,有返回值
def A():
pass
②无参数,有返回值
def A():
return
③有参数,无返回值
def A(a):
pass
④有参数,有返回值
def A(a):
return -
函数的参数(补充)
1)缺省参数:在调用时,缺少参数,但是缺少的参数在定义函数时,已经赋值给它了
在调用函数时,如果没有给这个参数赋值,则使用定义函数中这个参数的默认值,否则会报错
在调用函数时,如果调用过程中给出了这个参数的值,并且在定义时也赋值了,则使用调用函数中的值。
eg5:
def add(a,b,c,d=22):
print(a)
print(b)
print(c)
print(d)
add(33,56,21)
2)不定长参数
在调用函数时,参数个数不确定,所以需要在定义不定长参数时,用*表示可以接收的参数个数为n个,前的参数,需确定个数,且必须传入;后的参数则放入一个元组中。
args 是有特殊含义的参数:表示不定长的参数,将后面写的都存在一个元组中。
在不定长参数中:
一个代表元组
两个 代表字典
eg6:
def add_nums(a,b,c,*args):
result=a+b+c
#后面的n个都合成一个元组,合成args
print(args)
for temp in args:
result+=temp
print('resule=%d'%result)
add_nums(2,6,8,34,5,21,32)
2,6,8为a,b,c的参数值
34, 5, 21, 32为*后的参数,放在一个元组中
eg7:
def print_num(a,b,c,*args,**kwargs):
result=a+b+c
print()
print(args)
print(kwargs)
print('resule=%d' % result)
print_num(32,41,26,11,23,51,5,'dfs',name='chen',age=23)
二. 函数的嵌套调用
- 函数嵌套使用
一个函数里面调用了另一个函数,就是函数嵌套。
eg8:
def A():
print('这是函数A') #控制台打印
def B():
print('这是函数B')
A() #调用A
print('end')
#调用B
B()
2. 函数嵌套的应用
1)打印图形
①写一个函数打印一条横线
def print_one_line():
print('-'*30)
print_one_line()
②打印自定义行数的横线
def print_one_line():
print('-'*30)
def print_num_lines(a):
i=0
while i<a:
print_one_line()
i+=1
print_num_lines(3)
打印3行
2)数学计算
①写一个函数求三个数的和
def sum_three_num(a,b,c):
result=a+b+c
print('和是:%d'%result)
sum_three_num(19,42,33)
②写一个函数求三个数的平均值
#求平均值
def sum_three_num(a,b,c):
result=a+b+c
return result #result赋值给sum1
def avg_three_num(a,b,c):
sum1=sum_three_num(a,b,c)
avg=sum1/3 #sum1/3赋值给avg
print('平均值是:%d'%avg)
#调用avg
avg_three_num(23,53,41)
三. 局部变量和全局变量
- 局部变量和全局变量的定义
1)局部变量:在函数内部定义的变量 ,定义在函数体内
不同的函数可以定义相同的名字的局部变量
为了临时保存数据,在函数中定义变量进行存储
2)全局变量:在函数外部定义的变量,必须定义在函数调用之前的任意位置
如果一个变量,既能在一个函数中使用,也能在其他函数中使用,就是全局变量
a=10
def A():
a=10
print(a)
def B():
print(a)
A()
B()
- 全局变量和局部变量名字相同
探讨当局部变量和全局变量名字相同时,在函数中怎样进行调用?
当函数中有自己的变量时,则使用自己的局部变量
当函数中没有自己的变量时,则使用全局变量。
a=20
def A():
a=10 #刚好变量名相同,并没有修改
print(a)
def B():
print(a)
A()
B()
- 修改全局变量
全局变量能在所有函数中使用,当局部变量和全局变量名称一样时,若想在函数中将局部变量修改成全局变量,则使用global
如果在程序中,没有全局变量,可以在函数中通过global设置某个变量为全局变量
a=20
def A():
global a #设置成全局变量
a=15 #刚好变量名相同,并没有修改
print(a)
def B():
print(a)
A()
B()
四. 递归函数和匿名函数
- 递归函数
递归函数:如果一个函数在内部不调用其他的函数,而是自己本身
例子:计算阶乘n! = 1 * 2 * 3…n
eg:
def num(a): # 5 4 3 2 1
if a>1:
result=a*num(a-1) #5*num(4) 5*4*num(3) 5*4*3*num(2) 5*4*3*2*num(1)
else:
result=1
return result # =5*4*3*2*1
res=num(5) #5的阶乘
print(res)
def calc(n):
print(n)
if int(n/2)==0:
return n
res=calc(int(n/2))
return res
res=calc(10)
print(res)
2. 匿名函数
匿名函数:用lambda关键字创建一个函数,省略了用def定义函数的标准步骤
用法:lambda [arg1,arg2,argn]:expression
调用:
匿名函数返回的是一个表达式的值,所以需要用一个变量接收
匿名函数(参数值)
匿名函数的使用:
作为函数,可直接实现想要的功能
作为函数的参数,在调用的时候把lambda式子传递给函数的参数
作为内置函数的参数
def add_num(a,b):
return a+b
res=lambda a,b:a+b
print(res(3,5))
自己定义的函数
def fun(a,b,opt):
print('a=%d'%a)
print('b=%d'%a)
print('result=%d'%opt(a,b))
fun(1,2,lambda x,y:x+y)
作为内置函数的参数:下面的数据如何指定按age或name排序?
students=[{'name':'xiaoli','age':23},{'name':'xiaozhao','age':20},{'name':'xiaozhang','age':28}]
#按照年龄倒序排列
students.sort(key=lambda x:x['age'],reverse=True)
print(students)
#字符串拼接
def name(username):
print('miss_'+username)
name('zhang')
#自定义字符串
def str_name(n1,n2,test):
print(n1)
print(n2)
print(test(n1,n2))
str_name('zhang','xiaoming',lambda m,n:m+n)
def add_sum(a,b,fun):
return fun(a,b)
fun_new=input('请输入一个lambda表达式:')
fun_new=eval(fun_new) #需要用eval转化成函数
res=add_sum(3,4,fun_new)
print(res)
五. 函数使用注意事项
-
自定义函数
一个函数到底有没有返回值,就看有没有return,因为只有return才可以返回数据
在开发中往往根据需求来设计函数需不需要返回值
函数中,可以有多个return语句,但是只要执行到一个return语句,那么就意味着这个函数的调用完成
在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收
参数列表中变量的个数根据实际传递的数据的多少来确定 -
调用函数
调用方式:函数名([实参列表])
如果调用的函数在定义时有形参,那么在调用的时候就应该传递参数
调用时,实参的个数和先后顺序应该和定义函数中要求的一致
如果调用的函数有返回值,那么就可以用一个变量来进行保存这个值 -
作用域
在一个函数中定义的变量,只能在本函数中用(局部变量)
在函数外定义的变量,可以在所有的函数中使用(全局变量)