Python学习笔记(五)
函数
定义
Python的函数由函数头和函数体构成,结构如下:
def function_name(parameters):
"""docstring"""
statement(s)
return
Python函数定义必须以def
关键词开始,def
标志着函数头部的开始,函数名称(function_name
)是函数头的一部分,它的命名要符合前面讲述的标识符命名规则;函数名称后跟随着一对小括号,括号里面是函数的参数(parameters
),参数是可选的,括号后面紧跟着一个冒号(:),标志着函数头的结束和函数体的开始。
文档描述(docstring
)是函数体中可选的部分,如果出现,必须出现在函数体的第一行。文档描述以连续的三个单(双)引号开始,也以连续的三个单(双)引号结束,这样可以在多行显示,呈现更多的内容。
statement(s)
是函数体语句块,格式必须符合代码缩进的层级要求。
另外还有函数返回语句(return
),它是可选的,其作用是返回一个数据给调用者。如果return
后没有参数或一个函数体根本就没有return
语句,则相当于返回None
。
函数调用
函数定义并不会执行函数体;只有当函数被调用时才会执行此操作。
def wdnmd():
"""
就是打印一段文字
"""
print("狠狠的测试")
if(__name__ == "__main__"):
print("这段文字出来说明我先执行")
wdnmd()
参数传递
传参一直是非常重要的内容,在Python语言的数据类型有不可变类型和可变类型两种,因此参数也分可变类型和不可变类型。像数值类型、字节串类型、元组类型等都属于不可变类型,不可变类型变量的特点是被重新赋值后会在内存中生成一个新的对象,原有变量不变。而像列表类型、字典类型等都属于可变类型,即变量在被重新赋值后,本身指向的内存地址并没有变动,只是其内部数据被修改了。
Python对不可变类型参数的传递采用“值传递(pass by value)”方式。当函数被调用时,系统会为形式参数分配独立的内存空间,并用实际参数值初始化对应的形式参数,这样就把实际参数的值传递给了形式参数。在值传递方式中,实际参数和形式参数各自占有自己的内存空间,参数只能由实际参数向形式参数传递,不论被调函数对形式参数内容作何修改,对相应的实际参数都没有影响。
Python对可变类型参数的传递采用“地址传递(pass by address)”方式。当函数被调用时,系统不会为形参分配新的空间,只是把实参的内存地址传给被调函数。这样如果在函数内对形参内容做了修改,会影响到实参。
例子:
def change( var ):
"""
修改值
"""
var = 2
if(__name__ == "__main__"):
var = 1
change(var)
print(var)
输出仍是1,这是候如果查看编译器提示,则可以发现
这也提示我们参数未被修改,如果我就想在函数内修改不可变类型参数怎么办呢?我们可以将变量定义为全局变量或者使用引用传递