Python 基础(五) | 函数及面向过程编程详解
第五章 函数
⭐本专栏旨在对 Python 的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握 python 编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。
🔥本文已收录于 Python 基础系列专栏: Python基础系列教程 欢迎订阅,持续更新。
5.1 函数的定义及调用
5.1.1 为什么要用函数
1、提高代码复用性——抽象出来,封装为函数
2、将复杂的大问题分解成一系列小问题,分而治之——模块化设计的思想
3、利于代码的维护和管理
顺序式
抽象成函数
5.1.2 函数的定义及调用
白箱子:输入——处理——输出
三要素:参数、函数体、返回值
1、定义
def 函数名(参数):
函数体
return 返回值
2、调用
函数名(参数)
5.1.3 参数传递
0、形参与实参
形参(形式参数):函数定义时的参数,实际上就是变量名
实参(实际参数):函数调用时的参数,实际上就是变量的值
1、位置参数
严格按照位置顺序,用实参对形参进行赋值(关联)
一般用在参数比较少的时候
实参与形参个数必须一一对应,一个不能多,一个不能少
2、关键字参数
打破位置限制,直呼其名的进行值的传递(形参=实参)
必须遵守实参与形参数量上一一对应
多用在参数比较多的场合
位置参数可以与关键字参数混合使用
但是,位置参数必须放在关键字参数前面
不能为同一个形参重复传值
3、默认参数
在定义阶段就给形参赋值——该形参的常用值
在定义阶段就给形参赋值——该形参的常用值
默认参数必须放在非默认参数后面
调用函数时,可以不对该形参传值
机器学习库中类的方法里非常常见
也可以按正常的形参进行传值
默认参数应该设置为不可变类型(数字、字符串、元组)
由上可见,列表的地址并没有发生变化。每次操作就是在原地址列表上进行操作,内容发生了变化,因此就好像有了记忆功能一样。因为默认参数被设置为列表这种可变类型。
不会产生“记忆功能”,每次增量后到新的地址
让参数变成可选的
*4、可变长参数 args
不知道会传过来多少参数 *args
该形参必须放在参数列表的最后
实参打散
**5、可变长参数 ****kwargs
字典实参打散
可变长参数的组合使用
5.1.4 函数体与变量作用域
函数体就是一段只在函数被调用时,才会执行的代码,代码构成与其他代码并无不同
局部变量——仅在函数体内定义和发挥作用
全局变量——外部定义的都是全局变量
全局变量可以在函数体内直接被使用
通过 global 在函数体内定义全局变量
5.1.5 返回值
1、单个返回值
2、多个返回值——以元组的形式
3、可以有多个 return 语句,一旦其中一个执行,代表了函数运行的结束
4、没有 return 语句,返回值为 None
5.1.6 建议
1、函数及其参数的命名参照变量的命名
字母小写及下划线组合
有实际意义
2、应包含简要阐述函数功能的注释,注释紧跟函数定义后面
3、函数定义前后各空两行
4、默认参数赋值等号两侧不需加空格
5.2 函数式编程实例
模块化编程思想
自顶向下,分而治之
【问题描述】
小丹和小伟羽毛球打的都不错,水平也在伯仲之间,小丹略胜一筹,基本上,打 100 个球,小丹能赢 55 次,小伟能赢 45 次。
但是每次大型比赛(1 局定胜负,谁先赢到 21 分,谁就获胜),小丹赢的概率远远大于小伟,小伟很是不服气。
能通过模拟实验,揭示其中的原理
【问题抽象】
1、在小丹 Vs 小伟的二元比赛系统中,小丹每球获胜概率 55%,小伟每球获胜概率 45%;
2、每局比赛,先赢 21 球(21 分)者获胜;
3、假设进行 n = 10000 局独立的比赛,小丹会获胜多少局?(n 较大的时候,实验结果≈真实期望)
【问题分解】
1、输入原始数据
单元测试
2、多场比赛模拟
进行单元测试 用 assert——断言
assert expression
表达式结果为 false 的时候触发异常
3、结果汇总输出
经统计,小丹跟小伟 14 年职业生涯,共交手 40 次,小丹以 28:12 遥遥领先。
其中,两人共交战整整 100 局:
小丹获胜 61 局,占比 61%;
小伟获胜 39 局,占比 39%。
5.3 匿名函数
1、基本形式
lambda 变量: 函数体
2、常用用法
在参数列表中最适合使用匿名函数,尤其是与 key = 搭配
排序 sort() sorted()
max() min()
5.4 面向过程和面向对象
面向过程——以过程为中心的编程思想,以“什么正在发生”为主要目标进行编程。 冰冷的,程序化的
面向对象——将现实世界的事物抽象成对象,更关注“谁在受影响”,更加贴近现实。 有血有肉,拟人(物)化的
以公共汽车为例
“面向过程”:汽车启动是一个事件,汽车到站是另一个事件。。。。
在编程序的时候我们关心的是某一个事件,而不是汽车本身。
我们分别对启动和到站编写程序。
"面向对象":构造“汽车”这个对象。
对象包含动力、服役时间、生产厂家等等一系列的“属性”;
也包含加油、启动、加速、刹车、拐弯、鸣喇叭、到站、维修等一系列的“方法”。
通过对象的行为表达相应的事件
版权声明: 本文为 InfoQ 作者【timerring】的原创文章。
原文链接:【http://xie.infoq.cn/article/3efd293942db36ccd920fb5c5】。未经作者许可,禁止转载。
评论