4.1.6 几点建议
1.函数及其参数的命名参照变量的命名
字母小写及下划线组合
有实际意义.
2.应包含简要阐述函数功能的注释,注释紧跟函数定义后面
3、函数定义前后各空两行
4.2 函数式编程实例
问题抽象
1、在小丹Vs小伟的二元比赛系统中,小丹每球获胜概率55%,小伟每球获胜概率45%;
2、每局比赛,先赢21球(21分) 者获胜;
3.假设进行n = 1000场独立的比赛,小丹会获胜多少场? (n 较大的时候,实验结果=真实期望)
问题分解
1、输入原始数据
2、多场比赛模拟
3、结果输出
综上就行
import random
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()
4.3 匿名函数
1、基本形式
2、常用用法
排序sort() sorted()
max() min()
4.4面向过程和面向对象
面向过程——以过程为中心的编程思想, 以“什么正在发生"为主要目标进行编程。冰冷的, 程序化的
面向对象——将现实世 界的事物抽象成对象,更关注谁在受影响”,更加贴近现实。有 血有肉,拟人(物)化的
以公共汽车为例
**“面向过程”😗*汽车启动是一个事件, 汽车到站是另一个事件。。。。
在编程序的时候我们关心的是某一个事件, 而不是汽车本身。
我们分别对启动和到站编写程序。
**“面向对象"😗*构造^汽车’这个对象。
对象包含动力、服役时间、生产厂家等等一系列的“属性”;
也包含加油、启动、加速、刹车、拐弯、鸣喇叭、到站、维修等一系列的“方法”。
通过对象的行为表达相应的事件
😁💖😜🤷♂️😁‘
小结