4. Python中的函数和做用域

Python中的函数和做用域

1. 函数

1.1 函数的简介

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

这时咱们能够利用函数来解决这一问题。一个功能就像黑盒同样,咱们不须要知道它是怎么工做的,咱们只要知道接口(输入,输出)便可使用。编程

例如Python的内置函数print咱们只要知道它须要咱们提供哪些参数,以及它会给咱们怎样的输出便可。这就是所谓的抽象,咱们不知道工做原理,但也能使用它。因此咱们能够写一个函数(黑盒),设置直径为输入,周长为输出,当函数写好后,咱们只要输入直径便可,不用考虑函数内部是如何计算的,咱们获得输出后,继续作咱们想作的事情。ide

当咱们想作一道菜时,有人负责洗菜,有人切菜,有人炒菜,将这些人的工做合在一块儿,就完成了作菜这个任务,这就是分解的思想,咱们将这个任务当作是函数,许多函数在一块儿完成了一件比较大的事情。函数

能够简单理解一块可重复使用的代码,咱们称之为函数(function),当咱们调用函数时,这个函数才会执行。网站

1.2 函数的特征

  • 名称
  • 参数 (0 或 多个)
  • 有docstring (可选,可是建议有,注释的意思)
  • 函数体
  • 返回一些值

如下是定义一个函数简单的例子,注意函数内要有四个空格的缩进,若是没有返回值的话,会默认返回None:spa

#def是用来定义函数的关键字
#is_even是函数的名称
#i是参数(参数能够是任何类型)
#三个引号括起来的是docstring
#docstring下面的语句是函数体
#return后的是返回值
def is_even( i ):
    """
    Input: i是一个正的int类型
    Returns True 若是 i 是偶数, 不然返回 False
    """
    print("inside is_even")
    return i%2 == 0
#调用函数,并用a接收返回值
a = is_even(2)
print(a)

2. 做用域

2.1 形参和实参

首先咱们先不涉及编程。高中的函数y = f(x),这个x就至关因而形参,指一种抽象,将咱们用f(3)的时候,这个3就是实参了,就是实际咱们使用的值,形参和实参大体就是这个意思,不要搞混了。例如:code

def f( x ):#x是形参
    x = x + 1
    print('in f(x): x =', x)
    return x
#如下是调用函数
x = 3#初始化x
z = f( x )#调用函数,传入实参,将返回值给z

2.2 函数做用域

利用pythontutor网站对代码的执行进行可视化,我把全部步骤都截了下来,先看图,右侧反映了变量的变化状况。blog

图片描述
图片描述
图片描述
图片描述
图片描述
图片描述
图片描述
图片描述
图片描述

能够看到函数内是一个做用域,外面是访问不到的(通常状况)。当进入一个函数时,一个新的做用域就被建立了。函数内的x和外面的x不是一个xx是不可变量,这和以后的list等数据类型不同,以后再说。接口

  • 函数里能够访问外面的变量
  • 函数里不能够修改外部定义的变量

如下是是几个例子,若是有不清楚,能够进入 www.pythontutor.com(我推荐的代码可视化网站)中尝试运行。图片

第一个例子,在外边定义了一个x,可是在f内又定义了一个x,这两个x不是一个x,函数内部使用的x是函数内部定义的。

def f(y):
    x = 1
    x += 1
    print(x)
x = 5
f(x)
print(x)

第二个例子,在g中使用的x是外部定义的x

def g(y):
    print(x)
    print(x + 1)
x = 5
g(x)
print(x)

第三个例子,会报错,不能在内部修改外部的值,UnboundLocalError: local variable 'x' referenced before assignment

def h(y):
    x += 1
x = 5
h(x)
print(x)

3. 参考

参考了Mit 6.0001的课件

相关文章
相关标签/搜索