一、函数的概念
语法:
def 函数名(参数1,参数2,参数3…):
函数体
返回值
说明:
a.函数由两部分组成:声明部分和实现部分
b.def,关键字,是define的缩写,表示定义的意思
c.函数名:类似于变量名,遵循标识符的命名规则,尽量做到顾名思义
d.():表示的参数列表的开始和结束
e.参数1,参数2,参数3… :参数列表【形式参数,简称为形参】,其实本质上就是一个变量名,参数列表可以为空
f.函数体:封装的功能的代码
g.返回值:一般用于结束函数,可有可无,如果有返回值,则表示将相关的信息携带出去,携带给调用者,如果没有返回值,则相当于返回None
二、函数的参数
函数参数分为两类: 有参函数、无参函数
- 位置参数/必须参数
def f1(x, y):
print(x, y)
f1(3,4)
- 默认参数
# 默认参数
def f2(x, y, z=5):
print(x, y, z)
f2(3, 4, 6)
- 关键字参数
# 关键字参数
def f3(x, y, z):
print(x, y, z)
f3(z=3, y=4, x=5)
- 可变参数/不定长参数
# 可变参数/不定长参数
# *args: 用来接收任意多个位置参数
def f4(*args):
print(args)
f4()
f4(1,2,3,4,5,6)
def f5(x, y, *args, z, k):
print(x, y, args, z, k)
f5(1,2,3,4,5,6,z=7,k=8)
# **kwargs: 用来接收任意多个关键字参数,会得到一个字典
def f6(x, y, **kwargs):
print(x, y, kwargs) # 5 6 {'z': 7, 'k': 8}
f6(5, 6, z = 7, k=8)
# f6(3,4,1,3)
- 接受任意参数,通配参数
# 参数的书写顺序:
# 形参:位置参数, *args,默认参数,**kwargs
# 实参:位置参数, 关键字参数
def f7(a,b,*args,c=6,d=7,**kwargs):
print(a,b,args,c,d,kwargs)
f7(1,2,3,4,d=77, x=8, y=9)
#接受任意参数:通配参数
def f8(*args, **kwargs):
print(args,kwargs)
f8(1,2,3,5,x=6,y=7)
三、匿名函数
不再使用def这种的形式定义函数,使用lambda来创建匿名函数
特点:
a.lambda只是一个表达式,比普通函数简单
b.lambda一般情况下只会书写一行,包含参数,实现体,返回值
语法:lambda 参数列表 : 实现部分
#语法:lambda 参数列表 : 实现部分
#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))
四、值传递和引用传递
值传递:传参的过程中传递的是值,一般指的是不可变的数据类型,number,tuple,string
引用传递:传参的过程中传递的是引用,一般指的是可变的数据类型,list,dict, set
代码演示:
# 基本类型: 不可变类型
# int float str tuple bool None
# 引用类型:可变类型
# list dict set
# 基本类型赋值: 不关联
a = 10
b = a
a = 20
print(a, b) # 20 10
# 引用类型赋值:关联
l1 = [1,2,3]
l2 = l1
l1[0] = 99
print(l1,l2)
# 函数中
age = 10
person = {'name':'小明', 'age':43}
def change_age(age1,person1): # age1= age; person1=person
global age
age1 += 1
person1['age'] += 1
# change_age()
change_age(age,person)
print(age,person)