一、函数
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
二、函数的好处
1.提高代码的复用性
2.让代码更简洁,简化代码
三、定义函数
定义函数使用def关键字,后面是函数名,函数名不能重复,函数不调用,是不会执行的
def sayhello():#函数名 print('hello')#函数体 sayhello() #调用函数
四、函数的参数
函数在调用的时候,可以传入参数,有形参和实参(简单点说,形参就是函数接收的参数,而实参就是你实际传入的参数。)
4.1 形参:形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。
4.2 实参:实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在函数调用时,它们都必须有确定的值,以便把这些值传给形参。函数调用结束返回主调用函数后则不能再使用该形参变量。
4.3 位置参数:就是按照参数的位置来进行传参,比如下面的calc函数,a和b就是位置参数,位置参数是必传的,有几个位置参数在调用的时候就要传几个,否则就会报错,那如果有多个位置参数的话,记不住哪个位置传哪个了怎么办,可以使用位置参数的名字来指定调用
比如说下面的calc函数也可以使用calc(y=1,x=2)这样来调用,这种调用方式叫做关键字传参
def calc(a,b):#a和b就是形参,形式参数;a和b即位置参数,也叫必填参数 res = a * b print('%s * %s=%s'%(a,b,res)) calc(7,8)#调用函数,将7,8分别传给a和b 7和8叫实参,实际参数
4.4 默认参数:默认参数就是在定义形参的时候,给函数默认赋一个值,比如数据库的端口这样的,默认给他一个值,这样就算你在调用的时候没传入这个参数,它也是有值的,
默认参数不是必填的,如果给默认参数传值的话,它就会使用你传入的值。如果使用默认值参数的话,必须挡在位置参数后面定义。
def op_file(file_name,conent=None): #conent就是默认参数 f = open(file_name,'a+',encoding='utf-8') f.seek(0) if conent: #不为空代表写 f.write(conent) f.flush() else: all_users = f.read() return all_users #调用完函数之后,返回什么结果 # print(f.read()) #为空代表读 f.close() res = op_file('a.txt') #res就是接受函数的返回值 print(res)
4.5 函数不固定参数(*args)
一个函数,参数不是固定的,我也不知道以后这个函数会扩展成啥样,可能参数越来越多,这个时候如果再用固定的参数,那后面程序就不好扩展了,这时候就可以用非固定参数了,非固定参数有两种,一种是可变参数,一种是关键字参数。
不固定参数特点:1.非必传;2.没有限制参数个数;3.它把参数放到一个元组里
def syz1(*args): #参数组 print(args) userna = args[0] pwd =args[1] age = args[2] syz1('ytt','123456',18) #调用函数
def syz(a,*args): #参数组 print(a) userna = args[0] pwd =args[1] age = args[2] syz('ytt','123456',18) #必传参数a没有传,会报错 syz('ls','sdf','kkk','lll','rrr','rrr') #a打印结果为ls
4.6 关键字参数
**kwargs特点:1.非必填;2.没有限制参数个数;3.它把参数放到一个字典里了,key是=前面的,value是=后面的
1 def sys3(time,**kwargs): 2 print(kwargs) 3 sys3('sdf') 4 sys3(name='nhy',age=38,time='20180908') 5 sys3('2018',name='nhy',age=38,addr='回龙观',home='河南') 6 sys3('nhy') 7 #返回结果为 8 #{} 9 #{'age': 38, 'name': 'nhy'} 10 #{'age': 38, 'name': 'nhy', 'home': '河南', 'addr': '回龙观'} 11 #{}
五、函数的返回值:return
每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None,函数也可以有多个返回值,如果有多个返回值的话,会把返回值都放到一个元组中,
返回的是一个元组。
1.把函数处理的结果返回回来(例如函数op_file)
2.结束函数,函数里面遇到return,函数会立即结束
def haha(): #函数里面遇到return,函数会立即结束 for i in range(5): if i == 3: print(i) return#只写一个return的话,就返回None res = haha() print(res)
六、局部变量和全局变量
局部变量:意思就是在局部生效的,出了这个变量的作用域,这个变量就失效了,比如上面的c就是一个局部变量,出了这个函数之后,就没有c这个值了
全局变量:意思就是在整个程序里面都生效的,在程序最前面定义的都是全局变量,全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改。
name = '谢红'#这就是一个全局变量,如果要改全局变量的话,那你要先声明一下,你修改的是全局变量 def sayName(): global name#声明下修改的是全局变量 name = 'ytt' print('name1',name) sayName()
七、递归函数
递归:就是函数自己调用自己,示例如下:
def test1(): num = int(input('输入一个数字:')) if num%2 == 0:#判断输入的数字是不是偶数 return True#如果是偶数的话,程序就退出了,返回True print('不是偶数,请重新输入') return test1()#如果不是偶数的话,继续调用自己,输入数字 print(test1())#调用test
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构