Python Day 08 函数基础重点知识总结
定义函数
-
函数语法
def 函数名(参数1,参数2,参数3……):
函数体
返回值 #有些不设置返回值说明:
- 函数有两部分组成:声明部分和执行部分
- def 关键字 是define的缩写
- 函数名 类似于变量名 尽量做到看名知意
- () 表示参数的开始和结束
- 参数1,参数2,参数3……:参数列表 该为形式参数 简称形参 ,本质上为一个变量名 参数列表可以为空
- 函数体 封装的代码和功能
- 返回值 一般用于结束函数 可有可无 如果有返回值 则会将会将return之后的信息传递出去 便于之后的调用 如果没有return 则没有在将来可以调用的参数 相当于返回的值为 None
-
函数的调用
- 当定义好一个函数之后 函数不会自己执行函数体
- 函数的调用:格式:函数名(参数列表)
- 当调用函数的时候 参数列表需要和定义函数时候的参数列表保持一致 不然则会报错
- 一个函数可以多次调用
- 当同一个py文件定义多个同名的函数时 最终调用的函数则为最后定义的函数 (实际上是一个覆盖的过程 同名函数只执行其中之一 也就是后面的那个)
-
函数的调用顺序
函数调用的顺序从上至下 函数内部如果调用其他函数 也是由从上至下的方式进行
注意函数在调用的时候 相互之间的关系 以及代码执行的先后顺序 -
关于函数内的参数
函数的参数分为形参和实参-
形参 形参则为在函数申明时定义的参数 (即def 函数名后的参数) 本质上是一个变量 用于接收实际的参数 也就是实参 (我把它定义为在函数内占一个坑给实参 所以实参的数量也要和形参的数量一一对应 不然会报错 也就是占了这个坑 必须得一一填上 不填满就会报错)
-
实参 实参就是在函数调用部分 实际参与运算的值 也就是赋予到函数内 参与函数运算真正的值
-
传参 传参是一个过程 是将实参传递到形参 参与函数内运算的过程 形参 = 实参
-
#需求:交换两个变量的值
def exchange(num1,num2):
temp = num1
num1 = num2
num2 = temp
print(“exchange函数内部:num1=%d num2=%d”%(num1,num2))num1 = 11
num2 = 22
exchange(num1,num2)
print(“外面:num1=%d num2=%d” % (num1, num2))- 实参和形参重名队函数实现没有影响
- 进行传参后 实际参与运算的时形参 对实参没有影响
- 本质原因 形参和实参在内存中开辟的空间不同
-
-
值传递和引用传递(掌握)
- 值传递 传参的过程中传递的是值 一般指的是不可变的数据类型 如 : number tuple string
#值传递
def func1(a):
a = 10
temp = 20
#传参:temp,但实际上传的是20
func1(temp)
print(temp) #20
- 引用传递 传参的过程中传递的是引用 一般指的是可变的数据类型 如:list dict set
#引用传递
def func2(list1):
list1[0] = 100
l = [10,20,30,40]
func2(l) #list1 = l
print(l[0])
"""
l = [10,20,30,40]
list1 = l
list1[0] = 100
"""
- 参数的类型
-
必须参数 也叫位置参数 调用函数的时候 必须使用正确的顺序传参 传参的时候参数的数量和形参必须保持一致 (如果形参没有任何限制 则默认为必须参数 顺序一致 数量一致)
-
关键字参数 使用关键字参数允许函数调用的时候实参的顺序和形参的顺序不一致 可以使用关键字自动匹配
注意关键字参数只有一个 到时候 只能出现在列表的最后一个 #注意2:关键字参数只有一个的情况下,只能出现在参数列表的最后
show2(“lisi”,age = 30)
-
#2.关键字参数
def show2(name,age):
age += 1
print(name,age)
#正常调用
show2("abc",10)
#show2(10,"abc")
#关键字参数调用函数
#注意1:关键字参数中的关键字其实就是形参的变量名,通过变量名进行传参
show2(age = 20,name = "lisi")
show2(name = "lisi",age = 20)
#注意2:关键字参数只有一个的情况下,只能出现在参数列表的最后
show2("lisi",age = 30)
#错误演示
#show2(40,name = "lisi") TypeError: show2() got multiple values for argument 'name'
#show2(name = "lisi",40) SyntaxError: positional argument follows keyword argument
#系统的关键字参数
print("",end=" ")
- 默认参数 调用参数时 如果没有传递参数 则会使用默认参数
- 在形参设置默认参数 如果传参 则使用传进来的数据 如果不传参 则会使用默认数据
- 在参数列表中 如果所有的形参都是默认参数 则正常使用 如果默认参数只有一个 则只能出现在参数列表的最后面
#3.默认参数
#注意1:在形参设置默认参数,如果传参,则使用传进来的数据,如果不传参,则使用默认数据
def fun1(name,age=18):
print(name,age)
fun1("zhangsan",20)
fun1("lisi")
fun1(name = "abc",age = 33)
fun1(name = "hello")
#注意2:在参数列表中,如果所有的形参都是默认参数,正常使用;但是,如果默认参数值只有一个,则只能出现在参数列表的最后面
def fun2(num1 = 10,num2 = 20):
print(num1.num2)
- 不定长参数(可变参数) 可以处理比当初申明的时候更多的参数
- *: 被当作tuple处理 变量名是元组名
- 传参的时候 实参可以根据任意数量传参 数量不固定
- 定义不定长参数是 最好将不定长参数放到参数列表的最后面(如果不定长参数出现在参数里列表的前面 则在实参列表中使用关键字参数)
- *: 被当作tuple处理 变量名是元组名
def func1(name,*hobby):
print(name)
print(hobby)
print(type(hobby)) #<class 'tuple'>
#遍历
for element in hobby:
print(element)
func1("aaa","anc","aaa","5435","tesrg","gtsrhesh",10,True)
- ** : 被单过字典处理 变量名相当于字典名
1. 注意 使用** 的时候 实参必须按照key = value 的方式来进行传参
def func2(**args):
print(args)
print(type(args)) #<class 'dict'>
for k,v in args.items():
print(k,v)
#注意1:使用**的时候,实参就必须按照key=value的方式进行传参
func2(x = 10,y = 20)
- 函数的返回值
函数的返回值 在本节前面已经有一部分叙述 这里主要提几个注意的点- 使用上 return 表示结束函数 并将函数得到的结果传给后面使用的使用者
- 在同一个代码块中 如果return的后面出现语句 则永远不会被执行
- 如果一个函数有返回值 在使用返回值时 要么使用变量 将值接出来 要么整个函数参与运算 (返回值默认为元组类型)
- 如果没有返回值 整体计算的结果为None
- 如果这个函数没有返回值 则这个函数的调用不能直接参与运算 不然会报错
- 如果一个函数体由分支 设置了返回值 最好每一个分支都有一个返回值
- 在python中 不同分支分会的数据类型可以是不相同的
- 在python中 一个return 可以同时返回多个数据 当作元组处理
匿名函数(掌握)
- 特点
- lambda 不再使用def这种形式定义函数 使用lambda来创建匿名函数
- lambda只是一个表达式 比普通的函数要简单
- lambda 一般情况之下只写一行 包括 : 参数 实现体 返回值
- example
-
def f(n):
return n**2可写为: lambda n:n**2
-
#1.
#需求:求两个数的和
#普通函数
def add(num1,num2):
sum = num1 + num2
add(num1 = 10,num2 = 20)
#匿名函数本身是没有函数名,将整个lambda表达式赋值给一个变量,然后将这个变量当做函数使用
sum1 = lambda n1,n2:n1 + n2
print(sum1(10,20))
#2.在匿名函数中也可以使用关键字参数
g = lambda x,y:x ** 2 + y ** 2
print(g(3,4))
print(g(x = 3,y = 4))
#3.在匿名函数中也可以使用默认参数
h = lambda x=0,y=0 : x ** 2 + y ** 2
print(h())
print(h(10))
print(h(10,20))
-
回调函数
举个例子
def f(x,y):
sum = x + y()
print(sum)def fn(d=4):
e = d ** 2
return ef(10, lambda d=4:d**2)