Skip to content

Latest commit

 

History

History
386 lines (305 loc) · 12 KB

209-910578-画松树_draw_pine.sy.md

File metadata and controls

386 lines (305 loc) · 12 KB
show version enable_checker
step
1.0
true

画松树

回忆上次内容

  • time 是一个 module
    • import time 可以做 和时间相关的 事情
    • time.time()
      • 得到 当前时间戳
      • 也就是 Epoch
    • time.localtime()
      • local为本地
      • 得到 本地时间元组
    • time.asctime()
      • asc 为 ascii
      • 得到 时间日期字符串
  • 完整写法为
    • 三个函数层层嵌套
    • asc_time = time.asctime(time.localtime(time.time()))
  • 简略的写法为
    • asc_time = time.asctime()

图片描述

  • 可以自己定义层层嵌套的函数吗?

  • 都是层层嵌套调用

  • 一层层嵌套的

  • 这次我们来画一颗松树

松树

  • 松树可以分成两块
    • 树冠
    • 树干

图片描述

  • 那么我们来定义函数

分工细化

图片描述

  • 具体怎么画呢?

直接画

图片描述

图片描述

  • 可以出现
  • 但是有点像一个箭头

再定义一个新的函数

  • draw_pine_triangle专门画三角
def draw_pine():
    draw_pine_head()
    draw_pine_body()

def draw_pine_head():
    draw_pine_triangle()
    draw_pine_triangle()

def draw_pine_triangle():
    for i in range(6):
        for j in range(6-i):
            print(" ",end="",sep="")
        for k in range(2*i+1):
            print("*",end="",sep="")
        print()


def draw_pine_body():
    for i in range(5):
        for j in range(5):
            print(" ",end="",sep="")
        for k in range(3):
            print("*",end="",sep="")
        print()
    for i in range(6):
        for j in range(6-i):
            print(" ",end="",sep=",")

if __name__ == '__main__':
    draw_pine()

效果

  • 效果还可以

图片描述

  • 不过太固定了
  • 可以给一个数量参数
  • 来决定树的大小么?

代码改造

图片描述

加入参数

图片描述

图片描述

图片描述

调用流程

图片描述

  • 我们试着调试一下
  • step into draw_pine_triangle

调用堆栈

图片描述

  • 我们一步步step into进去之后
  • 看到一层层函数的调用
  • 压成的一个函数堆栈
  • 好像一层层下命令

下命令

  • 当然上面还有python来对draw_pine调用(call)

图片描述

大蒲扇

  • 函数调用就像一个大蒲扇

图片描述

  • 从主干开始
  • 有各种分支
  • 最终最主要的还是主干
  • 就像天津海河

海河

  • 天津号称
    • 九河下梢天津卫
    • 三道浮桥两道关

图片描述

  • 无数支流汇成九条河
    • 九条河汇成海河入海
    • 海河虽然很短
    • 起名字还得是海河水系
    • 他是汇总
    • 起关键作用
  • 就像大蒲扇的手柄
    • 从汇编如何理解?

从汇编角度理解呢

  1           0 LOAD_CONST               0 (<code object draw_pine at 0x7f9af2bcd2f0, file "pine.py", line 1>)
              2 LOAD_CONST               1 ('draw_pine')
              4 MAKE_FUNCTION            0
              6 STORE_NAME               0 (draw_pine)

  5           8 LOAD_CONST               2 (<code object draw_pine_head at 0x7f9af2bcd450, file "pine.py", line 5>)
             10 LOAD_CONST               3 ('draw_pine_head')
             12 MAKE_FUNCTION            0
             14 STORE_NAME               1 (draw_pine_head)

  9          16 LOAD_CONST               4 (<code object draw_pine_triangle at 0x7f9af2bcd5b0, file "pine.py", line 9>)
             18 LOAD_CONST               5 ('draw_pine_triangle')
             20 MAKE_FUNCTION            0
             22 STORE_NAME               2 (draw_pine_triangle)

 18          24 LOAD_CONST               6 (<code object draw_pine_body at 0x7f9af2bcd710, file "pine.py", line 18>)
             26 LOAD_CONST               7 ('draw_pine_body')
             28 MAKE_FUNCTION            0
             30 STORE_NAME               3 (draw_pine_body)

 29          32 LOAD_NAME                4 (__name__)
             34 LOAD_CONST               8 ('__main__')
             36 COMPARE_OP               2 (==)
             38 POP_JUMP_IF_FALSE       48

 30          40 LOAD_NAME                0 (draw_pine)
             42 LOAD_CONST               9 (9)
             44 CALL_FUNCTION            1
             46 POP_TOP
        >>   48 LOAD_CONST              10 (None)
             50 RETURN_VALUE

