自学python笔记(二)

⏰前言

不知不觉今天已经过去大半,本以为昨天就能更新的文章今天的这个时候才开始码字。今天总结两个项目:猜数字和预测概率。编程可以让人明白一些道理,甚至让你觉得看似不相关的随机数其实也是有被预测的可能,那么接下来就来玩一玩这两组代码吧!

😝猜数字

假设Joe的年龄是18岁,她被询问年龄时不想直接做出直接的回答,但出于礼貌又有必要告诉对方,于是Joe想写一个程序,通过给出提示让别人猜测。这里就要用到while语句来构造这样一个程序。

joe_age = 18
guess = int(input(">>:"))
while guess != joe_age:
    if guess > joe_age:
        print("猜的太大了,往小试试……")
    elif guess < joe_age:
        print("猜的太小了,往大试试……")
    guess = int(input(">>:"))
print("恭喜你,猜对了!")

while循环不同于for循环就在于它可以无限循环,我们不能知道要猜多少次,所以while循环更加适合这样的场景。

guess = int(input(">>:"))

同时也用到ifelif条件判断语句:

if guess > joe_age:
        print("猜的太大了,往小试试……")
    elif guess < joe_age:
        print("猜的太小了,往大试试……")
    guess = int(input(">>:"))
print("恭喜你,猜对了!")

当猜测年龄大于实际年龄,打印“猜的太大了,往小试试……”,当猜测年龄小于实际年龄,打印“猜的太小了,往大试试……”,当猜测年龄等于实际年龄,打印"恭喜你,猜对了!"程序运行结果如下图所示:


while语句案例

🏆获胜概率预测

场景如下:
1.小A和小B羽毛球比赛,小A每球获胜概率55%,小B每球获胜概率45%;
2.每局比赛,先得21分者获胜;
3.假设进行10000局比赛,两人分别会获胜多少局?
首先构造顶层框架:

def main():
    #主要逻辑
    prob_A, prob_B, number_of_games = get inputs() #获取原始数据
    win_A, win_B = sim_n_games(prob_A, prob_B, number_of_games) #获取模拟结果
    print_summary(win_A, win_B, number_of_games) #结果汇总输出

def main()定义函数main, prob_A小A每球获胜概率,prob_B小B每球获胜概率,number_of_games比赛场数。通过以上参数,再获得两人分别赢多少局 win_A, win_B。最后进行汇总输出print_summary

录入原始数据

def get_inputs():
    #输入原始数据
    prob_A = eval(input("请输入运动员A的每球获胜概率(0~1):"))
    prob_B = round(1-prob_A, 2) #2人比赛,1-prob_A = prob_B
    number_of_games = eval(input("请输入模拟比赛场数(正整数):"))
    print("模拟比赛场数:", number_of_games)
    print("小A每球获胜概率:", prob_A)
    print("小B每球获胜概率:", prob_B)
    return prob_A, prob_B, number_of_games #每一次return语句出现代表调用函数结束
prob_A, prob_B, number_of_games = get_inputs()
print(prob_A, prob_B, number_of_games)
录入原始数据

多场比赛模拟

