这是菜鸟学python的第22篇原创文章 阅读本文大概需要5分钟 前面讲了函数里面的作用域,今天我们来讲python函数的参数传递,参数传递用法非常灵活(同时也混淆弄错),我们来剖析一下Python里面的参数传递长什么样子,以及为啥长成这个样子,到底有什么奥妙在里面 语言是相同的,相信有其他编程语言功力的同学比如java,c++,perl这些函数里面也有类似的设计.Python里面对函数参数传递分以下几种:
1)任意多个非关键字可变长参数(元组) 2)任意多个关键字变量参数(字典) 有同学说怎么这么麻烦啊,这跟我们生活中的很多产品类似,比如相机的傻瓜模式和专家模式,汽车里面的自动档和手动挡,大同小异python有这么多参数的传递方式,其实主要了为了软件设计的灵活和功能的扩展. 我先从最简单的开始介绍: 1.位置参数 python中最普通的函数使用是这种带位置参数的函数,这跟我们其他语言的普通的函数是一样的,所有参数在传递的时候按照位置来传递,列如: 把'Hi Python'赋给message,2赋给times 2.默认参数 一般我们调用函数的时候都会传入值,但是懒人有的时候,希望我输入了值就用我的,我懒的时候不输入了python也能给我一个默认值,这就用到了默认参数的特性,看个例子吧: def printMessage(message,times=2): print (message*times) printMessage('Hi Python:')#没有输入times的值 >>Hi Python:Hi Python: 看我们很懒,没有输入times的值,python就会自动用times的默认值2,是不是很爽
3.关键字参数 在调用函数的时候,我们希望传递的参数不是僵硬的通过位置来传递,能够有一定的灵活性,能通过变量名进行匹配. 接着说难点的:关于任意数量参数 先看一个打印分数的函数,这个函数设计的比较死板,看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
4.任意多个位置参数的函数 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会自动把*操作符后面的形参变成元组传给函数. 5.任意多个关键字形式的参数 python有两种方式声明可变参数,我们接着说第二种:如何能接受任意数量的关键字参数,是用**双星号操作符来表示 其实就是把**后面的变量参数,按照字典来处理,传递给函数. 综合例子: 好最后拿一个综合例子结尾:(包含了关键字参数,默认参数,可变任意数量参数) 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 好了函数里的参数传递就讲到这里啦,希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流. |
|
来自: Four兄 > 《Python笔记》