一、定义与调用
定义:def func():
pass
调用:func()
调用时是往上边去找,如果没有找到,会报错NameError
你有听说过DRY吗?
DRY是程序员们公认的指导原则:Don't Repeat Yourself.
快快武装你的思维吧,拿起函数,不要再去重复拷贝一段代码了!
二、函数的参数
使函数可以个性化!
三、函数的返回值
只需使用return关键字
没有return时默认返回None
函数的参数
1、函数定义时用的是形参;调用时为实参
2、函数文档
给函数写文档,让人们更容易理解函数
func.__doc__打印出函数文档(特殊属性)
>>> def func():
... 'func doc'
... print('xxxx')
...
>>> func()
xxxx
>>> func.__doc__
'func doc'
help(func)
Help on function func in module __main__:
func()
func doc
print.__doc__能打印出print()函数的文档,但是是原样转义的反斜杠,不够漂亮,help()返回的漂亮
3、关键字参数
解决为止参数太多时,位置放不对的问题!
>>> def func(name, age):
... print(name + '->' + str(age))
...
>>> func(age=27, name='liyi')
liyi->27
4、默认值参数
默认值参数必须放在后边!
>>> def func(name='liyi', age):
... print(name + '->' + str(age))
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
5、收集参数(可变参数)
当不知道要传入到少参数时使用,只需要在关键字参数前加个*号,其实就是用元组打包起来给params而已
>>> def test(*params):
... print('the length is:', len(params))
... print('the second param is:', params[1])
...
>>> test(1, 'xiaoyi', 3, 'a')
the length is: 4
the second param is: xiaoyi
>>>
def test(*params, exp):
当使用test(1,2,3,4,5,'a')调用时会报错,因为所有参数会被params收集,exp得不到参数;可以test(1,2,3,4,5, exp='a')来解决;建议把收集参数后边的参数设计为默认的参数,如print()函数:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) #*value
四、例
1. 请问这个函数有多少个参数?
def MyFun((x, y), (a, b)):
return x * y - a * b
如果你回答两个,那么恭喜你错啦,答案是0,因为类似于这样的写法是错误的!
我们分析下,函数的参数需要的是变量,而这里你试图用“元祖”的形式来传递是不可行的。
我想你如果这么写,你应该是要表达这么个意思:
1. >>> def MyFun(x, y):
2. return x[0] * x[1] - y[0] * y[1]
3.
4. >>> MyFun((3, 4), (1, 2))
5. 10