11.23函数

本文详细介绍了Python函数的定义、参数传递、返回值、可变参数、关键字参数、全局与局部变量以及递归函数的概念和使用。通过实例分析了不同参数类型的行为,特别是对于可变对象如列表的修改影响。同时,总结了如何利用*和**操作符进行位置和关键字参数的灵活传递。最后,讨论了全局变量和局部变量的区别,以及递归函数在解决问题中的应用。
摘要由CSDN通过智能技术生成

目录

函数的定义及函数的参数调用

函数参数传递的内存分析

函数的返回值

个数可变的位置形参和关键字形参

函数的传参的总结

全局变量和局部变量

递归函数


函数的定义及函数的参数调用

def calc(a,b):
    return a+b
print(calc(1,2))

实参和形参与C语言相同

1.位置传参:

def calc(a,b):
    return a+b
print(calc(1,2))

 2.关键字传参

def calc(a,b):
    return a+b
print(calc(a=2,b=1))

注意函数参数的默认值

def calc(a,b=10):
    return a+b
print(calc(1))
print(calc(1,2))
#11
#3

 如果调用函数时,不传入默认值,则函数将按照内置的默认值进行计算

如果调用函数时,传入默认值,则函数以传入的默认值为主

函数参数传递的内存分析

先分析示例

def fun(arg1,arg2):
    print(arg1)
    print(arg2)
    arg1 = 100
    arg2.append(10)
    print(arg1)
    print(arg2)
n1 = 10
n2 = [1,2,3,4]
print(n1)
print(n2)
fun(n1,n2)
print(n1)
print(n2)
"""10
[1, 2, 3, 4]
10
[1, 2, 3, 4]
100
[1, 2, 3, 4, 10]
10
[1, 2, 3, 4, 10]"""

我们可以发现在无返回值的函数内,改变形参的值,不会影响实参

而对于列表n2,fun函数进行的增删改操作后,列表内的值发生改变。 

所以我们可以得出结论:

在函数调用的过程中,进行参数传递  如果实参是不可变对象(字符串,元组),在函数体的修改不会影响实参的值。 如果实参是可变对象(列表,字典,集合),在函数体的修改(增/删/改/替换操作)会影响实参的值。

函数的返回值

def fun(num):
    odd = []
    even = []
    for i in range(0,num+1):
        if i%2:
            odd.append(i)
        else:
            even.append(i)
    return odd,even
print(fun(10))
#([1, 3, 5, 7, 9], [0, 2, 4, 6, 8, 10])

我们可以看见,当函数返回值为多个时,函数的返回值类型为元组

个数可变的位置形参和关键字形参

1.个数可变的位置形参

def fun(*args):#函数定义时,可变的位置参数
    print(args)
    print(args[0])
fun(10)
fun(20,30)
#返回值是元组
'''(10,)
10
(20, 30)
20'''

有多个返回值,则返回类型为元组

2.个数可变的关键字形参

def fun(**args):#函数定义时,可变的位置参数
    print(args)
    print(args['a'])
fun(a=10)
fun(a=20,b=30)

有多个返回值,则返回类型为字典

注意:如果函数参数有上述两种类型的传参,则位置形参需要放在前面

函数的传参的总结

1.将列表中所有的元素转换为位置形参,只需在列表前加*

#将序列中所有的元素转换为位置形参
def fun1(a,b,c):
    print('a=',a)
    print('b=',b)
    print('c=',c)
lst = [10,20,30]
#fun1(lst)报错,因为只传入了一个参数
fun1(*lst)

2.将字典中所有的元素转换为形参,只需要在字典前加**

def fun1(a,b,c):
    print('a=',a)
    print('b=',b)
    print('c=',c)
dic = {'a':111,'b':333,'c':332}
#fun1(dic)报错
fun1(**dic)

全局变量和局部变量

在函数内定义的变量为局部变量,global 变量名,可以将其改变为全局变量

def fun(name):
    global  age
    age = 20
    print(name)
    print(age)
fun('hehe')
#hehe
#20
#print(age)NameError: name 'age' is not defined
#因为age为局部变量
print(age)

递归函数

def fac(n):
    if n == 1:
        return 1
    else:
        return n * fac(n - 1)
print(fac(3))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值