functions-函数

python  functions

	函数分类:
		内建函数   max() reversed()
		库函数     math.ceil()

	定义:
		def 函数名 (参数列表):
			
			函数体(代码块)
			
			[return 返回值]

		1) 函数名就是标识符,命名要求一样
		2) 语句块必须缩进,约定4个空格
		3) 若没有return语句,隐式会返回一个None
		4) 定义中的参数列表,形参

	调用:
		调用时写的参数是实际参数,实实在在传入的值,实参

	callable() 是否可调用 True/False

	函数参数:

		位置参数:
			def f(x,y,z) 调用使用f(1,3,5)
			按照顺序传入实参
		关键字参数:
			def f(x,y,z) 调用使用f(x=1,y=3,z=5)
			使用形参的名字,传入实参的方式,顺序可以改变

		f(y=5,z=6,2) #位置参数必须在关键字参数之前传入。

	参数默认值:
		def add(x = 4, y = 5):
			return x+y
	调用:
-----------------------------------------------------------------
add(6,10): 6+10 = 16

add(6, y=7): 6+7 = 13

add(x=5): 5+5 = 10

add() :  4+5 = 9

add(y = 7): 4+7 = 11

add(x = 5, 6) #Error (positional argument follows keyword argument:位置参数遵循关键字参数)  位置参数必须在关键字参数之前传入 

add(y = 8, 4) #Error (positional argument follows keyword argument:位置参数遵循关键字参数)  位置参数必须在关键字参数之前传入

add(x = 5, y = 6) 5+6 = 11

add(y = 6, x = 5) 5+5 = 10
-----------------------------------------------------------------
	作用:
		参数的默认值在未传入足够的实参时,对没有给定的参数赋值默认值
		参数多,不需要用户每次都输入所有的参数,简化调用
	例:
		定义一个函数login,参数名为:host 、 port 、 username 、 password
		
			def login(host = '127.0.0.1', port='80', username='test', password='test'):
			
				print('{}:{}@{}/{}'.format(host, port, username, password))
			
		1)login()
			127.0.0.1:80@test/test  默认 主机名:端口@用户名/密码
		2)login('127.0.0.1',80,'tom','tom')
			127.0.0.1:80@tom/tom  位置参数传入
		3)login('127.0.0.1',username='root')
			127.0.0.1:80@root/test 指定一个位置参数和关键字参数
		4)login(port=80, password='test',host='www')
			www:80@test/test		使用关键字参数传入,没有传入的使用默认值
	可变参数:
	1)位置可变
		def add(*nums):
			sum = 0
			for x in nums:
				sum+=x
			return sum

		传入一个可迭代对象

		add([1,3,5])   12
		add((1,3,5))   12

		一个形参可以匹配任意个实参

		在形参前使用* 表示该形参是可变参数,可以接收多个实参
		生成一个tuple

	2)关键字可变
		def showconfig(**kwargs):
			for k,v in kwargs.items():
				print('{}={}'.format(k,v))

		showconfig(host='localhost', port='80', username='test', password='test')
		----------------------------

			password=test
			host=localhost
			username=test
			port=80
		----------------------------

		形参前使用**,表示可接收多个关键字参数
		生成一个dict

	3)可变参数的混合使用:
		1.	def showconfig(username,password,**kwargs)
				for k ,v in kwargs.items():
					print('{}={}'.format(k,v))
			>>>showconfig('test','test')
			>>>test
			>>>test
			>>>showconfig('test','test',x=1,y=2)
			>>>test
			>>>test
			>>>x=1
			>>>y=2
		2. def showconfig(username,*args,**kwargs):
        		print(username)
         		print(args)
			    for k, v in kwargs.items():
			           print('{}={}'.format(k,v))
			>>>showconfig('test','test','zzz',x=2)
			>>>test
			>>>('test','zzz')
			>>>x=2
-----------------------------------------------------------------------------------
上例中,*args和*kwargs是可变参数,*args表示多个无名参数(位置参数),它是一个tuple;
**kwargs表示关键字参数,它是一个dict。同时使用*args和**kwargs时,必须将*args写在
**kwargs前面,否则会出错
def showconfig (username,**kwargs,*args)
这是错误的。这样调用 提示语法错误:
SyntaxError: non-keyword arg after keyword arg
-----------------------------------------------------------------------------------
	可变参数分为:位置可变参数和关键字可变参数
	位置可变参数要在形参前加*
	关键字可变参数要在形参前加**
	位置可变参数生成的是tuple,关键字可变参数生成的是dict
	位置可变参数要放在关键字可变参数前


	keyword-only 参数

		如果在一个星号参数后,或者一个位置可变参数后,出现的普通参数变成了keyword-only参数

		keyword-only 后常跟默认值

		def fn(*args,x):
			print(x)
			print(args)

		fn(3,5)  args已经截断了所有的位置参数,如果x不使用关键字参数就拿不到实参 所以这里error
		>>>can't assign to function call  不能分配函数调用
		fn(3,6,x=1) 
		>>>1
		>>>3,6

		def fn(**kwargs,x)  kwargs截断所有的关键字参数,x永远也获取不到值

	keyword-only 第二种形式:
		def fn(*,x,y):
			print(x,y)

		fn(x=1,y=2)
		>>>1 2
	*后面,形参都变成了keyword-only参数 必须指定关键字传参


	可变参数和参数默认值:
	1.
		def fn(*args,x=5):
			print(x)
			print(args)

		fn()
		>>> 5
		>>> ()
		
		fn(6)
		>>>5
		>>>(6,)
		
		fn(x=9)
		>>>9
		>>>()
		
		fn(1,2,5,x=10)
		>>>10
		>>>(1,2,3)

		不指定关键字参数,x使用默认值 位置参数就赋值args
	2.
		def fn(y,*args,x=5):
			print('x={},y={}'.format(x,y))
			print(args)

		fn()
		>>>missing 1 required positional argument: 'y'  缺少y参数传值

		fn(6)
		>>> x=5,y=6
		>>>()

		fn(x=6)
		>>>missing 1 required positional argument: 'y'  缺少y参数传值

		fn(1,2,3,x=10)
		>>>x=10,y=1
		>>>(2,3)

		fn(y=10,2,3,x=10)
		>>>positional argument follows keyword argument 位置参数要放在关键字参数前面

		fn(1,2,y=3,x=10)
		>>>fn() got multiple values for argument 'y'  y被赋值2次

	3.
		def fn(x=5,*kwargs):
			print('x={}'.format(x))
			print(kwargs)

		fn()
		>>>x=5
		>>>{}

		fn(6)
		>>>x = 6
		>>>{}

		fn(x=9)
		>>>x=9
		>>>{}

		fn(y=3,x=10)
		>>>x=10
		>>>{'y':3}

		fn(3,y=10)
		>>>x=3
		>>>{'y':10}

	函数参数一般顺序:
		普通参数 -> 缺省参数 -> 可变位置参数 -> keyword-only参数(可带缺省值) -> 可变关键字参数

		def fn(x, y, z=3, *args, m=4, n, **kwargs)

		x,y 普通参数
		z=3  缺省参数
		*args 可变位置参数
		m,n  keyword-only参数
		**kwargs 可变关键字参数



	

  

posted @ 2017-10-10 17:03  zzzzz~  阅读(378)  评论(0编辑  收藏  举报