Disassembly of <code object draw_pine at 0x7f9af2bcd2f0, file "pine.py", line 1>:
  2           0 LOAD_GLOBAL              0 (draw_pine_head)
              2 LOAD_FAST                0 (n)
              4 CALL_FUNCTION            1
              6 POP_TOP

  3           8 LOAD_GLOBAL              1 (draw_pine_body)
             10 LOAD_FAST                0 (n)
             12 CALL_FUNCTION            1
             14 POP_TOP
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE

Disassembly of <code object draw_pine_head at 0x7f9af2bcd450, file "pine.py", line 5>:
  6           0 LOAD_GLOBAL              0 (draw_pine_triangle)
              2 LOAD_FAST                0 (n)
              4 CALL_FUNCTION            1
              6 POP_TOP

  7           8 LOAD_GLOBAL              0 (draw_pine_triangle)
             10 LOAD_FAST                0 (n)
             12 CALL_FUNCTION            1
             14 POP_TOP
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE

Disassembly of <code object draw_pine_triangle at 0x7f9af2bcd5b0, file "pine.py", line 9>:
 10           0 LOAD_GLOBAL              0 (range)
              2 LOAD_FAST                0 (n)
              4 LOAD_CONST               1 (1)
              6 BINARY_ADD
              8 CALL_FUNCTION            1
             10 GET_ITER
        >>   12 FOR_ITER                82 (to 96)
             14 STORE_FAST               1 (i)

 11          16 LOAD_GLOBAL              0 (range)
             18 LOAD_FAST                0 (n)
             20 LOAD_CONST               1 (1)
             22 BINARY_ADD
             24 LOAD_FAST                1 (i)
             26 BINARY_SUBTRACT
             28 CALL_FUNCTION            1
             30 GET_ITER
        >>   32 FOR_ITER                18 (to 52)
             34 STORE_FAST               2 (j)

 12          36 LOAD_GLOBAL              1 (print)
             38 LOAD_CONST               2 (' ')
             40 LOAD_CONST               3 ('')
             42 LOAD_CONST               3 ('')
             44 LOAD_CONST               4 (('end', 'sep'))
             46 CALL_FUNCTION_KW         3
             48 POP_TOP
             50 JUMP_ABSOLUTE           32

 13     >>   52 LOAD_GLOBAL              0 (range)
             54 LOAD_CONST               5 (2)
             56 LOAD_FAST                1 (i)
             58 BINARY_MULTIPLY
             60 LOAD_CONST               1 (1)
             62 BINARY_ADD
             64 CALL_FUNCTION            1
             66 GET_ITER
        >>   68 FOR_ITER                18 (to 88)
             70 STORE_FAST               3 (k)

 14          72 LOAD_GLOBAL              1 (print)
             74 LOAD_CONST               6 ('*')
             76 LOAD_CONST               3 ('')
             78 LOAD_CONST               3 ('')
             80 LOAD_CONST               4 (('end', 'sep'))
             82 CALL_FUNCTION_KW         3
             84 POP_TOP
             86 JUMP_ABSOLUTE           68

 15     >>   88 LOAD_GLOBAL              1 (print)
             90 CALL_FUNCTION            0
             92 POP_TOP
             94 JUMP_ABSOLUTE           12
        >>   96 LOAD_CONST               0 (None)
             98 RETURN_VALUE

