分享

函数参数传递

 猪一样迷人 2019-12-14

Python里面对函数参数传递分以下几种:

  • 位置参数
  • 默认参数   #在函数运行前参数就被赋了值
  • 关键字参数  #通过变量名字进行匹配,而不是通过位置
  • 可变长度参数

1)任意多个非关键字可变长参数(元组)

2)任意多个关键字变量参数(字典)

有同学说怎么这么麻烦啊,这跟我们生活中的很多产品类似,比如相机的傻瓜模式和专家模式,汽车里面的自动档和手动挡,大同小异python有这么多参数的传递方式,其实主要了为了软件设计的灵活和功能的扩展。

我先从最简单的开始介绍:

1.位置参数

python中最普通的函数使用是这种带位置参数的函数,这跟我们其他语言的普通的函数是一样的,所有参数在传递的时候按照位置来传递,列如:

def printmessage(message,times):
print(message*times)

printmessage('hi python:',2) #把“hi python:”赋值给message,2赋值给times

>>># 打印结果
hi python:hi python:

2.默认参数

一般我们调用函数的时候都会传入值,但是有些人比较懒(比如我),希望输入了值就用我的,那么这个时候我就希望不输入,python也能给我一个默认值,这就用到了默认参数的特性,举个栗子,劈个叉吧:

def printMessage(message,times=2):
print (message*times)

printMessage('Hi Python:') #没有输入times的值
>> #打印结果
Hi Python:Hi Python:

看我们很懒,没有输入times的值,python就会自动用times的默认值2,是不是很爽,你可能以为这有啥了不起的,我一个一个输也行,但是你要考虑一些场景,比如你现在写一个函数,里面有十几个参数,其中有一些参数是固定的,那是不是可以用默认参数一次性搞定啦~

或者换个场景,在我们开发产品的时候,一个函数如果有很多参数,但是为了给用户比较好的体验和方便,我们给函数提供了一套默认的参数,这样对用户来说很爽。

当用户慢慢的对你的产品熟悉了,他希望自己调整参数,就可以直接去设参数,其实跟照相机里面的自动模式和手调模式一个道理。

3.关键字参数

在调用函数的时候,我们希望传递的参数不是僵硬的通过位置来传递,能够有一定的灵活性,能通过变量名进行匹配.

def func(a, b=10, c=20):
print('a is:',a, 'b is:',b, 'c is:',c)
func(3,7) #没有关键字就用默认的位置传递
>>>a is: 3 b is: 7 c is: 20

func(25,c=24) #可以跳过b,直接赋值给c
>>>a is: 25 b is: 10 c is: 24

func(c=50,a=100) # 用关键字特别爽,想怎么玩就怎么玩,只要你开心
>>>a is: 100 b is: 10 c is: 50

4、任意数量参数

任意数量参数是python关于函数参数传递较难的。

先看一个打印分数的函数,这个函数设计的比较死板,看python是如何解决的,然后引出我们的话题

def printScore(msg,values):
    if not values:
        print(msg)
    else:
        values_str=', '.join(str(x)for x in values)
        print ('{},{}'.format(msg,values_str))

printScore('My scores are',[100,90])
>>My scores are,100, 90

printScore('My scores are',[ ]) #那怕你不想输入分数,也必须输入一个空的列表
>>My scores are

大家仔细看这个函数,它是一个固定参数个数的函数,这个函数接受两个参数:一个message,一个values。

准确的说是必须要接受两个参数,这样就很死板,比如我只需要打印一个消息,但是调用的必须要和上面一样,哪怕你传入的是一个空列表。

这种写法既麻烦,又显的有点乱,有没有办法把第二个参数完全省略掉.。有的,python设计者(看下图,就是这哥们,以下链接是这个人的简介:https://zh./wiki/%E5%90%89%E5%A4%9A%C2%B7%E8%8C%83%E7%BD%97%E8%8B%8F%E5%A7%86设计了可变函数参数功能,也就是我们的第4种方式。

(1)python有两种方式声明可变参数,我们先说第一种:

在printScore函数中,我们做一小丢丢的改动,我们在参数values前面加*,变成(msg,*values),表示只有第一个参数的msg是调用者必须要指定的,该参数后面,可以跟任意数量的位置参数(主要是任意数量,当然包含懒人专用的省略不写啦)

def printScore(msg,*values):
if not values:
print (msg)
else:
values_str=', '.join(str(x)for x in values)
print ('{},{}'.format(msg,values_str))

printScore('My scores are')
>>My scores are

是不是很爽,刚才说任意数量,我们加多个参数试试看:

printScore('My scores are',100,90,80)
>>My scores are,100, 90, 80

一下把100,90,80都打印出来呢,是怎么做到的,是因为python会自动把*操作符后面的形参变成元组传给函数,是一个元组哦~

(2)我们接着说第二种:如何能接受任意数量的关键字参数,是用**双星号操作符来表示

def printlog(msg,**therest):
if not therest:
print(msg)
else:
for key,value in therest.items():
print('{},{} = {}'.format(msg,key,value))
printlog('log info',version = '1.0',platfrom = 'win')

>>>
log info,versions = 1.0
log info,platfrom = win

其实就是把**后面的变量参数,按照字典来处理,传递给函数.

综合例子:

好,最后拿一个综合例子结尾:(包含了关键字参数,默认参数,可变任意数量参数)

def total(initial=5,*numbers,**keywords):
count=initial
for number in numbers:
count =number

for key in keywords:
count =keywords.get(key)
return count

print total(10,1,2,3,apple=50,orange=100)
>>166

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多