• 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

    结束。

  • 相关阅读:
    block iOS 块
    面试有感
    Could not automatically select an Xcode project. Specify one in your Podfile like so
    xcrun: error: active developer path
    NSDictionary
    CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解
    转:CSS盒模型
    转:手机端html5触屏事件(touch事件)
    转: div:给div加滚动条 div的滚动条设置
    转:什么时候用阻止事件冒泡
  • 原文地址:https://www.cnblogs.com/liusingbon/p/13027566.html
Copyright © 2020-2023  润新知