进行多场比赛模拟( score_A, score_B是获得比分,其中一人到达 21循环停止:

def sim_n_games(prob_A, prob_B, number_of_games): #定义sim_n_games函数
    #模拟多场比赛的结果
    win_A, win_B = 0, 0 #初始化A和B获胜的场次
    for i in range(number_of_games): #迭代number_of_games次,以下是模拟一场比赛,for循环一万次
        score_A, score_B = sim_one_game(prob_A, prob_B) #获得模拟比赛的比分 
        if score_A > score_B:
            win_A +=1
        else:
            win_B +=1
    return win_A, win_B

单次比赛情况模拟

然后我们再进行简化,把多场比赛简化成模拟一场比赛,再进行10000次循环:

import random
def sim_one_game(prob_A, prob_B):
    #模拟一场比赛的结果
    score_A, score_B = 0,0
    while not game_over(score_A, score_B): #这里用到while循环
        if random.random() < prob_A: 
            score_A +=1
        else :
            score_B +=1
    return score_A, score_B

注意上面代码中 if random.random() < prob_A: 随机数据小于小A每球获胜概率的55%,则A获胜一次,此处需要用心理解。

汇总输出

def print_summary(win_A, win_B, number_of_games):
    print("共模拟了{}场比赛" .format(number_of_games)) #模拟总场次
    print("选手A获胜{0}场,占比{1:.1%}" .format(win_A, win_A/number_of_games)) #A获胜的概率除以总场次乘以100%
    print("选手B获胜{0}场,占比{1:.1%}" .format(win_B, win_B/number_of_games)) #B获胜的概率除以总场次乘以100%

最终形成程序

import random


def get_inputs():
    #输入原始数据
    prob_A = eval(input("请输入运动员A的每球获胜概率(0~1):"))
    prob_B = round(1-prob_A, 2) #2人比赛,1-prob_A = prob_B
    number_of_games = eval(input("请输入模拟比赛场数(正整数):"))
    print("模拟比赛场数:", number_of_games)
    print("小A每球获胜概率:", prob_A)
    print("小B每球获胜概率:", prob_B)
    return prob_A, prob_B, number_of_games #每一次return语句出现代表调用函数结束
#prob_A, prob_B, number_of_games = get_inputs()
#print(prob_A, prob_B, number_of_games)


def game_over(score_A, score_B):
    #单场模拟结束条件是一方获得21分
    return score_A == 21 or score_B == 21


def sim_one_game(prob_A, prob_B):
    #模拟一场比赛的结果
    score_A, score_B = 0,0
    while not game_over(score_A, score_B):
        if random.random() < prob_A:
            score_A += 1
        else :
            score_B += 1
    return score_A, score_B


def sim_n_games(prob_A, prob_B, number_of_games): #定义sim_n_games函数
    #模拟多场比赛的结果
    win_A, win_B = 0, 0 #初始化A和B获胜的场次
    for i in range(number_of_games): #迭代number_of_games次,以下是模拟一场比赛,for循环一万次
        score_A, score_B = sim_one_game(prob_A, prob_B) #获得模拟比赛的比分 
        if score_A > score_B:
            win_A += 1
        else:
            win_B += 1
    return win_A, win_B


def print_summary(win_A, win_B, number_of_games):
    print("共模拟了{}场比赛" .format(number_of_games)) #模拟总场次
    print("选手A获胜{0}场,占比{1:.1%}" .format(win_A, win_A/number_of_games)) #A获胜的概率除以总场次乘以100%
    print("选手B获胜{0}场,占比{1:.1%}" .format(win_B, win_B/number_of_games)) #B获胜的概率除以总场次乘以100%


def main():
    #主要逻辑
    prob_A, prob_B, number_of_games = get_inputs() #获取原始数据
    win_A, win_B = sim_n_games(prob_A, prob_B, number_of_games) #获取模拟结果
    print_summary(win_A, win_B, number_of_games) #结果汇总输出


if __name__ == "__main__":
    main()
概率预算

到此,整个程序运行完毕,代码中的注释部分需要认真阅读。

👍小结

两个小案例的练习,让我觉得真的是每一个简单的自动化执行背后都是无数的辛酸。社会大分工后让人们的专业越来越细,越来越专,普罗大众漫不经心地使用机器进行自动化高效工作,殊不知越是高效、便捷、傻瓜式的智能,说明背后越是有人付出时间和精力帮助你完成更多要考虑到的事情。极客万岁!另外,概率分析这个案例,单个球的输赢概率A和B相差无几,但多次比赛下来却出现惊人的差距,正所谓“失之毫厘,差之千里啊!”

下章再见!🙋‍♀️

未经沟通转载,将追究法律责任,请尊重原创劳动成果!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 选择题部分 1.(),只有在发生短路事故时或者在负荷电流较大时,变流器中才会有足够的二次电流作为继电保护跳闸之用。...
    skystarwuwei阅读 12,889评论 0 7
  • 选择题部分 1.()部门负责日常监督检查工作,安全巡视的同时进行消防检查,推动消防安全制度的贯彻落实。 A: 消防...
    skystarwuwei阅读 15,175评论 0 3
  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 10,369评论 0 5
  • http://mindhacks.cn/2008/09/21/the-magical-bayesian-metho...
    麒麟楚庄王阅读 1,847评论 0 2
  • 你说, 天上的星星隔着那么远, 在我们看来却是那么近, 那么 ...
    落枫秋阅读 393评论 0 6