函数
1、介绍
编程方式:
面向对象:华山派 --》类 --》关键字 :class
面向过程:少林派 --》过程 --》关键字:过程 def
函数式编程:蛋黄派 --》函数 --》关键字:def
2、定义
初中函数 x与y , x是因变量y是自变量 y是x的函数 随着x的变化y都有一个确定的值,比如 y=2x
Python定义 :逻辑结构化与过程化 def 函数名(参数):代表接着写子代码 逻辑 再定义返回值 return
(过程和函数 关键字都是def,实际为没有返回值的函数)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
''' def fun(): "定义一个测试函数" return ("CPU:" + str(psutil.cpu_times()) + "%") x = fun() '''
可重复利用,low例子
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#Herbie Kim #!/usr/bin/python # -*-coding:utf-8-*- #重复利用 import time def logger(): time_format = '%Y-%m-%d %X' time_current = time.strftime(time_format) with open('a.txt','a+') as f: f.write('%s end action\n' %time_current) def test1(): print('in the test1') logger() def test2(): print('in the test2') logger() test1() test2()
返回值
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
def test1(): print('hehe....') def test2(): print('hehe....') return 0 def test3(): print('hehe....') return 1,'kim',['1','hello'],{'name':'herbie'} x = test1() y = test2() z = test3() print(x) print(y) print(z)
参数:
形参与实参
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#形参与实参 def test(x,y): #x,y 代表形参 print(x) print(y) #test(1,2) #()内容实参(位置参数为x,y赋值) test(1,y=5) # y=5 关键字参数,关键字等于赋值 test(x=3,4) #报错,关键字参数无法放在位置参数前
非固定参数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
def test4(name,age=18,*args,**kwargs): print(name) print(age) print(args) print(kwargs) test4('kim',age=20,home='liangzhu',cat='tesla')
局部变量作用域于函数中,外部调用无法生效 (函数中定义)
name = "kim" def change_name(name): print("我本来叫:",name) name = "cake" #局部变量,只作用域于函数内部,并未改变原生变量名name print("但是之后叫:",name) change_name(name) print(name)
全局变量作用于全局一开始就在程序中定义,函数中也可修改局部变量,当变量为参数或函数无法修改(但不能改!)
name = "kim" age = 19 def change_name(name): global age #在函数中修改全局变量 age = 18 name = "cake" print("我本来叫:",name,"今年:",age) #name = "cake" #局部变量,只作用域于函数内部,并未改变原生变量名name print("但是之后叫:",name,"今年也:",age) change_name(name) print(name) print(age)
注意:局部变量无法修改全局变量只有当 此变量是单纯的字符串或数字。当变量为复杂一些的列表、字典可以修改
names = ["kim","cake","sun"] def change_name(names): names[0] = "金某人" print(names) change_name(names) print(names)
递归
如果一个函数在内部自己调用本身,那么就是递归函数;
def care(n):
print(n)
return care(n+1)
care(0)
特性:
- 必须要有明确的结束条件
- 每次进入更深一层递归时,问题规模相比上一次递归都应有所减少
- 递归效率不高,层数过多会导致栈溢出
使用场景:传入一个数值一直除以2到无法除为止
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
def care(n): print(n) if int(n/2) > 0: return care(int(n/2)) print("-->",n) care(100)
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数。这种函数就称为高阶函数
def go(x,y,f): return f(x) + f(y) res = go(3,-6,abs) #abs 可以将负数转为正数 print(res)