9.1 函数的调用
函数在声明时不会执行函数体,只有在调用函数的时候才会执行函数体
- 函数的调用过程(重点!)
a.物理过程
1.回到函数声明位置
2.用实参给形参赋值(传参),需要保证每个形参都有值。
3.执行函数体
4.获取返回值
5.回到函数调用位置,接着往后执行
b.函数调用过程是一个压栈的过程
当函数调用时,系统会自动地在内存中的栈区间开辟空间,存储函数调用过程中产生的数据(这里的数据包括参数和在函数中声明的变量)。当函数调用完成后,对应的内存空间会自动销毁。
def exchange(a1, b): # 同名会有灰色波浪线
a1, b = b, a1
print('函数中:', a1, b)
a, b = 10, 20
exchange(a, b) # 函数中: 20 10
print('函数外:', a, b) # 函数外: 10 20
9.2 函数的参数
- 1.根据实参分为位置参数和关键字参数
a.位置参数
让实参位置和形参位置一一对应
def fun1(a, b, c):
print('a:%d b:%d c:%d' % (a, b, c))
fun1(10, 20, 66) # a:10 b:20 c:66
b.关键字参数
实参以”形参名=值“的形式来传参
fun1(c=66, a=10, b=20) # a:10 b:20 c:66
c.位置参数和关键字参数混合使用
前提:保证每个参数都有值且位置参数要放在关键字参数前。
fun1(10, c=66, b=20) # a:10 b:20 c:66
- 从函数声明角度又有:参数默认值,不定长参数,参数类型说明
a.参数默认值
声明函数时,可以给参数设置默认值,语法:参数名 = 默认值
设置默认值的参数需要放在未设置默认值参数的后面。
注意:
设置默认值可给参数赋一个默认值,也常用于说明需要传入参数的类型
# 声明函数,并给参数c赋默认值1
# 有的参数有默认值,有的参数没有;有默认值的参数一定要放在后面。
def fun2(a, b, c=1):
print(a, b, c)
# 如果函数声明时参数有默认值,调用函数时,有默认值的参数可不赋值
fun2(10, 20) # 10 20 1
- 3.不定长参数
不定长参数:声明函数时,函数的参数不确定。
a.在声明函数时,参数名前加一个*,会将这个参数变成元组,来获取多个参数的值。通过位置参数调用
# 声明一个函数,功能是求多个数的和
def my_sum(*num):
print(sum(num))
# 调用参数是不定长参数的时候,不定长参数对应的位置,可以传任意个实参
my_sum(1, 2, 3, 3, 5, 7, 8, 9, 40) # 78 集合才是无序可变且不重复
b.在声明函数时,参数名前加两个*,会将这个参数变成字典,来获取多个实参的值。必须使用关键字参数
def fun4(**kwargs):
print(kwargs) # 字典
# fun4(1, 2, 4) 位置参数调用,报错
# 如果是调用不定长参数,调用时关键字可以随便命名。
fun4(a=1, b=3, c=8, j=9) # {'a': 1, 'b': 3, 'c': 8, 'j': 9}
c.(*args, **kwargs) - 用来表示不定长参数,调用时更灵活,可用位置参数也可用关键字参数或两者一起传参数。
*注意:
*args 必须放在 **kwargs之前,应为前者为位置参数,后者为关键字参数。
def func5(*args, **kwargs):
print(args, kwargs)
func5() # () {}
func5(6, 7, 8) # (6, 7, 8) {}
func5(a=6, b=7, c=8) # () {'a': 6, 'b': 7, 'c': 8}
func5(6, 7, 8, a=6, b=7, c=8) # (6, 7, 8) {'a': 6, 'b': 7, 'c': 8}
# 练习:求多个数的和,要求调用函数时可以多样性(位置,关键字)
def my_sum(*args, **kwargs):
sum1 = 0
for key in kwargs:
sum1 += kwargs[key]
print(sum(args)+sum1)
my_sum() # 0
my_sum(6, 7, 8) # 21
my_sum(a=6, b=7, c=8) # 21
my_sum(6, 7, 8, a=6, b=7, c=8) # 42
- 4.参数类型说明
参数类型说明只是对参数类型进行提示,并不能限制参数类型。可弹出语法提示。
a.设置默认值
b.参数名:类型名
注意:类型说明除了说明类型外,还可以做相应类型对应的语法提示。
def func7(a: str, b=''): # 都能给类型说明
print(a, b)
func7(1, '2') # 只能提示,不能限制。
9.3 函数的返回值
- 1.返回值
a.函数的返回值就是return关键字后面表达式的值,就是函数调用表达式的值。
b.python中所有函数都有返回值,默认为None。
return - 关键字;用来返回返回值;结束函数(当函数在执行过程中遇到了return就会结束函数),如果函数体中没有return,函数会在函数体执行完成后将None作为返回值。
函数调用表达式 - 就是调用函数的语句(如:func1(1, 2));当函数调用完成后,函数调用表达式的结果就是函数返回值。
看一个函数返回值,就是看return后面的值,没有return则为None。
def func1(m, n):
print(m, n)
# 将100作为函数func1的返回值
return 100 # return - 关键字 100 - 返回值
def func2(m, n):
return m + n
def func3(m, n):
return # 相当于return None;将None作为返回值
print() # 执行不到
func2(1, 2) # 3,需要被接收或直接使用
print(func1(1, 2)) # None 即返回值
返回值作用:就是将函数内产生的数据传递出来,防止在函数调用完成后被销毁。
什么时候使用返回值:如果实现函数功能后需要获取产生的数据则需要返回。
- 2.同时返回多个值
python中支持返回多个值,实质是以元组形式返回。元组的功能它都有。
return 返回值1,返回值2,返回值3...
# 求多个数的和以及平均值
def func7(*args):
# sum1 = 0
# for item in args:
# sum1 += item
sum1 = sum(args)
aver = sum1/len(args)
return sum1, aver
sum1, aver = func7(1, 2, 3, 4, 5) # 常用
print('和为%d,平均值为%.2f' % (sum1, aver)) # 和为15,平均值为3.00
print('和为%d,平均值为%.2f' % func7(1, 2, 3, 4, 5)) # 和为15,平均值为3.00
9.4 返回值的应用
返回值能做的事情,函数调用表达式都可以做。
#1.用函数调用表达式给变量赋值
def func1():
return 'hello'
str1 = func1()
# 2.通过函数调用表达式使用相应的方法。
def func2():
return [1, 2, 3]
item1 = func2()[0] # 1
item2 = func1()[0] # h
item3 = func2().append(3) # None,获取的是append函数的返回值
list1 = func2()
list1.append(3)
print(list1) # [1, 2, 3]
# 3.将函数调用表达式作为容器的元素,函数的参数,函数的返回值
def func3():
return 100
def func4(x):
print(x)
# 作为函数实参
func4(func3()) # 100
re = func4(func3()) # 返回None之前要打印一次func3()
print(re)
# 作为列表元素
# 作为字典的key和value
# 作为函数返回值
9.5 匿名函数
匿名函数还是函数,除了声明语法以外,函数其他语法匿名函数都支持。
- 匿名函数声明
语法:
函数名(变量名) = lambda 参数列表:返回值
说明:
函数名 - 变量名
lambda - 关键字
参数列表 - 和普通函数参数列表作用和要求是一样的,但此处至少要1个参数
返回值 - 相当于普通函数return关键字后面的表达式。
注意:匿名函数中冒号后的语句属于函数体。在声明时不会执行
匿名函数调用和普通函数一模一样。
# 匿名函数求两数和
my_sum = lambda x, y: x + y
print(my_sum(1, 2))
print(my_sum(y=2, x=3)) # 5 关键字参数
# sort()函数定制
# 写一个函数,求两数中最大值
my_max = lambda x, y: max(x, y)
print(my_max(1, 2)) # 2
- 补充:python中的3目运算符
c语言: 条件语句?值1:值2 - 条件语句为True则整个表达式结果为值1,反之。
python中三目: 值1 if 条件语句 else 值2 - 条件语句为True则整个表达式结果为值1,反之。
x, y = 10, 20
max1 = 10 if x > y else y
print(max1)
# 写一个匿名函数,获取字典中指定key对应的值
dict1 = {'a': 1}
my_get_value = lambda key, dict2: dict2.get(key)
print(my_get_value('a', dict1))
网友评论