函数基础
def语句
def语句是一个可执行的语句,将创建一个函数对象并将其赋值给一个变量名:
def name(arg1, arg2, ... ... argn):
statements
def语句可以出现在任意语句可以出现的地方,甚至是嵌套在其他的语句中,例如:
if test:
def func():
...
else:
def func():
...
...
func()
函数参数
传递参数
- 不可变参数通过值进行传递 (看起来像是)—— 像整数和字符串这样的对象是通过对象引用而不是拷贝进行传递的,但是因为你无论怎样都不可能在原处改变不可变对象,实际的效果就很想创建了一份拷贝
- 可变对象是通过“指针”进行传递的 (引用)—— 可变对象能够在函数内部进行原处的改变
参数匹配
匹配模型/语法:
语法 | 位置 | 解释 |
func(value) | 调用者 | 常规参数:通过位置进行匹配 |
func(name=value) | 调用者 | 关键字参数:通过变量名匹配 |
func(*sequence) | 调用者 | 以name传递所有的对象,并作为独立的基于位置的参数 |
func(**dict) | 调用者 | 以name成对的传递所有的关键字/值,并作为独立的关键字参数 |
def func(name) | 函数 | 常规参数:通过位置或变量名进行匹配 |
def func(name=value) | 函数 | 默认参数值,如果没有在调用中传递的话 |
def func(*name) | 函数 | 匹配并收集元组中所有包含位置的参数 |
def func(**name) | 函数 | 匹配并收集字典中所有包含位置的参数 |
def func(*args, name) | 函数 | 参数必须在调用中按照关键字传递 |
def func(*, name=value) | 函数 |
如果使用混合特定的参数匹配模型,python会遵循下面的有关顺序的法则:
- 在函数调用中,参数必须依次顺序出现:任何位置参数,后面跟着任何关键字参数,和*sequence形式的组合,后面跟着**dict形式
- 在函数头部,参数必须以此顺序出现:任何一般参数,紧跟着任何默认参数,如果有的话,后面是*name的形式,后面跟着任何name或name=value keyword-only,后面跟着**name形式
常用函数即应用
callable()函数
检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
注意:类是可调用的,而类的实例实现了__call__()方法才可调用。
版本:该函数在python2.x版本中都可用。但是在python3.0版本中被移除,而在python3.2以后版本中被重新添加。
>>> callable(0)
False
>>> callable("mystring")
False
>>> def add(a, b):
… return a + b
…
>>> callable(add)
True
>>> class A:
… def method(self):
… return 0
…
>>> callable(A)
True
>>> a = A()
>>> callable(a)
False
>>> class B:
… def __call__(self):
… return 0
…
>>> callable(B)
True
>>> b = B()
>>> callable(b)
True
map / reduce函数
map/reduce教程
匿名函数 - lambda表达式
匿名函数教程