函数基础
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:woshinidaye ''' 函数!function 几种编程方法 1、面向对象:类(class)、 2、面向过程:过程(def) 3、函数式编程:函数(def) ''' ''' #定义一个------函数 def test(x): #函数名 #this is a test function #描述 x = x+1 #代码块 return x #定义返回值,并终止函数 print(test(2)) #定义一个------过程:过程是没有返回值的函数 def test2(): #this is a test function print('for process') print('====>>>',test2()) #test2没有定义返回值,python返回none #函数的运用,可以把某一段重复性的功能用函数实现,这样实现了代码的重复利用 #而且代码的修改可以直接在函数上进行修改, import time def log(): #time_format = '%Y-%m-%d %X' time_current = time.strftime('%z-%Y-%m-%d %X') with open('log.txt','a+',encoding='utf-8') as f: f.write('%s\ttest line\n'%time_current) def test_log_1(): print('function test_log_1') #time.sleep(3) log() def test_log_2(): print('function test_log_2') #time.sleep(3) log() test_log_1() test_log_2() ''' ''' def test(): print('this is test function!') return 0 print('还对打印这一行吗??') #前面是return 0,说明函数已经介绍,并返回0,这一行将不会被执行 test() print(test()) x = test() #return的值可以赋予x print('====>>>',x) ''' ''' #return的类型 def test1(): print('test1') def test2(): print('test2') return 0 def test3(): print('test3') return 1,'hello world',['zhangsan','lisi'];{'zhangsan':'lisi'} x1 = test1() #没定义return,解释器显示返回0 x2 = test2() #return 0 x3 = test3() #返回元组 print(x1,'\n',x2,'\n',x3,'\n',x3[1]) ''' #定义有参数的函数 ''' def test(x,y): print(x) print(y) test(1,2) #形参x、Y、实参1、2。形参的数量=实参的数量 #位置参数调用,与形参一一对应 test(x=2,y=2) #关键字调用,与形参书序无关 #关键参数不能写在位置参数前面!!!!!!! #test(x=1,2) #positional argument follows keyword argument test(3,y=4) #可以正常运行,3赋值给x #test(3,x=3) #test() got multiple values for argument 'x' def test1(x,y,z): print(x) print(y) print(z) test1(1,2,3) print('>>>>>>><<<<<<<') test1(1,z=3,y=1) ''' #默认参数:用于默认安装、连接数据库的端口号 #def test1(x,y=2,z): #SyntaxError: non-default argument follows default argument,默认参数后面只能跟默认参数 '''def test1(x,y,z=2): #SyntaxError: non-default argument follows default argument,默认参数后面只能跟默认参数 print(x) print(y) print(z) test1(1,2,3) test1(1,2,z=2) test1(1,2)''' #除开默认参数,要求形参的个数与实参的个数相等,但是如何实现任意多个实参,函数都能正常运行呢? #参数组 #*args,接收N个位置参数,转为元组 ''' def test2(*args): print(args) test2(1,2,2,2,3,4,4,4) test2(1,2,3,4,213,5,6,7,8,9,0,12) #结果会把实参全放到元组中 test2(*[1,2,3,4,213,5,6,7,8,9,0,12]) #结果会把实参全放到元组中 *[1,2,3,4,213,5,6,7,8,9,0,12] = *args args=tuple([1,2,3,4,213,5,6,7,8,9,0,12]) ''' ''' def test3(x,y,z=3,*args): print(x) print(y) print(z) print(args) test3(1,2) #结果,x=1 y=2 z=3 元组为空 test3(1,2,4) #结果,x=1 y=2 z=4 元组为空 test3(1,2,4,[12313,234,567]) #把[12313,234,567]这个列表作为一个合在一起的参数,等于是传入了一个参数 test3(1,2,4,*[12313,234,567]) #把args=[12313,234,567]这个列表先转换为tuple,之后再传入,等于是传入了三个参数 a = [12313] b = tuple([12313,234,567]) print(a,type(a)) print(b,type(b)) ''' #**kwargs,接收N个关键字参数,转为字典 ''' def test3(x,y,z=3,**kwargs): #把关键字参数转化为字典 print(x) print(y) print(z) print(kwargs) print(kwargs['name']) test3(1,2,name='zhangsan',age=123) test3(1,2,3,name='zhangsan',age=123) test3(1,2,3,**{'name':'zhangsan','age':123}) def test3(x,y,z=3,**kwargs): #把关键字参数转化为字典 print(x) print(y) print(z) print(kwargs) print(kwargs['name']) logger('test3') def logger(source): print('from %s' % source) test3(1,2,3,name=123,age=18) ''' #局部变量 # age = 123 #全局变量,强烈不建议在函数内部修改全部变量 # name = 'zhangsan' # def change_name(name): # #global age # print('before change,your name is %s,age is %s ' % (name,age)) #函数里面也可以直接引导全局变量 # #age = 12345678 #要从函数内部修改全局变量,需要添加global命令 # name = 'lisi' #这里就是局部变量,这个变量的作用域仅存在与这个函数。。。 # print('after change,your name is %s' %name) # # change_name(name) # print(name) #结果还时张三 # print(age) # names = ['zhangsan','lisi','laowang'] # def change_names(): # names[0] = 'mytest' # print('===>',names) # change_names() # print(names) #在函数里面居然改了,全局也生效了!! #这是因为列表、字典、集合、类,均可以在局部,对全部修改。除了字符串和整数,不能在局部修改 #递归函数 #自己调用自己,类似于贪吃蛇, # 必须有明确的结束条件maximum recursion depth exceeded while calling a Python object #每一次递归的问题参数逐层减少 #递归函数的处理速度较慢 # def sum(n): # print(n) # return sum(n) # sum(10) # def calc(n): # print(n) # if int(n/2) >= 1: # return calc(int(n/2)) # print('====>>>',n) #上面的递归函数执行完了,才会执行到这一步 # a = 1.231412 # print(a,type(a),int(a),type(int(a))) # calc(100) #高阶函数:将一个函数以参数的形式传给另外一个函数,这个函数就成为高阶函数 def cal(x,y,f): # c = x + y # print(c) # return c return f(x)+f(y) # cal(1,2) test = cal(3,-8,abs) # print(cal(1,2)) # print(abs(123-1234)) print(test)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言