python学习笔记(3)
本节内容:
- 函数基本语法和特性
- 函数参数与局部变量
- 返回值
- 递归
- 匿名函数
- 高阶函数
- 内置函数
一、函数基本语法和特性
定义:函数式指将一组语句的集合通过一个名字(函数名称)封装起来,要想执行这个函数,只需要调用其函数名即可
特性:
- 减少重复代码使用
- 程序变的可扩展
- 程序变的容易维护
语法定义:
1 def fun(): #函数名称 2 "注释" 3 print('this is function') 4 return 0 #定义返回值,可以随便定义返回值,代表函数执行完毕 5 fun() #调用参数 6 7 8 9 #函数其实就是变量; 10 11 变量: 12 A = B 13 执行:print(A) 14 结果:B 15 16 17 函数: 18 def fun(): 19 print('123') 20 21 执行:fun() 22 结果:123 23 24 写法不一样,但是本质是一样的,函数可以嵌套一些功能在里面
二、函数参数和局部变量
形参变量只有在被调用时才分配内存单元,在调用结束时即可释放所分配的内存单元。形参是在函数内有效。
实参可以是常量、变量、表达式、函数等,无论实参何种类型的量,在进行函数调用时,他们都必须有确定的值,以便这些值传送给形参。
形参和实参位置是一一对应关系
默认参数:
def student(name,age,sex,local='BJ'): print("---学生信息---") print(name) print(age) print(sex) print(local) student("张三",25,"男")
执行结果为:name=张三,age=25,sex=nan,local=BJ;
默认参数local默认=BJ,如果local定义新值则显示为新值,如果没有定义则默认为BJ;
注:默认形参和实参关系是一一对应
关键参数:
正常情况下给函数传递参是要按照顺序,不想按照顺序可以用关键参数,需要指定参数名称即可,如果有形参和关键参数同时使用,关键参数必须放在位置参数之后。
1 def student(name,age,sex): 2 print("---学生信息---") 3 print(name) 4 print(age) 5 print(sex) 6 7 student(name='张三',age=25,sex='男')
非固定参数:
函数在定义时不确定用户想传多少个参数,可以使用非固定参数
*args 把多传入的参数变成一个元组形式;(只接收N个位置参数转换成元组的形式),用途:便于用于用户扩展性
1 def test(x,*args): 2 print(x) 3 print(args) 4 5 test(1,2,3,4,5) 6 7 输出结果: 8 x = 1 9 args =(2,3,4,5)
*kwargs 把N个关键字参数,转换成字典的方式
1 def test6(**kwargs): 2 print(kwargs) 3 4 #两种写法 5 test6(**{'name':'han','age':27,'sex':'F'}) 6 test6(name='han',age=26,sex='F') 7 8 执行结果:{'name': 'han', 'age': 26, 'sex': 'F'} ##字典的形式
混合使用:
1 def test(name,age=18,*args,**kwargs): 2 print(name) 3 print(age) 4 print(args) 5 print(kwargs) 6 7 test('han',6,7,8,sex='m',hohhy='tesla') 8 输出结果: 9 name = han 10 age = 6 #为什么会等于6 而不是等于18,参数混合使用时,默认采用位置对应关系,name对应han,age对应6,默认参数是18,如果重新赋值就会显示新值6 11 args = (7, 8) 12 kwargs = {'sex': 'm', 'hohhy': 'tesla'}
局部变量:
在子程序中定义的变量称为局部变量,在程序中一开始定义的变量称为全局变量
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序
当全局变量与局部变量同命时:局部变量起作用,其他地方全局变量起作用
1 school = 'zhangsan' #全局变量 2 def change_name(school): 3 print("before change",school) 4 school='Zhang' #局部变量,只在函数中生效 5 print("after change",school) 6 7 change_name(school) 8 print(school) 9 10 输出结果: 11 before change zhangsan 12 after change Zhang 13 zhangsan 14 15 可以修改列表: 16 mylist = [10, 20, 30] 17 def changeme(mylist): 18 mylist.append([1, 2, 3, 4]) 19 print("函数内取值: ", mylist) 20 return 21 22 changeme(mylist) 23 print("函数外取值: ", mylist) 24 25 输出结果: 26 [10, 20, 30, [1, 2, 3, 4]] 27 [10, 20, 30, [1, 2, 3, 4]]
三、返回值
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
- 函数在执行过程中只要遇到return语句,就会停止并返回结果。可以理解为return语句代表函数的结束
- 如果未在函数中指定return那这个函数的返回值为None
1 def test(): 2 print("3") 3 return 1,'hello',['a','b'],{"name":"name","name1":"name1"} 4 5 x=test() 6 print(x) 7 8 9 ##函数返回值,teturn 可以定义任何返回值; 10 #作用:通过返回值可以决定后续代码怎么运行; 11 #返回值=0,返回值None #这里的零指的是没有指定返回值 12 #返回值=1,返回值object 13 #返回值>1,返回值tuple
四、递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数
1 def calc(n): 2 print(n) 3 if int(n/2) >0: 4 return calc(int(n/2)) 5 6 calc(20)
递归特性:
- 必须有一个明确的结束条件
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 递归效率不高,递归层次过多会导致栈溢出。
五、匿名函数
匿名函数就是不需要显示的指定函数,使用 lambda 来创建匿名函数。
语法:lambda 参数1,参数2....:执行条件
1 # 可写函数说明 2 sum = lambda arg1, arg2: arg1 + arg2 #arg1,arg2为参数,arg1 + arg2为执行条件 3 4 # 调用sum函数 5 print("相加后的值为 : ", sum(10, 20)) #参数arg1=10,arg2=20,执行条件为求和
使用案例:
1 calc = lambda n:print(n) ##n代表参数:print(n)代表执行条件 2 calc(4) #参数n=4,执行条件:print(n) 即输出结果为4 3 输出结果:4 4 5 calc = lambda n:3 if n < 4 else n #n代表参数:3 if n < 4 else n 执行条件,意思为:如果n小于4则打印3,否则打印n 6 print(calc(5)) #参数n=5,if判断 5不小于4,所以打印n,即结果为5 7 输出结果:5 8 9 res = filter(lambda n:n > 5,range(10)) #配合filter使用,统计出range(10) 大于5的数据 10 for i in res: 11 print(i) 12 输出结果:6、7、8、9 13 14 res = map(lambda n:n*2,range(4)) 15 for i in res: 16 print(i) 17 18 输入结果:0、2、4、6、8
六、高级函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
1 def add(x,y,f): 2 return f(x) + f(y) 3 4 res = add(3,-6,abs) 5 print(res)
七、内置函数
参考菜鸟教程:https://www.runoob.com/python3/python3-built-in-functions.html