函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。

函数的简介

  当我们在重复使用某一功能时,我们可能会写很多重复的代码,例如我们求圆的周长,当圆的直径改变时,是不是我们又要重新写一遍计算过程呢?如果涉及到很复杂的过程,而下次使用仅仅改变参数,那么我们还有必要重复这一过程吗?

这时我们可以利用函数来解决这一问题。一个功能就像黑盒一样,我们不需要知道它是怎么工作的,我们只要知道接口(输入,输出)即可使用。

函数的特征

  • 名称
  • 参数(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 关键字

当内部作用域想修改外部作用域的变量时,就要用到 globalnonlocal 关键字了。当修改的变量是在全局作用域(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/