当咱们在重复使用某一功能时,咱们可能会写不少重复的代码,例如咱们求圆的周长,当圆的直径改变时,是否是咱们又要从新写一遍计算过程呢?若是涉及到很复杂的过程,而下次使用仅仅改变参数,那么咱们还有必要重复这一过程吗?python
这时咱们能够利用函数来解决这一问题。一个功能就像黑盒同样,咱们不须要知道它是怎么工做的,咱们只要知道接口(输入,输出)便可使用。编程
例如Python
的内置函数print
咱们只要知道它须要咱们提供哪些参数,以及它会给咱们怎样的输出便可。这就是所谓的抽象
,咱们不知道工做原理,但也能使用它。因此咱们能够写一个函数(黑盒),设置直径为输入,周长为输出,当函数写好后,咱们只要输入直径便可,不用考虑函数内部是如何计算的,咱们获得输出后,继续作咱们想作的事情。ide
当咱们想作一道菜时,有人负责洗菜,有人切菜,有人炒菜,将这些人的工做合在一块儿,就完成了作菜这个任务,这就是分解
的思想,咱们将这个任务当作是函数,许多函数在一块儿完成了一件比较大的事情。函数
能够简单理解一块可重复使用的代码,咱们称之为函数(function)
,当咱们调用函数时,这个函数才会执行。网站
如下是定义一个函数简单的例子,注意函数内要有四个空格的缩进,若是没有返回值的话,会默认返回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)
首先咱们先不涉及编程。高中的函数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
利用pythontutor
网站对代码的执行进行可视化,我把全部步骤都截了下来,先看图,右侧反映了变量的变化状况。blog
能够看到函数内是一个做用域,外面是访问不到的(通常状况)。当进入一个函数时,一个新的做用域就被建立了。函数内的x
和外面的x
不是一个x
,x
是不可变量,这和以后的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)
参考了Mit 6.0001的课件