从定义开始
众所周知,函数是可以重用的程序段,它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块。
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编程语言中,`factor`函数通常是指...这些知识点构成了Python编程的基础,理解并掌握它们对于编写高效的Python代码至关重要。在实际编程中,合理运用这些概念可以帮助解决各种问题,比如数据处理、算法实现等。
通过一系列的任务,旨在帮助学习者掌握Python函数的核心概念和实际应用。 1. **函数的定义与使用**: - 在Python中,函数是通过`def`关键字定义的,例如`def isPrime(v)`。函数通常包含一个主体部分,用于执行特定...
本教学设计针对Python函数这一核心概念,旨在帮助学生在已有的Python基础知识上,进一步提升编程技能。学生应已掌握了Python的基础语法和三种逻辑结构:顺序、条件分支和循环。然而,他们在逻辑思维和基础知识的扎实...
《Python函数式编程(第2版)》是一本面向Python开发者深入探讨函数式编程的书籍。函数式编程是一种编程范式,它强调使用函数作为基本的构建块,以减少副作用和状态变化,从而提高代码的可读性和可维护性。Python虽...
Python 语言基础函数包练习 本文档主要介绍 Python 语言基础函数包的使用,包括 math、NumPy、SciPy 和 Matplotlib 等函数包的应用。实验目的在于熟练掌握 Python 语言基础函数包的使用,并通过实践 exercise,提高...
云函数是一种无服务器计算服务,允许开发者运行代码而无需管理底层基础设施。通过Python编写云函数,我们可以轻松实现网易云每日签到和升级打卡功能。下面,我们将详细介绍Python在云函数部署中的应用以及在网易云上...
Python中函数的应用非常广泛,前面章节中我们已经接触过多个函数,比如 input() 、print()、range()、len() 函数等等,这些都是 Python 的内置函数,可以直接使用。 除了可以直接使用的内置函数外,Python 还支持...
通过这些基础操作,你已经掌握了Python中使用Matplotlib绘制函数图像的基本方法。随着对库的深入学习,你可以实现更多高级功能,如自定义颜色映射、添加图例、设置坐标轴限制、以及创建3D图形等。在实际项目中,结合...
本教程将深入探讨Python 3.7中的函数基础。 一、函数的基本概念 在Python中,函数是通过`def`关键字定义的。当我们开始学习Python时,我们会接触到内置函数,例如`input()`用于获取用户输入,`print()`用于输出结果...
Python函数是Python编程语言的核心元素之一,用于组织代码并使其可重用。它们是执行特定任务的代码块,可以通过调用其名称来执行。在Python中,函数的定义使用关键字`def`,后跟函数名和圆括号,其中可能包含参数。...
在Python编程语言中,内置函数是不需要导入任何模块就可以直接使用的函数,它们由Python解释器提供,为常见操作提供方便。Python 3.6版本中的内置函数非常丰富,涵盖了数据类型转换、逻辑判断、数学运算、迭代器处理...
python用函数实现模块化程序设计
以上就是Python3中关于函数的知识点概览,涵盖了从基础到高级的使用方式。在实际编程中,理解并熟练运用这些概念可以提高代码的可读性和效率。通过练习文件`day2-python3函数练习.ipynb`和`day2-课后作业答案.ipynb`...
python函数基础的概括
本文研究的是一种基于抽象语法树(Abstract Syntax Tree, AST)的Python函数调用路径静态提取方法。该方法利用Python的AST作为分析基础,解析并提取函数调用关系,构建函数调用关系模型,然后生成Python程序的函数...
本示例探讨的是如何使用C++调用Python函数,并从Python返回数据到C++。这个过程通常涉及到Python的C API或者第三方库如`boost::python`。 首先,我们需要理解C++调用Python函数的基本流程: 1. **初始化Python解释...
2. **新类型注解** - Python3.5在PEP 484的基础上进一步完善了类型注解系统,允许在函数定义中添加类型提示,提高了代码的可读性和静态分析工具的效率。 3. **新字典方法** - `dict`类型在3.5中增加了`get`方法的多...
Python函数与模块 面向对象编程在Python中的应用 Python异常处理与调试 Python文件操作与系统编程 Python网络编程基础 Python高级特性:装饰器与迭代器 Python数据库操作:SQLAlchemy Python与Web开发:Flask框架 ...
以下是一些基本的Python函数及其用法: 1. **`literal_eval()` 函数**: 来自 `ast` 模块的 `literal_eval()` 可将字符串形式的数据转换为相应的Python数据类型。例如,当你有一个存储在字符串变量 `str_list` 中...