函数是对功能或者动作的封装,它的主要目的是:最大化代码重用和最小化代码冗余,以及对复杂过程的分解。
1:函数的定义与调用
在Python中使用如下的语法进行定义一个函数:
def name(arg1,arg2,... argN):
statements
return value
def语句是一条可执行的语句,当它运行的时候,会创建一个新的函数对象。并将它赋值给一个变量名(也就是函数名)。
def add(a,b): # 代码执行到这里时,创建了一个函数对象,并把它赋值给add
print('a=',a,' b=',b)
return a+b
# 函数调用:
print(add(1,3))
print(add('1','3'))
print(add([1,2,3,4],['abc','ert']))
2:函数的返回值
在Python中每个函数都有一个返回值,如果自己没有显式返回,函数默认返回None,其中函数返回值可以是任意类型的单个值,可以是任意类型的多个值。
# 1:返回默认值 None
def print_msg(s):
print(f'hello {s}')
ret = print_msg(111)
print(ret) # None
# 2:返回单个值
def add(a,b): # 代码执行到这里时,创建了一个函数对象,并把它赋值给add
print('a=',a,' b=',b)
return a+b
ret = add(1,3)
print(ret) # 返回4
ret = add('hello','ixusy88')
print(ret) # 返回 helloixusy88
# 3:返回多个值
def add(a,b): # 代码执行到这里时,创建了一个函数对象,并把它赋值给add
print('a=',a,' b=',b)
return a,b,a+b # 返回元组;也可以返回列表等其他类型数据
ret = add(1,3)
print(ret) # 返回4
ret = add('hello','ixusy88')
print(ret) # 返回 ('hello', 'ixusy88', 'helloixusy88')
# 也可以 使用序列赋值:
a,b,ret = add('hello','ixusy88')
print(a,b,ret ) # 输出:hello ixusy88 helloixusy88
3:形参和实参
形参:在函数声明的位置。 给出来的参数叫形参。 形式上的一个参数. 用一个变量来表示;
形参的分类
1. 位置参数 按照位置来声明形参
2. 默认值参数, 当给参数传递值的时候,默认值不起作用; 不给值,默认值起作用.;保证你至少有个值能用
顺序: 位置参数必须放在前面。 默认值参数必须放在后面
实参:在函数调用的时候,把实参的值赋值给形参的过程叫传参;在函数调用的地方给出的具体的值叫实参. 实际参数;
实参的分类:
1. 位置参数.:按照位置, 给形参赋值;
2. 关键字参数:按照形参的名字给参数赋值;
3. 混合参数,:位置参数必须放在前面, 关键字参数放后面;
# 形参,定义函数的时候的参数:位置参数必须放在前面,默认值参数必须放在后面
def show_msg(name,age,sex='男'):
msg = f'name is {name}, age is {age},sex is {sex}. '
print(msg)
# 实参:调用函数的时候,实际给函数传递的值。
# 位置参数:按照定义的位置传递
show_msg('ixusy88',18)
# 关键字参数:使用默认值
show_msg(name='hahha',age=38)
# 关键字参数:不使用默认值
show_msg(name='hahha',age=38,sex='女')
# 混合参数:位置参数必须放在前面, 关键字参数放后面;
show_msg('混合参数hahha',age=38,sex='女')
4:参数传递
在Python中参数的传递其实就是赋值操作,是变量名给变量名赋值(即通过对象引用),其结果就是两个变量指向了相同的对象:
# 不可变对象:
def func(a):
a = 200 # 这个的修改不会影响到外部
print('0-----:',id(a),a)
s = 100
func(s)
print('1-----:',id(s),s)
"""
输出结果:
0-----: 1775928288 200
1-----: 1775925088 100
"""
print('*'*60)
# 可变对象:
def func_2(a):
a[0] = 100 # 这里的修改会影响到外部的变量,因为两者都指向一个可变数据类型。
print('0-----:',id(a),a)
lst = [1,2,3]
print('1-----:',id(lst),lst)
func_2(lst)
print('2-----:',id(lst),lst)
"""
1-----: 2036762659272 [1, 2, 3]
0-----: 2036762659272 [100, 2, 3]
2-----: 2036762659272 [100, 2, 3]
"""