python里函数定义的理解

来源:互联网 发布:海王星炒股软件下载 编辑:程序博客网 时间:2024/06/05 00:25
在python里函数定义,与C语言或Java语言的函数定义是不一样的,C语言是定义了一个入口地址,但python语言是定义了一个对象,是一个函数对象。因为函数定义语句是一个执行语句,当python解释器遇到def开头时,就会解析执行def定义的这一行命令,而不是等到调用时才执行,更不像C语言里当调用时才会执行函数定义。python它会在函数定义时就开始把函数名称、局部命名空间,局部命名空间就包含了参数和默认参数,把这些都解释了并生成一个函数对象,以备后面调用。但在这时,并没有执行函数体的,函数体是当调用时才执行。


[decorators] “def” funcname “(” [parameter_list] “)” [“->” expression] “:” suite
意思就是说这段:
[decorators] “def” funcname “(” [parameter_list] “)” [“->” expression]
是在定义阶段是执行的,而这段:
suite
是调用阶段执行。


但在C语言里,不会存在这种情况,它们都是一起在调用时执行的。这样我们就得注意手册里这样一句话了:
Default parameter values are evaluated from left to right when the function definition is executed.
默认参数都是从左到右依次计算,并且是在函数定义时计算的。



这就意味着函数的默认参数只会被执行一次,在调用时不再会计算默认参数,定义时预先计算好的值会在后面每一次调用时都会被使用。特别默认参数是列表或字典对象时,当在函数体里修改这些对象,默认参数只是一个列表,它会被多次修改,往往还不是设计人员所需要的结果。

为了加深理解,研究一下下面的例子:

#def extendList(val, lst = []):    lst.append(val)    return lstlist1 = extendList(5)list2 = extendList(123, [])list3 = extendList('abc')print(list1, list2, list3)
结果输出怎么样:

[5, 'abc'] [123] [5, 'abc']
你会比较奇怪为什么list1和list3返回一样的内容,其实就是函数定义理解不当造成的。

要想每一次调用使用不同列表,可以修改为如下:

#def extendList(val, lst = None):    if lst == None:        lst = []    lst.append(val)    return lstlist1 = extendList(5)list2 = extendList(123, [])list3 = extendList('abc')print(list1, list2, list3)
输出结果如下:

[5] [123] ['abc']

Python游戏开发入门

http://edu.csdn.net/course/detail/5690

你也能动手修改C编译器

http://edu.csdn.net/course/detail/5582

纸牌游戏开发

http://edu.csdn.net/course/detail/5538 

五子棋游戏开发

http://edu.csdn.net/course/detail/5487
RPG游戏从入门到精通
http://edu.csdn.net/course/detail/5246
WiX安装工具的使用
http://edu.csdn.net/course/detail/5207
俄罗斯方块游戏开发
http://edu.csdn.net/course/detail/5110
boost库入门基础
http://edu.csdn.net/course/detail/5029
Arduino入门基础
http://edu.csdn.net/course/detail/4931
Unity5.x游戏基础入门
http://edu.csdn.net/course/detail/4810
TensorFlow API攻略
http://edu.csdn.net/course/detail/4495
TensorFlow入门基本教程
http://edu.csdn.net/course/detail/4369
C++标准模板库从入门到精通 
http://edu.csdn.net/course/detail/3324
跟老菜鸟学C++
http://edu.csdn.net/course/detail/2901
跟老菜鸟学python
http://edu.csdn.net/course/detail/2592
在VC2015里学会使用tinyxml库
http://edu.csdn.net/course/detail/2590
在Windows下SVN的版本管理与实战 
http://edu.csdn.net/course/detail/2579
Visual Studio 2015开发C++程序的基本使用 
http://edu.csdn.net/course/detail/2570
在VC2015里使用protobuf协议
http://edu.csdn.net/course/detail/2582
在VC2015里学会使用MySQL数据库
http://edu.csdn.net/course/detail/2672