Python函数的参数

函数的参数:

先来安利一下:定义函数的时候,我们把参数的名字和位置确定下来,函数的接口就定义完了。
			对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数返回什么样的值就够了,
			函数内部的复杂逻辑被封装起来,调用者无需了解。

	Python的函数定义非常简单,但是却非常灵活。除了正常定义的必选参数外,还可以使用默认参数,
		可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化
		调用者的代码。

	只要函数执行到return 函数就会停止执行
	# 1. 每个函数如果在函数中不写return, 默认返回None
	# 2. 我们也可以只写一个return, 也是返回None, 停止函数的执行
	# 3. return 一个返回值.  你在调用方能接受到一个返回值
	# 4. return 多个返回值. 多个值需要用,隔开   接收的位置. 接收的是元组.
	# 函数return返回多个值以元祖(tuple)存储 	

1.位置参数
	def fun(a):
		return a+a	
	print(fun(3))#6
	对于fun(a)函数,参数a就是一个位置参数。
	当我们调用fun函数时,必须传入有且仅有的一个参数x

	def fun(x,n)
		x = x **n
		return x
	print(fun(2,4))#16
	x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次付给参数x和n

2.默认参数
	def fun(x,n=2):
		x = x **n
		return x
	print(fun(2))#4
	print(fun(2,4))#16
	默认参数可以简化函数的调用。设置默认参数时,需注意:
		1)必选参数在前,默认参数在后,否则python解释器会报错
		2)如何设置默认参数:当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。
			变化小的参数就可以作为默认参数。
	使用默认参数有什么好处呢:最大的好处就是能够降低调用函数的难度。

	注意:默认参数的一个坑
			例子:
				def add(l=[]):
					l.append('a')
					return  l
				#正常调用时,结果正常
				print(add([1, 2, 3]))#[1, 2, 3, 'a']
				print(add([5, 4, 3]))#[5, 4, 3, 'a']
				#当使用默认参数调用时,一开始结果还正确,可是再此调用就不对了
				print(add())#['a']
				print(add())#['a', 'a']

				原因解释:
					Python函数在定义的时候,默认参数l的值就被计算出来了,即[],因为默认场参数l也是一个变量,
                    他指向对象[],每次调用函数,如果改变了l的内容,则下次调用时,默认参数的内容就变了,不再
                    是函数定义时的[]了。

				注:定义默认参数要记牢一点:默认参数必须指向不变对象。

				解决上述问题:
					def add(L=None):
						if L is None:
							L=[]
						L.append('a')
						return L

3.可变参数

	def fun(*n):
	    sum = 0
	    for i in n:
	        sum += i
	    return sum
	print(fun(1,2,3))#6
	lis = [1,2,3]
	print(fun(*lis))#6
	tu = (1,2,3)
	print(fun(*tu))#6

	注意:由于参数不确定,所以我们就传入一个可变参数*n,Python允许你在list或tuple前面加一个*号,
        把list或tuple的元素变成可变参数传进去。

4.关键字参数

		可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
        而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

		def person(name, age, **kw):
    		print('name:', name, 'age:', age, 'other:', kw)
    	person('Michael', 3)#name: Michael age: 3 other: {}
    	person('A', 4, g='M', j='E')#name: A age: 4 other: {'g': 'M', 'j': 'E'}

    	关键字参数有什么用?:它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,
            但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄
            是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。

 5.命名关键字参数:
 		<1>
    	对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。
    	def person(name, age, **kw):
    		print('name:', name, 'age:', age, 'other:', kw)
    	person('JackChen', 20, city='shanghai', addr='shanxi', zipcode=123)

    	<2>
    	如果要限制关键字参数的名字,就可以用命名关键字参数.
    	例如,只接收city和job作为关键字参数。这种方式定义的函数如下:
    	def person(name, age, *, city, job):
    		print(name, age, city, job)
    	#和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,
    	#*后面的参数被视为命名关键字参数。
    	person('Jack', 20, city='Beijing', job='Engineer')#Jack 20 Beijing Engineer

    	<3>
    	如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符
    	*了:
    	def person(name, age, *args, city, job):
    		print(name, age, args, city, job)

    	#命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错.
		person('Jack', 20, 'Beijing', 'Engineer')
		#Traceback (most recent call last):
		# File "<stdin>", line 1, in <module>
		#TypeError: person() takes 2 positional arguments but 4 were given
		由于调用时缺少参数名city和job,Python解释器把这4个参数均视为位置参数,
		但person()函数仅接受2个位置参数。

		<4>
		命名关键字参数可以有缺省值,从而简化调用:
		def person(name, age, *, city='Beijing', job):
    		print(name, age, city, job)
    	person('Jack', 20, job='Engineer')#Jack 20 Beijing Engineer

    	注意:使用命名关键字参数时,要特别注意,如果没有可变参数,
    		 就必须加一个*作为特殊分隔符。如果缺少*,
    		 Python解释器将无法识别位置参数和命名关键字参数



参数组合:
		在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,
            这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:
            必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

		对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

 

posted @ 2018-02-12 16:01  小学弟-  阅读(197)  评论(0编辑  收藏  举报