Python学习笔记:函数

1. 函数定义

使用def 函数名(参数):语句定义函数,在缩进块中编写函数体,返回值用return语句返回,如果没有return语句,返回值为None,等价于return 。
根据需要,return语句也可以返回多个值组成的tuple,可以不写(),多个值之间用’,’隔开,调用函数时可以用多个变量接受返回值,多个变量按位置赋值。

def my_abs(x):
	#isinstance()检查参数类型
	if not isinstance(x, (int, float)):
		raise TypeError('bad operand type')
	if x >= 0:
		return x
	else:
		return -x

pass语句可以用做占位符,表示什么都不做,可用来定义一个空函数。在没想好具体语句的时候,可以用pass语句使代码先运行起来。

#定义空函数
def my_abs(x):
	pass
#放入判断语句或者循环语句之中	
if x >= 0:
	pass

2.函数返回值

函数的return 语句只能返回一个值,可以是任何类型。
因此,我们可以“返回一个 tuple类型,来间接达到返回多个值 ”。

例: x 除以 y 的余数与商的函数

def F1(x, y):    
	a = x % y    
	b = (x-a) / y    
	return ( a,b )     # 也可以写作 return a, b
	
(c, d )= F1(9, 4)        # 也可以写作 c , d = F1 ( 9, 4 )

print c ,d
结果显示: 1, 2

3.函数输入参数

形参与实参

parameter 是指函数定义中的参数,而 argument 指的是函数调用时的实际参数。
简略描述:parameter = 形参(formal parameter), argument = 实参(actual parameter)。

固定数量参数

def greet(say, msg):
	print(say, msg)

>>>greet('Hello', 'Python')
Hello Python

默认参数

定义函数时,可以使用赋值运算符(=)为参数指定一个默认值。
注意: 如果参数没有默认值,在调用时必需为其指定一个值;如果参数有默认值,那么在调用时值是可选的,如果为其提供了一个值,将会覆盖默认值。

def greet(say, msg = 'Python'):
	print(say, msg)

>>>greet('Hello', 'World') #给出可选参数
Hello World
>>>greet('Hello') #只提供强制性的参数
Hello Python

函数中的所有参数都可以有默认值,但是,一旦存在一个默认参数,其右侧的所有参数也必须有默认值。也就是说,非默认参数不能在默认参数之后

关键字参数

当使用某些值调用函数时,这些值将根据其位置分配给参数。
Python 允许使用 kwarg = value 格式的关键字参数调用函数:

def greet(say, msg = 'Python'):
	print(say, msg)

>>>greet(say = 'Hello', msg = 'World') #2个关键字参数
Hello World
>>>greet(msg = 'World', say = 'Hello') #2个关键字参数(次序颠倒)
Hello World
>>>greet('Hello', msg = 'World') #位置参数和关键字参数混合使用
Hello World

这种方式调用时,关键字参数必须放置在位置参数之后,
所有传递的关键字参数都必须与函数接受的某个参数匹配,并且他们的次序不重要

>>>greet(msg = 'World''Hello') #关键字参数在位置参数之前
...
SyntaxError: positional argument follows keyword argument

>>>greet('Hello', na = 'World') #关键字参数na不匹配
...
TypeError: greet() got an unexpected keyword argument 'na'

可变参数

可变参数也被称为不定长参数,顾名思义,就是传入的参数个数是可变的,可以是任意个(0、1、2 … N)。
要定义可变参数,仅需在参数名之前添加一个星号(*)。在函数内部,这些参数被包装为一个 tuple
注意:这里的*,不要误认为是C/C++中的指针

def greet(*args):
	print(args)

>>>greet('a','b','c')
(a,b,c)
>>>greet() # 返回空元组
()

有时,必须在函数定义中使用位置参数以及可变参数,但位置参数始终必须在可变参数之前。

def greet(say, *args):
	print(say, args)

>>>greet('Hi','a','b','c')
Hi,(a,b,c)
>>>greet(Hi)
Hi,()

通常情况下,可变参数会出现在形参列表的最后,因为它们会把传递给函数的所有剩余输入参数都收集起来。可变参数之后出现的任何形参都是“强制关键字”参数,这意味着,它们只能被用作关键字参数,而不能是位置参数。

def greet(*args, sep = ','):
	return sep.join(args)

>>>greet('a','b','c')
'a,b,c'
>>>greet('a','b','c',sep = '/') #被用作关键字参数
'a/b/c'
>>>greet('a','b','c','/') #被用作位置参数
'a,b,c,/'

任意关键字参数

还有一种机制,用于任意数量的关键字参数。为了做到这一点,使用双星号(**):

def greet(**kwargs):
	print(kwargs)

>>>greet() #没有参数,返回空字典
{}
>>>greet(name = 'Ray', age = 18)
{'name':'Ray','age':18}

当最后一个形式为 **msgs 的形参出现时,它将收到一个字典,其中包含所有关键字参数,除了与形参对应的关键字参数之外。还可以与 *names 的形参相结合(*names 必须出现在 **msgs 之前)。

对参数进行解包

正如“可变参数”那样,也可在函数调用中使用 * 操作符。只不过在这种情况下,与在函数定义中 * 的语义相反,参数将被解包而不是打包。

def greet(name,age):
	print(name,age)

>>>t = ('Ray', 18)
>>>greet(*t)
Ray 18

同样地,字典也可以用 ** 操作符传递关键字参数:

def greet(name,age = 32):
	print(name,age)

>>>d = {'name':'Ray', 'age':18}
>>>greet(**d)
Ray 18

猜你喜欢

转载自blog.csdn.net/m0_43426705/article/details/83140886