文章目录
- 4.1 函数的定义及调用
- 4.1.1 为什么要调用函数
- 4.1.2 函数的的定义及调用
- 4.1.3 参数传递
- 4.1.4 函数体与变量作用域
- 4.1.5 返回值
- 4.1.6 几点建议
- 4.2 函数式编程实例
- 4.3 匿名函数
- 4.4面向过程和面向对象
- 小结
4.1 函数的定义及调用
4.1.1 为什么要调用函数
1、提高代码复用性一抽象出来, 封装为函数
2、将复杂的大问题分解成一-系列小问题,分而治之一模块化设计的思想
3、利于代码的维护和管理
顺序式
抽象成函数
4.1.2 函数的的定义及调用
白箱子:输入–处理-- 输出
三要素:参数.函数体、返回值
1、定义
2、调用
函数名(参数)
4.1.3 参数传递
- 形参(形式参数) :函数定义时的参数,实际上就是变量名
- 实参(实际参数) :函数调用时的参数,实际上就是变量的值
1、位置参数
- 严格按照位置顺序,用实参对形参进行赋值(关联)
- 一般用在参数比较少的时候
- 实参与形参个数必须–对应, -个不能多,-一个不能少
2、关键字参数
- 打破位置限制,直呼其名的进行值的传递(形参=实参)
- 必须遵守实参与形参数量上一对应
- 多用在参数比较多的场合
- 位置参数可以与关键字参数混合使用
- 但是,位置参数必须放在关键字参数前面
- 不能为同一一个形参重复传值
3、默认参数
- 在定义阶段就给形参赋值一该形参的常用值
- 机器学习库中类的方法里非常常见
- 调用函数时,可以不对该形参传值
- 也可以按正常的形参进行传值
- 默认参数应该设置为不可变类型(数字、字符串.元组)
- 让参数变成可选的
- *4、可变长参数 args
- 不知道会传过来多少参数*args
- 该形参必须放在参数列表的最后
- 实参打散
- **5、可变常参数 kwargs
- 字典实参打散
- 可变长参数的组合使用
4.1.4 函数体与变量作用域
- 函数体就是一段只在函数被调用时,才会执行的代码,代码构成与其他代码并无不同
- 局部变量一仅在函数体内定义和发挥作用
- 全局变量一外部定义的都是全局变量
- 全局变量可以在函数体内直接被使用
- 通过global在函数体内定义全局变量
4.1.5 返回值
1、单个返回值
2、多个返回值——以元组形式
3、可以有多个return语句,一旦其中一个执行,代表了函数运行的结束
4、没有returm语句,返回值为None
4.1.6 几点建议
1.函数及其参数的命名参照变量的命名
- 字母小写及下划线组合
- 有实际意义.
2.应包含简要阐述函数功能的注释,注释紧跟函数定义后面
3、函数定义前后各空两行
4.2 函数式编程实例问题抽象
1、在小丹Vs小伟的二元比赛系统中,小丹每球获胜概率55%,小伟每球获胜概率45%;
2、每局比赛,先赢21球(21分) 者获胜;
3.假设进行n = 1000场独立的比赛,小丹会获胜多少场? (n 较大的时候,实验结果=真实期望)
问题分解
1、输入原始数据
2、多场比赛模拟
3、结果输出
综上就行
import random4.3 匿名函数
def get_inputs():
# 获取原始数据
proh_A = eval(input("请输入运动员A的每球(0~1):"))
proh_B = round(1-proh_A, 2)
number_of_games = eval(input("请输入模拟的场次(正整数):"))
print("模拟比赛总次数:",number_of_games)
print("A 选手每球获胜的概率:",proh_A)
print("B 选手每球获胜的概率:",proh_B)
return proh_A,proh_B,number_of_games
def game_over(score_A, score_B):
#单场模拟结束条件,一方达到21分,比赛结束
return score_A == 21 or score_B == 21
def sim_one_game(proh_A, proh_B):
#模拟一场比赛结果
score_A, score_B = 0, 0
while not game_over(score_A, score_B):
if random.random() < proh_A: # random.random()产生[0,1)之间的随机小数,均匀分布
score_A += 1
else:
score_B += 1
return score_A, score_B
# score_A, score_B = sim_one_game(0.7,0.3)
# print(score_A)
# print(score_B)
def sim_n_games(proh_A, proh_B, number_of_games):
#模拟多场比赛的结果
win_A, win_B = 0, 0
for i in range(number_of_games):
score_A, score_B = sim_n_games(proh_A, proh_B, number_of_games)
if score_A > score_B:
win_A += 1
else:
win_B += 1
return win_A, win_B
def print_summer(win_A, win_B, number_of_games):
# 结果汇总输出
print("共模拟{}场比赛",format(number_of_games))
print("\033[31m选手A获胜{0}场",format(win_A,win_A/number_of_games))
print("选手B获胜{0}场,占比{1:.1%}",format(win_B,win_B/number_of_games))
def main():
#主要逻辑
proh_A, proh_B,number_of_games = get_inputs()
win_A,win_B = sim_n_games(proh_A, proh_B,number_of_games)
print_summer(win_A, win_B, number_of_games)
main()
1、基本形式
2、常用用法
- 排序sort() sorted()
max() min()
面向过程——以过程为中心的编程思想, 以“什么正在发生"为主要目标进行编程。冰冷的, 程序化的
面向对象——将现实世 界的事物抽象成对象,更关注谁在受影响”,更加贴近现实。有 血有肉,拟人(物)化的