Python基础之函数基本用法与进阶详解
本文实例讲述了Python基础之函数基本用法与进阶。分享给大家供大家参考,具体如下:
目标
函数参数和返回值的作用
- 函数的返回值进阶
- 函数的参数进阶
- 递归函数
01.函数参数和返回值的作用
函数根据有没有参数以及有没有返回值,可以相互组合,一共有4种组合形式
- 无参数,无返回值
- 无参数,有返回值
- 有参数,无返回值
- 有参数,有返回值
定义函数时,是否接收参数,或者是否返回结果,是根据实际的功能需求来决定的!
- 如果函数内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部
- 如果希望一个函数执行完成后,向外界汇报执行结果,就可以增加函数的返回值
1.1无参数,无返回值
此类函数,不接收参数,也没有返回值,应用场景如下:
- 只是单纯地做一件事情,例如显示菜单
- 在函数内部针对全局变量进行操作,例如:新建名片,最终结果记录在全局变量中
注意:
- 如果全局变量的数据类型是一个可变类型,在函数内部可以使用方法修改全局变量的内容——变量的引用不会改变
- 在函数内部,使用赋值语句才会修改变量的引用
1.2无参数,有返回值
此类函数,不接收参数,但是有返回值,应用场景如下:
- 采集数据,例如温度计,返回结果就是当前的温度,而不需要传递任何的参数
1.3有参数,无返回值
此类函数,接收参数,没有返回值,应用场景如下:
- 函数内部的代码保持不变,针对不同的参数处理不同的数据
- 例如名片管理系统针对找到的名片做修改、删除操作
1.4有参数,有返回值
此类函数,接收参数,同时有返回值,应用场景如下:
- 函数内部的代码保持不变,针对不同的参数处理不同的数据,并且返回期望的处理结果
- 例如名片管理系统使用字典默认值和提示信息提示用户输入内容
- 如果输入,返回输入内容
- 如果没有输入,返回字典默认值
02.函数的返回值进阶
在程序开发中,有时候,会希望一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理
- 返回值是函数完成工作后,最后给调用者的一个结果
- 在函数中使用return关键字可以返回结果
- 调用函数一方,可以使用变量来接收函数的返回结果
问题:一个函数执行后能否返回多个结果?
示例——温度和湿度测量
- 假设要开发一个函数能够同时返回当前的温度和湿度
- 先完成返回温度的功能如下:
defmeasure(): """返回当前的温度""" print("开始测量...") temp=39 print("测量结束...") returntemp result=measure() print(result)
- 在利用元组在返回温度的同时,也能够返回湿度
- 改造如下:
defmeasure(): """返回当前的温度""" print("开始测量...") temp=39 wetness=10 print("测量结束...") return(temp,wetness)
提示:如果一个函数返回的是元组,括号可以省略
技巧
- 在Python中,可以将一个元组使用赋值语句同时赋值给多个变量
- 注意:变量的数量需要和元组中的元素数量保持一致
result=temp,wetness=measure()
面试题——交换两个数字
题目要求
- 有两个整数变量a=6,b=100
- 不使用其他变量,交换两个变量的值
解法1——使用其他变量
#解法1-使用临时变量 c=b b=a a=c
解法2——不使用临时变量
#解法2-不使用临时变量 a=a+b b=a-b a=a-b
解法3——Python专有,利用元组
a,b=b,a
03.函数的参数进阶
3.1.不可变和可变的参数
问题1:在函数内部,针对参数使用赋值语句,会不会影响调用函数时传递的实参变量?——不会!
- 无论传递的参数是可变还是不可变
- 只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用
defdemo(num,num_list): print("函数内部") #赋值语句 num=200 num_list=[1,2,3] print(num) print(num_list) print("函数代码完成") gl_num=99 gl_list=[4,5,6] demo(gl_num,gl_list) print(gl_num) print(gl_list)
问题2:如果传递的参数是可变类型,在函数内部,使用方法修改了数据的内容,同样会影响到外部的数据
defmutable(num_list): #num_list=[1,2,3] num_list.extend([1,2,3]) print(num_list) gl_list=[6,7,8] mutable(gl_list) print(gl_list)
面试题——+=
- 在python中,列表变量调用+=本质上是在执行列表变量的extend方法,不会修改变量的引用
defdemo(num,num_list): print("函数内部代码") #num=num+num num+=num #num_list.extend(num_list)由于是调用方法,所以不会修改变量的引用 #函数执行结束后,外部数据同样会发生变化 num_list+=num_list print(num) print(num_list) print("函数代码完成") gl_num=9 gl_list=[1,2,3] demo(gl_num,gl_list) print(gl_num) print(gl_list)
3.2缺省参数
- 定义函数时,可以给某个参数指定一个默认值,具有默认值的参数就叫做缺省参数
- 调用函数时,如果没有传入缺省参数的值,则在函数内部使用定义函数时指定的参数默认值
- 函数的缺省参数,将常见的值设置为参数的缺省值,从而简化函数的调用
- 例如:对列表排序的方法
gl_num_list=[6,3,9] #默认就是升序排序,因为这种应用需求更多 gl_num_list.sort() print(gl_num_list) #只有当需要降序排序时,才需要传递`reverse`参数 gl_num_list.sort(reverse=True) print(gl_num_list)
指定函数的缺省参数
- 在参数后使用赋值语句,可以指定参数的缺省值
defprint_info(name,gender=True): gender_text="男生" ifnotgender: gender_text="女生" print("%s是%s"%(name,gender_text))
提示
- 缺省参数,需要使用最常见的值作为默认值!
- 如果一个参数的值不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递!
缺省参数的注意事项
- 缺省参数的定义位置
- 必须保证带有默认值的缺省参数在参数列表末尾
- 所以,以下定义是错误的!
defprint_info(name,gender=True,title):
- 在调用函数时,如果有多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系!
defprint_info(name,title="",gender=True): """ :paramtitle:职位 :paramname:班上同学的姓名 :paramgender:True男生False女生 """ gender_text="男生" ifnotgender: gender_text="女生" print("%s%s是%s"%(title,name,gender_text)) #提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值! print_info("小明") print_info("老王",title="班长") print_info("小美",gender=False)
3.3多值参数(知道)
定义支持多值参数的函数
- 有时可能需要一个函数能够处理的参数个数是不确定的,这个时候,就可以使用多值参数
- python中有两种多值参数:
- 参数名前增加一个*可以接收元组
- 参数名前增加两个*可以接收字典
- 一般在给多值参数命名时,习惯使用以下两个名字
- *args——存放元组参数,前面有一个*
- **kwargs——存放字典参数,前面有两个*
- args是arguments的缩写,有变量的含义
- kw是keyword的缩写,kwargs可以记忆键值对参数
defdemo(num,*args,**kwargs): print(num) print(args) print(kwargs) demo(1,2,3,4,5,name="小明",age=18,gender=True)
提示:多值参数的应用会经常出现在网络上一些大牛开发的框架中,知道多值参数,有利于我们能够读懂大牛的代码
多值参数案例——计算任意多个数字的和
需求
- 定义一个函数sum_numbers,可以接收的任意多个整数
- 功能要求:将传递的所有数字累加并且返回累加结果
defsum_numbers(*args): num=0 #遍历args元组顺序求和 forninargs: num+=n returnnum print(sum_numbers(1,2,3))
元组和字典的拆包(知道)
- 在调用带有多值参数的函数时,如果希望:
- 将一个元组变量,直接传递给args
- 将一个字典变量,直接传递给kwargs
- 就可以使用拆包,简化参数的传递,拆包的方式是:
- 在元组变量前,增加一个*
- 在字典变量前,增加两个*
defdemo(*args,**kwargs): print(args) print(kwargs) #需要将一个元组变量/字典变量传递给函数对应的参数 gl_nums=(1,2,3) gl_xiaoming={"name":"小明","age":18} #会把num_tuple和xiaoming作为元组传递个args #demo(gl_nums,gl_xiaoming) demo(*gl_nums,**gl_xiaoming)
04.函数的递归
函数调用自身的编程技巧称为递归
4.1递归函数的特点
特点
- 一个函数内部调用自己
- 函数内部可以调用其他函数,当然在函数内部也可以调用自己
代码特点
- 函数内部的代码是相同的,只是针对参数不同,处理的结果不同
- 当参数满足一个条件时,函数不再执行
- 这个非常重要,通常被称为递归的出口,否则会出现死循环!
示例代码
defsum_numbers(num): print(num) #递归的出口很重要,否则会出现死循环 ifnum==1: return sum_numbers(num-1) sum_numbers(3)
4.2递归案例——计算数字累加
需求
- 定义一个函数sum_numbers
- 能够接收一个num的整数参数
- 计算1+2+…num的结果
defsum_numbers(num): ifnum==1: return1 #假设sum_numbers能够完成num-1的累加 temp=sum_numbers(num-1) #函数内部的核心算法就是两个数字的相加 returnnum+temp print(sum_numbers(2))
提示:递归是一个编程技巧,初次接触递归会感觉有些吃力!在处理不确定的循环条件时,格外的有用,例如:遍历整个文件目录的结构
关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。