Python基础之函数

最简单的函数

def testfunc1():
    pass

这是一个最简单的函数,没有参数,没有返回,pass表示该函数没有做任何操作,testfunc1是函数名,def是关键字,表示这是一个函数

调用函数

调用函数时给出函数并给函数传递相应的参数,对于命名关键字参数需要给出参数名,位置参数若给出参数名,则不用考虑参数名的顺序

函数的返回

函数以关键字return表示函数的返回,返回的值可以被一个变量接收。返回可以是0到多个任何类型的值,若返回没有值返回为None。
return可以表示函数的结束。

def testfunc2(a,b):
    return a+b
# 函数有返回值,可以用一个变量接受返回的值
c = testfunc2(1,2)
print(c)
# 函数可以返回多个值
def testfunc3(a,b):
    return a,b
d = testfunc3(1,2)

函数的参数

1、位置参数

  • 位置参数要求与调用函数时传入的参数相匹配,函数定义时有几个参数,就要传入几个参数,即不能多也不能少。
  • 传入参数的顺序与参数列表的顺序相同,但是可以用[参数名=参数值]的方式传递参数,这时,函数会通过参数名进行相互的对应,即使参数顺序不与参数列表中的顺序相同也不会报错
# 1、位置参数,位置参数要求与调用函数时传入的参数相匹配,函数定义时有几个参数,
# 就要传入几个参数,即不能多也不能少。
def testfunc4(a,b):
    print(a*a)
    print(b+b)
testfunc4(2,1)
# 传入参数的顺序与参数列表的顺序相同,但是可以用[参数名=参数值]的方式传递参数,
# 这时,函数会通过参数名进行相互的对应,即使参数顺序不与参数列表中的顺序相同也
# 不会报错
testfunc4(b=2,a=2)

2、默认参数

默认参数是在函数定义时,给参数一个默认值,如果在调用函数时,没有传入这个参数,函数会以定义时给出的值进行处理

def testfunc5(a,b=2):
    print(a*b)
testfunc5(2,3) # 返回6
testfunc5(2) # 返回4

默认参数必须指向不变对象,因为Python函数在定义的时候,默认参数就会被计算出
来,默认值也是一个对象,默认参数指向这个对象,每次调用这个函数时,如果改变了这个默认参数的值,那么下次调用时,默认参数的内容就变了。
python中的不可变对象包括数值类型(int,float,布尔值),字符串,元组

def testfunc6(a,b=[]):
    b.append(a)
    print(b)

对上面的代码进行测试:

testfunc6(1)
# 运行结果为[1, 2]
testfunc6(2)
# 运行结果为[1, 2,3]
testfunc6(3)
# 运行结果为[5,4]
testfunc6(4,[5])
# 运行结果为[1, 2, 3, 6]
testfunc6(6)

产生这种结果的原因是,python代码在执行函数之前会将整个函数放到内存中,然后在内存中执行它,对于b这个默认参数,在内存中分配了一块地址保存了参数的默认值,在调用函数时,如果没有给它传值,则会使用默认的参数值,若是在函数中改变了这个值,则相应地址的值也会发生改变,下次再调用时如果不传值还会使用这个值,这就是为什么出现前三次结果的原因。如果再调用函数时,给默认参数传递了参数值,则该参数值自己拥有一个存储地址,对这个地址上的操作不会影响到参数的默认值。这就是出现第四个结果的原因如果继续调用上面的函数,而不给默认参数传入值,默认参数又会使用默认值,因为再前三次调用该函数时已经改变了默认值,所以新的结果会收到之前的影响。

3、可变参数

可变参数允许传入0到多个值,在参数名前加*号表示可变参数,可变参数会将传入的参数封装成一个不可变的元组,再对元组中的每一个数据进行操作。

def testfunc7(*args):
    print(args)
    for i in args:
        print(i**2)

testfunc7(1,2,3)

若是有了一个list或者tuple,想将整个list或者tuple当作参数传递给函数,可以在参数前加*号,表示将整个列表或元组当作参数传递给函数

list = [1,2,3]
testfunc7(*list)
tuple = (1,2,3)
testfunc7(*tuple)

4、关键字参数

关键字参数也是可变参数,允许传入0到多个参数,参数名前加**表示关键字参数,但是在传入参数时必须遵循key=value的格式,传入的键值对会被封装成一个字典

def testfunc8(**kwargs):
    print(kwargs)

testfunc8(a=1,b=2,c=3)

若已有一个字典想将字典中的键值对作为参数传递给函数,需要在参数前加**

dict={'a': 1, 'b': 2, 'c': 3}
testfunc8(**dict)

5、命名关键字参数

命名关键字参数限制了关键字参数的名字,和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数。给命名关键字参数传值的时候要以键值对的方式传值,一旦设置的命名关键字参数,就必须给其传值,当然,命名关键字参数也可以设置默认值下面代码中,a,b是位置参数,*分隔符,表示后面的参数是命名关键字参数,c,d即命名关键字参数

def testfunc9(a,b,*,c,d=0):
    print(a+b+c+d)

testfunc9(1,2,c=3)
testfunc9(1,2,c=3,d=4)

#如果命名关键字前有可变参数则不需要*分隔

def testfunc10(a,b,*args,c):
    k = 0
    for i in args:
        k = k+i
    print(a+b+k+c)

testfunc10(1,2,3,4,c=5)

不同类型的参数的优先级(在参数列表中的顺序)

必选参数(位置参数)-> 默认参数 -> 可变参数 -> 命名关键字参数 -> 关键字参数

def testfunc(a,b=0,*args,c,d=0,e,**kwargs):
    pass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值