从定义开始
众所周知,函数是可以重用的程序段,它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块。
python的函数是用def关键字来定义,主要包括:函数名、函数参数、函数体、函数返回值。
#!/usr/bin/env python def foo(): return 1 print foo()
以上例子的运行结果为:
该例子中,函数名为foo, 我们通过foo()来调用该函数,打印返回值1
函数Scope
python函数运行的时候,会创建自己的scope,即作用域(或者说函数有自己的namespace,即命名空间)。执行函数时,如果在函数体中遇到了变量名,python首先会在该函数的namespace内寻找该变量。
python有一些内置函数,可以让我们来查看函数的namespaces,下面看一个例子,可以查看函数的local 和global 作用域。
#!/usr/bin/env python a_string = "This is a global variable" def foo(): print "locals:" print locals() print "globals:" print globals() # doctest: +ELLIPSIS foo() # 2
执行结果:
{'foo': <function foo at 0x19c100c8>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': './2.py', 'a_string': 'This is a global variable', '__name__': '__main__', '__package__': None, '__doc__': None}
locals:
{}
可以看到,内建函数globals返回的是一个dict,里面是全局性的一些变量(注意:我们定义的a_string也在里面,a_string是在函数外定义的)。代码里的#2处,调用了foo函数,里面的locals函数返回的是函数自己的namespace(foo中没有定义任何变量,所以是空的)
变量分辨规则
在函数内部也可以访问global变量。python的作用域规则是:
1. 变量在创建时,local作用域中默认创建的是local变量
2. 在local作用域(scope)中访问变量时,首先在local作用域中寻找变量,然后在所有外围作用域中寻找变量。
3. 在local作用域中修改变量时,默认是在local作用域寻找该变量,如果找不到,则新建一个变量。除非声明要修改的是global变量。
下面的例子是在foo函数里打印global变量。
#!/usr/bin/env python a_string = "This is a global variable" def foo(): print locals() print a_string #1 foo()
执行结果:
This is a global variable
在foo函数里,先打印了locals,是空的。然后在#1处,打印a_string这个变量。这时候发生以下事情:
1. python先在locals里面寻找,locals是空的,所以找不到。
2.python在globals里面寻找,可以找到a_string,然后获得值,打印。
再看一个例子:
#!/usr/bin/env python a_string = "This is a global variable" def foo(): a_string = "test" #1 print locals() print a_string #2 def foo1(): global a_string #4 a_string = "Oh. global variable has been changed in foo1." #5 foo() print a_string #3 print "---------------------" foo1() print a_string#6
执行结果为:
test
This is a global variable
---------------------
Oh. global variable has been changed in foo1.
上面的代码中,有以下几个要点:
1. #1是要给a_string赋值(即修改变量值),先在locals中寻找a_tring, 没有找到,则新创建local变量。所以打印locals时,结果为:{'a_string': 'test'} 。
2. #2处打印时,按照我们之前说的变量分辨规则, 先从locals中寻找a_tring变量,在#1处有定义,所以直接打印
3.#3处不在任何函数中,位于全局作用域,所以直接查找globals,找到了a_string,打印。
4.#4处声明了一个全局变量(a_string之前已经声明,这里表示在local作用域中使用全局a_string)
#5处修改a_string, 因为#4中声明了a_string是全局的,所以修改a_string之后,#6处打印的是修改后的值
变量生存周期
#!/usr/bin/env python def foo(): x = 1 foo() print x # 1
执行结果:
File "./5.py", line 6, in <module>
print x # 1
NameError: name 'x' is not defined
变量都是有生存周期(lifetime)的,变量的生存周期与变量声明时的作用域息息相关。其作用域销毁时,变量也就销毁了。
上面的例子主要有以下要点:
1. x是在foo函数内定义的,在foo的locals中存在,因此,其作用域是foo函数的作用域。
也就是说:foo运行时,locals创建,x位于locals中,结束后,foo的locals被销毁,x不在了。
2. #1处打印x,#1位于全局作用域,因此,其在globals中寻找x,没有找到,所以会报错。
函数参数与参量
函数的参数与参量也可称为函数的形参和实参(形参和实参的概念可以咨询查找学习)
Python中,函数运行时,其参数和参量实际上会成为local变量,存在于locals中。如下例子:
#!/usr/bin/env python def foo(x): print locals() foo(1)
结果为:
可以看到,形参x和运行时foo(1)的实参1都成了foo运行时的local变量
python有许多种定义函数形参和实参的方法,这里我就不具体说了,请参照:
https://docs.python.org/2/tutorial/controlflow.html#more-on-defining-functions
下面我再贴一个例子:
#!/usr/bin/env python def foo(x, y=0): # 1 return x - y print foo(3, 1) # 2 print foo(3) # 3 print foo(y=1, x=3) # 4 print foo() # 5
运行结果:
3
2
Traceback (most recent call last):
File "./7.py", line 12, in <module>
print foo() # 5
TypeError: foo() takes at least 1 argument (0 given)
可以看到#1处定义了x和y两个参数,y给了默认值0.
在函数调用中,#2,#3,#4都是没有问题的,只有#5报错了。也就是说:
1. 定义函数参数时,如果没有给某参数设定默认值,则在调用函数时,必须给该参数设定值。
2. 如果给某参数设定了默认值,则调用函数时,可以给该参数赋值,也可以忽略。
函数基础大概介绍到这里,关于嵌套函数、闭包等知识,我在另一个博文中介绍:
相关推荐
设计名称 Python函数 授课课时 1.0 学情分析 学生知识经验基础 已经掌握Python程序编码软件基本的操作技能和基础语法。 已学习Python语句的三种逻辑结构:顺序、条件分支、循环,可以进一步提高编程技能,学习函数...
python函数实验报告
python3.7⼊门教程-python3.7函数基础⼊门 ⼀、函数 从开始接触python就接触了函数。 例如 input()函数⽤于获取⽤户键盘输⼊、print()函数⽤于输出结果、range()函数⽤于⽣成整数序列、len()函数⽤于获取序列的长度...
python中factor函数_Python基础教程 6.4.5 参数收集的逆过程 假设有如下函数: def add(x,y): return x+y ⽐如说有个包含由两个相加的数字组成的元组: params = (1,2) 使⽤*运算符对参数进⾏"分配",不过是在调⽤⽽...
本文档为Python常用基础函数,包含77中基础函数,可用于Python开发参考使用
python函数基础定义 主要讲了python函数的基础定义,菜鸟一枚函数学的不太好,有兴趣的可以探讨下
本文首先介绍了Python中表示和计算三角函数的基础知识,以math模块为例 illustrate 了代码实现方法。在此基础上,讨论了三角函数计算的优化策略,如利用数学库的性能优势、使用泰勒级数近似等方法,分析了优化策略的原理...
最近一直在看python 的document ,打算在基础方面重点看一下。罗列一下了基础的内置函数,分类可能不准确,一起交流学习
在Python中,函数的参数有四种: 必需参数 关键字参数 默认参数 不定长参数 必需参数是在函数调用时,须以正确的顺序传入,且调用时的数量必须和声明时的一样参数。 实例:定义一个printme函数,并定义一个必需参数...
python用函数实现模块化程序设计
python中的real函数_RealPython基础教程:Python字符串⽤ 法详解 字符串是⼀个由字符数据组成的序列。字符串处理是编程必备的技能,很少有应⽤程序不需要操作字符串的。 Python 提供了丰富的运算符、函数和类⽅法来...
python 函数的使用-python基础,python函数的使用说明,有python2的参考代码 函数的基本组成 函数是重用的程序段。 一块语句一个名称,可以在程序的任何地方使 用这个名称任意多次地运行这个语句块。 这被称为 调用 ...
python函数基础知识.
python函数大全.pdf
Python基础教程:常⽤函数整理 ⼀,把字符串形式的list转换为list 使⽤ast模块中的literal_eval函数来实现,把字符串形式的list转换为Python的基础类型list from ast import literal_eval str_list = "[1838, 13735,...
*Numba项⽬能够将处理NumPy数组的Python函数JIT编译为机器码执⾏,从⽽上百倍的提⾼程序的运算速度。 *Pandas经过⼏个版本周期的迭代,⽬前已经成为数据整理、处理、分析的不⼆选择。 *OpenCV官⽅的扩展库cv2已经...
实验二Python语言基础函数包练习.docx
递归函数的定义 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 递归函数的特点 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但...
python中cos函数怎么⽤_Pythoncos()函数使⽤⽅法⼊门教 程基础教程 Python cos() 函数 描述 cos() 返回x的弧度的余弦值。 语法 以下是 cos() ⽅法的语法: import math math.cos(x) 注意:cos()是不能直接访问的,...
《Python程序设计基础教程》 共分为16章,主要内容包括:Python简介、Python环境搭建、函数、模块、⽂件操作、字符串与正则表达式、⾯向对象编程、异常处 理、Python基本概念、Python控制结构、Python多线程与多进程...