Skip to content

Latest commit

 

History

History
440 lines (309 loc) · 10.9 KB

304-529666-形参_parameter_与实参_argument.sy.md

File metadata and controls

440 lines (309 loc) · 10.9 KB
show version enable_checker
step
1.0
true

函数参数

回忆

  • 上次我们调试了自己定义的函数sorry
  • 调试有这样一些命令
    • step 跳入当前行所在函数
    • return 跳出当前函数回到调用的位置
    • where 告诉我现在执行到了哪里(当前播放头的程序栈位置)
  • 有了这样一些命令
  • 我们就可以更好地调试python程序了
  • 可以完成一些更复杂的套路么?🤔
  • 我们下次再说!👋

图片描述

套路

  • 我们身边到处都是套路

图片描述

  • 为什么会有套路?

好使

  • 套路是经过前人千百次的错误总结出来的实践经验
  • 真的好使

图片描述

  • 套路就是实践验证合理的

骨骼肌肉

  • 我们的肌肉和骨骼就是dna编程的结果
  • 也是经过35亿年不断修改代码的结果

图片描述

  • 就连我们的走路跑步都是套路

走路

  • 刚出生的时候我们还要学习走路
  • 逐渐我们就熟悉了目前的套路

图片描述

  • 走路的时候不需要思考和感知了
  • 按照套路走就可以了
  • 可是套路有套路的问题

套路

  • 套路固定僵化
  • 容易被针对

图片描述

  • 无脑放战术
  • 其实不太走心

失去真心

  • 放弃观察和思考
  • 顶级高手都是灵活应对的

图片描述

  • 我们究竟应该怎么办?

怎么办?

  • 套路无处不在
    • 城市套路深
    • 我要回农村
    • 农村路也滑
    • 套路更复杂
    • 农村已整改
    • 套路深似海

图片描述

  • 套路用多了
    • 就老套了
    • 就俗了
    • 但是从俗中再产生新的套路
    • 就脱俗了

脱俗

  • 情书是我抄的
  • 套路我是学的
  • 但喜欢你是真心的

图片描述

  • 尝试用左手
    • 拿筷子
    • 刷牙
    • 写字
  • 换了一个模式
  • 有助于延缓老年痴呆
  • 但是还是老套路

反复道也

  • 这世界本没有道
  • 道可道
  • 也就成了道
  • 真正的套路不是一次
  • 而是一次又一次

图片描述

  • 社会学家说
    • 套路是传统
  • 心理学家说
    • 套路是习惯的思路
    • 基于经验降低风险的思路
  • 音乐家说
    • 套路是反复重复是最有效
    • 是各种音乐流派
  • 画家说
    • 套路是画风
    • 是惯用的笔法
  • 手工艺人说
    • 套路是经典的款式
  • 电子工程师说
    • 套路就是反复执行的模块

反复洗衣服

图片描述

  • 表面上我们是在使用各种各样的模式
  • 实际上我们通过模式在控制
    • 水位
    • 水温
    • 速度
    • 是否浸泡
    • 是否加漂洗
    • 等等能够精确到电机、传感器、时间等具体信号上

具体模式

  • 棉麻温度 30 高水位速度 1200 浸泡 加漂洗
  • 牛仔温度 60 高水位 速度800 浸泡 加漂洗
  • 衬衣温度40 一般水位速度800 浸泡 加漂洗

图片描述

  • 29分钟快洗 高水位 温度常温 速度400 浸泡加漂洗
  • 单漂洗 温度常温 速度1200 无浸泡 本身就是漂洗
  • 电压力锅也一样

电压力锅

  • 电压力锅也是如此的方式
  • 电饭煲工作流程(蒸饭)
    • 加热到100度
    • 正常放气降压
    • 保持100度持续25分钟
    • 之后进入保温模式
    • 保持温度在40度
  • 电压力锅工作流程(熬汤)
    • 加热到100度
    • 不放气继续加压加温
    • 保持温度115度
    • 内部压力加到70kpa
    • 保持(115度,70pa)20分钟
    • 慢慢降压

图片描述

  • 我们来试试做一个电压力锅的程序

代码

图片描述

  • 这样我们用户自定义的函数就可以加上参数了
  • 调用的时候也要传递给函数参数
  • 就像print("hello")

图片描述

三种模式

def cook(mode):    
    if mode == "rice":
        print("========rice mode starts =========")
        print("加热到100度")
        print("正常放气降压")
        print("保持100度持续25分钟")
        print("之后进入保温模式")
        print("保持温度在40度")
        print("========rice mode ends =========")
    elif mode == "bone":
        print("=======bone mode ends =========")
        print("加热到100度")
        print("不放气继续加压加温")
        print("保持温度115度")
        print("内部压力加到70kpa")
        print("保持115度,70pa 20分钟")
        print("慢慢降压")
        print("=======bone mode ends =========")
    else:
        print("==========\33[41m[error]\33[0mmode is not valid!===")