Disassembly of <code object draw_pine_body at 0x7f9af2bcd710, file "pine.py", line 18>:
 19           0 LOAD_GLOBAL              0 (range)
              2 LOAD_FAST                0 (n)
              4 CALL_FUNCTION            1
              6 GET_ITER
        >>    8 FOR_ITER                66 (to 76)
             10 STORE_FAST               1 (i)

 20          12 LOAD_GLOBAL              0 (range)
             14 LOAD_FAST                0 (n)
             16 CALL_FUNCTION            1
             18 GET_ITER
        >>   20 FOR_ITER                18 (to 40)
             22 STORE_FAST               2 (j)

 21          24 LOAD_GLOBAL              1 (print)
             26 LOAD_CONST               1 (' ')
             28 LOAD_CONST               2 ('')
             30 LOAD_CONST               2 ('')
             32 LOAD_CONST               3 (('end', 'sep'))
             34 CALL_FUNCTION_KW         3
             36 POP_TOP
             38 JUMP_ABSOLUTE           20

 22     >>   40 LOAD_GLOBAL              0 (range)
             42 LOAD_CONST               4 (3)
             44 CALL_FUNCTION            1
             46 GET_ITER
        >>   48 FOR_ITER                18 (to 68)
             50 STORE_FAST               3 (k)

 23          52 LOAD_GLOBAL              1 (print)
             54 LOAD_CONST               5 ('*')
             56 LOAD_CONST               2 ('')
             58 LOAD_CONST               2 ('')
             60 LOAD_CONST               3 (('end', 'sep'))
             62 CALL_FUNCTION_KW         3
             64 POP_TOP
             66 JUMP_ABSOLUTE           48

 24     >>   68 LOAD_GLOBAL              1 (print)
             70 CALL_FUNCTION            0
             72 POP_TOP
             74 JUMP_ABSOLUTE            8

 25     >>   76 LOAD_GLOBAL              0 (range)
             78 LOAD_FAST                0 (n)
             80 LOAD_CONST               6 (1)
             82 BINARY_ADD
             84 CALL_FUNCTION            1
             86 GET_ITER
        >>   88 FOR_ITER                40 (to 130)
             90 STORE_FAST               1 (i)

 26          92 LOAD_GLOBAL              0 (range)
             94 LOAD_FAST                0 (n)
             96 LOAD_CONST               6 (1)
             98 BINARY_ADD
            100 LOAD_FAST                1 (i)
            102 BINARY_SUBTRACT
            104 CALL_FUNCTION            1
            106 GET_ITER
        >>  108 FOR_ITER                18 (to 128)
            110 STORE_FAST               2 (j)

 27         112 LOAD_GLOBAL              1 (print)
            114 LOAD_CONST               1 (' ')
            116 LOAD_CONST               2 ('')
            118 LOAD_CONST               7 (',')
            120 LOAD_CONST               3 (('end', 'sep'))
            122 CALL_FUNCTION_KW         3
            124 POP_TOP
            126 JUMP_ABSOLUTE          108
        >>  128 JUMP_ABSOLUTE           88
        >>  130 LOAD_CONST               0 (None)
            132 RETURN_VALUE
  • 定义了四个函数
    • 函数可以调用函数
    • 每个函数有自己的代码段
      • 从零开始
      • 完成一系列指令
      • 产生返回返回值
      • 并且return回到调用的位置
      • 继续进行
  • 为什么要搞成这样一层层的呢?
  • 我们先去总结一下

总结

  • 我们这次完成了画松树工作
    • 通过一层层的工作的细分
    • 定义了五个函数
    • 然后使用函数调用完成工作
  • 每个函数都有自己的代码段
    • 负责各自的任务
  • 如何理解这个职业分工各司其职呢?🤔
  • 我们下次再说👋