Python函数就是一些语句的集合,这些语句对传入的参数进行处理,处理完成后返回相关结果。函数是代码重用的基本单位。
与其他编程语言一样,Python函数可以
- 最大化的代码重用和最小化代码冗余,一些重复代码,和需要重复执行的功能,都可以放在函数中,增加代码的复用性,让代码看上去简洁,不多余。
- 流程分解:在一些很长的代码中,可以将各个主要部分的逻辑写为函数,这样使得代码在整体上更具可读性,更有维护性。
编写函数
- def是可执行的代码。实际上,在if语句,while循环等复合语句中嵌套def都是合法的(甚至在某些场合还很有效),最常见的用法是,在一个模块文件中定义函数,在导入该模块时,函数自然而然就生成了。
- def创建了一个对象并将其赋值给某一个变量名。def创建了一个函数对象,并且将这个对象的引用赋值给函数名。函数对象也可以赋值给其它变量名,保存在列表中。
- lambda创建一个对象但将其作为结果返回。
- return将一个结果对象发送给调用者。
- yield向调用者发回一个结果对象,但是记住它离开的地方。函数也可以通过yield语句来返回值,并且记录下函数的状态让它挂起,方便后续能够恢复运行。
- global声明了一个模块级的变量并被赋值。一般默认情况下,函数内的变量只是函数内部使用,无法作用于函数外部。使用global语句时,变量就可以在整个文件模块中使用。
- nonlocal声明了将要赋值的一个封闭的函数变量。nonlocal语句允许一个内嵌的函数来赋值一条语法封闭的def语句的作用域中已经声明的变量。
- 函数参数是通过赋值(对象引用)进行传递的。函数的参数实际上是对象的引用。
- 参数、返回值以及变量并不是声明。在函数中,并没有对返回值和参数进行声明,事实上可以传递和返回任意类型的对象。
def语句
def语句的一般形式
def <name>(arg1,arg2,arg3....argN): #声明一个函数对象,并将其赋值给函数名<name>
<statements>
return <value> #一般都会有return语句,可以出现在函数体中的任何地方,用来结束函数体并返回值
函数执行return语句时,会返回到函数被调用的地方,继续往下执行。还有些情况下,函数并没有任何return语句,这时函数体按照正常的顺序执行语句,在结束执行时会返回默认的None对象,但这个值往往是被忽略掉的。
def语句是实时执行的,并没有像静态编译语言那样,有编译的流程。所以def语句可以出现在任何复合语句中。
if <test>: #这样可以根据不同的条件,定义不同的函数内容。
def func():
<statements>
else:
def func():
<statements>
函数只是一个对象,而函数名就像变量名一样,是函数对象的引用,可以将函数对象赋值给其它函数名:
def func():<statements>
f2=func
f2() #函数名f2调用函数名func所引用的函数对象
f2.attr=value #像对象一样,函数对象也可以添加属性以供随后使用
Python的多态
简单的说,依赖类型的行为称为多态,其含义就是一个操作的意义取决于被操作对象的类型。
实际上,python中每个操作都是多态操作:print,index,*操作符,还有很多。多态让python更具有简易性和灵活性。在Python中,代码不应该关心特定的数据类型。如果不是这样,那么代码将只对编写时你所关心的那些类型有效,对其它类型可能会不兼容,这样会打乱代码的灵活性。大体上来说,在Python中为对象编写接口,而不是数据类型。在编写函数时,不需要去考虑对象的类型,而是要考虑传入的参数是否支持函数中的一些操作(比如是否可迭代,是否支持成员测试,如果不支持函数会报错,这正是我们想要的)
>>> 12+21
33
>>> "learning"+"python"
'learningpython'
>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
>>>