cook("nothing")
cook("bone")
cook("rice")

图片描述

图片描述

  • 这是怎么个流程呢?

流程理解

  • 三次调用函数

图片描述

  • 先走了一个错误的使用流程
    • 括号里面给的模式是"nothing"
  • 然后走一个熬汤的流程
    • 括号里面给的模式是"bone"
  • 最后走了一个蒸饭的流程
    • 括号里面给的模式是"rice"
  • 我们这个参数调用的时候
    • 不但要有函数名
    • 而且还要有参数列表
  • 什么是参数列表呢?
    • 我们先看函数定义

形式参数parameter

图片描述

  • 函数cook后面的括号里面有个参数
  • 参数的名字叫做mode
  • mode具体是什么我们在定义的时候还不知道
  • mode只是一个形式上的参数
  • 也叫形参parameter

实际参数argument

  • 函数的形参只是形式上的
  • 具体是用什么模式
  • 根据的事调用的时候
  • 给到函数的实实在在的参数
  • 也叫实参(argument)
  • 形参和实参是不同的

图片描述

  • 我们来调试一下

调试

图片描述

  • 从第一次调用开始
  • 一路n下去
  • 就直接结束了
  • 没有进入到函数里面
  • 如何debug进入到函数里面呢?

查询帮助

图片描述

  • 我们不但可以明确断点放在第几行
  • 还可以明确断点放在函数的入口么?

函数入口

图片描述

  • 再n下去

调试

图片描述

  • 这次n了之后
  • 确实可以跳转到函数里面的断点了
  • 那我可以看看给过来的参数么?

参数

图片描述

  • 确实可以看到mode的值是
    • "nothing"
    • 还有什么更快的方法么?
  • 查询帮助

图片描述

观察实际参数(argument)

图片描述

  • 形参mode

跳转

  • 目前获得了具体的实参值是"nothing"
  • 跳过了第一个分支(2-9)
  • 跳过了第二个分支(9-18)
  • 进入了第三个分支(19-20)

图片描述

  • 这就是第一次函数调用
  • 后两次其实也类似
  • 根据不同的实际参数,决定出:
    • 蒸饭
    • 煲汤
    • 什么也不做
  • 这种参数调用我们以前也经常用

print

图片描述

  • print函数
  • 接受一个字符串参数
  • 这是hello world时候就知道的
  • 类似的参数很常见
  • 就像原料

陶土

  • 比如要做一个瓶瓶罐罐

图片描述

  • 有个流程套路之外
  • 你得有原料吧?
  • 这里要的原料就是黏土

图片描述

  • 不管什么样的黏土
  • 反正你得给我黏土

参数不同结果不同

  • 白色的黏土
    • 返回的是一个白陶罐
  • 黄色的黏土
    • 返回的是一个红陶罐
  • 但是实际给我的参数(原料)必须得是黏土

图片描述

  • 就如同电饭锅需要知道自己的模式
    • 蒸饭
    • 熬粥
    • 蹄髈
  • 如果你告诉电饭锅你的模式是牛仔服...
  • 这个放不进去
  • 也没法闷煮

参数

  • 给了正确参数之后
  • 流程都是那么一个流程

图片描述

  • 白黏土出白管子
  • 黄黏土出黄罐子
  • 或者说沏茶

茶叶

  • 沏的是红茶 砌出来 喝到的就是红茶
  • 里面放的是绿茶 喝到的就是绿茶
  • 里面放的是黑茶 喝到的就是黑茶

图片描述

  • 里面 放的是咖啡 喝到的就是咖啡
  • 流程套路一样
  • 咖啡可以冲一泡
  • 作为参数可以接受
  • 至少比牛仔服好多了
  • 其实我们用过很多函数

文件

  • f = open("oeasy.txt")

  • open函数就接受一个函数名

  • 并且返回一个文件类型的对象

图片描述

  • 可以s(tep into) 到函数open里面
  • 看看他的实现细节
  • 我们去总结一下

总结

  • 对于程序员来说
    • 函数就是封装好的一个套路
    • 这封装好的套路也可以接收参数
    • 就像洗衣机、电饭煲一样可以设定一些模式
  • 传递的参数有两部分两种
    • 函数定义的时候,给出的是一个形式上的样子,是形参(parameter)
    • 函数调用的时候,给出的是具体的实际参数的值,是实参(argument)
    • 调用的时候完成一个赋值的过程
      • 把实参的值赋给形参
  • 这次传递了字符串类的模式作为实参
  • 还可以传递具体的整型数字数值作为实参么?🤔
  • 我们下次再说!👋

图片描述