Python中使用def关键字来声明函数,声明函数的格式为:

python 一行 语句 python一行函数_python

有3个需要注意的地方:函数名后面必须加冒号

如果函数体和def不在同一行,则必须缩进

return指定函数返回值,用来结束函数但return语句是可有可无的,如果不给return,则等价于加上了return None,即函数默认返回None结构

如果函数体body语句只有一行,或者可以简写为一行,则可以写在def的同行。例如:

python 一行 语句 python一行函数_代码块_02

函数声明好之后,就可以执行函数,执行函数也称为调用函数,方式为func_name(args),例如:

python 一行 语句 python一行函数_代码块_03

函数中往往会包含一个return或多个return语句,它可以出现在函数中的任意位置处,它用来结束函数的执行,并返回给定的值。例如:

python 一行 语句 python一行函数_python函数结构_04

关于函数参数

函数的参数其实也是变量,只不过这些变量是独属于函数的本地变量,函数外部无法访问。在函数调用的时候,会将给定的值传递给函数的参数,这实际上是变量赋值的过程。

python 一行 语句 python一行函数_python函数结构_05

def首先声明好函数,然后到了myfunc(1,2,3)时,表示调用函数(执行函数),调用函数时会将给定的值1,2,3传递给函数的参数x,y,z,其实就是变量赋值x=1,y=2,z=3,然后使用print输出它们。

由于python是动态语言,无需先声明变量,也无需指定变量的类型,所以python的函数参数和返回值非常的灵活。任何类型的变量或数据结构都可以传递给参数,这实际上是变量赋值的过程。例如:

python 一行 语句 python一行函数_代码块_06

上面几个函数调用语句中,赋值给参数的值可以是数值类型,可以是字符串类型,可以是列表类型,也可以是其它任何数据类型。

函数声明、调用的过程详述

def用来声明一个函数,python的函数包括函数名称、参数、函数体、函数体中涉及到的变量、返回值。

实际上,函数名称其实是一个变量名,def表示将保存在某块内存区域中的函数代码体赋值给函数名变量。例如:

python 一行 语句 python一行函数_python_07

上面表示将函数体赋值给变量名myfunc。如下图:

python 一行 语句 python一行函数_python 一行 语句_08

既然是变量,就可以进行输出:

python 一行 语句 python一行函数_代码块_09

输出结果:

python 一行 语句 python一行函数_python 一行 语句_10

由于python是解释型语言,所以必须先定义函数,才能调用函数。

如果导入一个模块文件,导入的时候会解释、执行文件中的代码,包括def语句,也就是说,导入文件时会先声明好函数。

函数变量的细节

请一定理解本节内容,也许细节方面可能会有些不准确,但对于深入理解函数来说(不仅限于python语言),是非常有帮助的,特别是理解作用域规则的时候。

python是解释性语言,读一行解释一行,解释一行忘记一行。而函数是一种代码块,代码块是一个解释单元,是一个整体。在代码块范围内不会忘记读取过的行,也不会读一行就立即解释一行,而是读取完所有代码块内的行,然后统筹安排地进行解释。关于这一点,在后面的文章代码块详述中有非常详细的解释,建议一读。

当python读取到def所在行的时候,知道这是一个函数声明语句,它有一个属于自己的代码块范围,于是会读完整个代码块,然后解释这个代码块。在这个解释过程中,会记录好变量以及该变量的所属作用域(是全局范围内的变量还是函数的本地变量),但一定注意,def声明函数的过程中不会进行变量的赋值(参数默认值除外,见下文),只有在函数调用的时候才会进行变量赋值。换句话说,在def声明函数的过程中,在函数被调用之前,函数所记录的变量一直都是变量的地址,或者通俗一点理解为记录变量的名称,而不会进行变量的赋值替换。

实际上,变量的明确的值会当作常量被记录起来。如a=10的10被作为常量,而变量a赋值给变量b时b=a,a显然不会作为常量。

如下函数:

python 一行 语句 python一行函数_赋值_11

输出结果为:"3 5 6 10"。

上面的函数涉及到了4个变量:a、b、c、x。其中:全局变量x

本地变量a、b、c,其中本地变量a和b是函数的参数

在def的过程中,会完完整整地记录好这些变量以及所属作用域,但只会记录,不会进行变量的赋值。如下图:

python 一行 语句 python一行函数_python函数结构_12

然后函数被调用,这时候才会开始根据记录的作用域搜索变量是否存在,是否已经赋值(非本地变量),并对需要赋值的变量赋值:查找全局变量变量x,它在全局作用域内已经赋值过了,所以只需找到这个全局变量即可

查找本地变量a、b、c,它们是属于函数myfunc的本地变量,而a和b是参数变量,所以最先对它们进行赋值a=5,b=6,然后赋值普通的本地变量c=10

如图:

python 一行 语句 python一行函数_赋值_13

最后执行print(x,a,b,c)输出这些变量的值。

还需注意,python是读一行解释一行的,在函数调用过程中,因为c=10在print()的前面,所以是先赋值c=10,再执行print,如果print在c=10前面,则先执行print,再赋值,这显然是错误的,因为print()中使用了变量c,但目前还没有对其赋值。这和其它语言可能有些不同(特别是编译型语言),它们可能会无视变量赋值以及变量使用的位置前后关系。

如果上面的示例中,函数myfunc调用之前,将变量x赋值为另一个值:

python 一行 语句 python一行函数_python_14

这时将输出:"33 5 6 10"。因为x是全局变量,只有在函数调用的时候才会去找到变量x对应的值,而这时全局变量的值已经是33。