函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。
函数的简介
当我们在重复使用某一功能时,我们可能会写很多重复的代码,例如我们求圆的周长,当圆的直径改变时,是不是我们又要重新写一遍计算过程呢?如果涉及到很复杂的过程,而下次使用仅仅改变参数,那么我们还有必要重复这一过程吗?
这时我们可以利用函数来解决这一问题。一个功能就像黑盒一样,我们不需要知道它是怎么工作的,我们只要知道接口(输入,输出)即可使用。
函数的特征
- 名称
- 参数(0 或 多个)
- 有 docstring(可选,但是建议有,注释的意思)
- 函数体
- 返回一些值
以下是定义一个函数简单的例子,注意函数内要有四个空格的缩进,如果函数没有返回值的话,会默认返回 None
:
def is_even(i): """ Input: i 是一个正的 int 类型 如果 i 是偶数, 则返回 True, 否则返回 False """ print("inside is_even") return i%2 == 0 # 调用函数,并用 变量a 接收返回值 a = is_even(2) print(a)
函数的参数
-
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
-
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
def add(x, y): # 形参 res = x + y return res r = add(2, 3) # 实参 print(r)
局部变量和全局变量
-
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
-
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
-
当全局变量与局部变量同名时,在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
name = 'SCOTT' def print_name(): print("my name is %s" %(name)) print_name() my name is SCOTT
name = 'SCOTT' def print_name(): name = 'Bruce' print("my name is %s" %(name)) print_name() my name is Bruce
前向引用之函数即变量
def action(): print("In the action") logger() action() NameError: name 'logger' is not defined
def logger(): print("In the logger") def action(): print("In the action") logger() action() In the action In the logger
def action(): print("In the action") logger() def logger(): print("In the logger") action() In the action In the logger
函数的作用域
python 中的作用域分 4 种情况:
- L:local,局部作用域,即函数中定义的变量;
- E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
- G:globa,全局变量,就是模块级别定义的变量;
- B:built-in,系统固定模块里面的变量,比如int, bytearray等。
搜索变量的优先级顺序依次是:作用域局部 > 外层作用域 > 当前模块中的全局 > python内置作用域,也就是LEGB。
global 关键字
当内部作用域想修改外部作用域的变量时,就要用到 global
和 nonlocal
关键字了。当修改的变量是在全局作用域(global
作用域)上时,就要使用 global
先声明一下:
count = 10 def counter(): global count # 必须先声明 count 为全局变量 print(count) count = 100 print(count) counter() 10 100
nonlocal 关键字
global
关键字声明的变量必须在全局作用域上,不能在嵌套作用域上,当要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量时就需要使用 nonlocal
关键字了。
def outer(): count = 10 def inner(): nonlocal count # 此时 count 非全局变量,不能用 global 声明,需要用到 nonlocal 关键字 print(count) count = 20 print(count) inner() print(count) outer() 10 20 20
参考文档
https://www.cnblogs.com/linhaifeng/articles/6113086.html
原创文章,转载请注明出处:http://www.opcoder.cn/article/33/