Python_形式参数_实际参数_栈图

一,形参与实参

形参和实参实际上是传值方式的区别,

实际参数就是调用函数时候传给他的那个参数;而形式参数可以理解为函数内部定义用的参数。

在函数里面,实际参数会被赋值给形式参数,如下就是一个使用单个实际参数的函数定义:

>>> def print_twice(bruce):

...     print(bruce)

...     print(bruce)

...

>>> 

这个函数把传来的实际参数的值赋给了一个名字叫做bruce的形式参数。当函数被调用的时,就会打印出形式参数的值两次,无论形式参数是什么内容,即任何能打印的值都适用于这个函数。

>>> print_twice('World')

World

World

>>> print_twice(66)

66

66

>>> print_twice(math.pi)

3.141592653589793

3.141592653589793

适用于Python内置函数的组合规则对自定义的函数也是适用的,所以我们可以把表达式作为实际参数:

>>> print_twice('World' * 4)

WorldWorldWorldWorld

WorldWorldWorldWorld

>>> print_twice(math.cos(math.pi))

-1.0

-1.0

实际参数在函数被调用之前要先被运算一下,所以上面例子中作为实际参数的两个表达式都是在print_twice函数调用之前仅计算了一次。当然,也可以用变量做实际参数:

>>> love = 'give me one kiss'

>>> print_twice(love)

give me one kiss

give me one kiss

上例传递给函数的这个实际参数是一个变量,这个变量名love和函数内部的形式参数bruce没有任何关系。

在程序主体内部,参数传过去就行了,参数名字对于函数内部没有作用;比如在这个print_twice函数里面,任何传来的值,在这个print_twice函数体内,都被叫做 bruce。

二,函数内部变量和形参的局部性

在函数内部建立一个变量,这个变量是仅在函数体内部才存在。例如:

>>> def cat_twice(part1, part2):

...     cat = part1 + part2

...     print_twice(cat)

... 

>>>

这个函数得到两个实参,把它们连接起来,然后调用print_twice函数来输出结果两次。

>>> part1 = 'I am part1'

>>> part2 = 'I am part2'

>>> cat_twice(part1,part2)

I am part1I am part2

I am part1I am part2

当cat_twice运行完毕了,这个名字叫做cat的变量就销毁了。再尝试着打印它一下,就会得到提示该变量没有定义:

>>> print(cat)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'cat' is not defined

由此可以看出,函数内部的变量是局部性的。其实,形式参数也是局部起作用的。

例如上面实例中的函数print_twice(bruce),在这个函数之外,是不存在bruce这个变量的。

三,栈图

要追踪一个变量能在哪些位置使用,咱们就可以画个图表来实现,这种图表叫做栈图。

栈图和状态图有些相似,也会表征每个变量的值,不同的是栈图还会标识出每个变量所属的函数。

 

>>> def cat_twice(part1, part2):

...     cat = part1 + part2

...     print_twice(cat)

... 

>>> part1 = 'I am part1'

>>> part2 = 'I am part2'

>>> cat_twice(part1,part2)

I am part1I am part2

I am part1I am part2

一个栈中的这些框也表示了函数调用的关系。在上面这个例子中,printtwice被cattwice调用了两次,而cattwice被_main_这个函数调用。

__main_这个函数很特殊,属于最外层框架,也被叫做主函数。当你在所有函数之外建立一个变量的时候,这个变量就属于主函数所有。

每个形式参数都保存了所对应的实际参数的值。因此part1的值和line1一样,part2的值就和 line2一样,同理可知bruce的值就和cat一样了。

如果函数调用的时候出错了,Python会打印出这个出错函数的名字,调用这个出错函数的函数名,以及是谁调用了这个出错函数,其对应的函数名也会被打印出来,一直追溯到主函数。 

例如,如果你想在print_twice这个函数中读取cat的值,就会得到一个变量名没有定义的错误:

>>> print_twice(cat)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'cat' is not defined

结束。

原文地址:https://www.cnblogs.com/liusingbon/p/13027566.html