深度之眼(九)——python函数--面向过程的编程


在这里插入图片描述

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 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面向过程和面向对象

面向过程——以过程为中心的编程思想, 以“什么正在发生"为主要目标进行编程。冰冷的, 程序化的
面向对象——将现实世 界的事物抽象成对象,更关注谁在受影响”,更加贴近现实。有 血有肉,拟人(物)化的

  • 以公共汽车为例
    **“面向过程”😗*汽车启动是一个事件, 汽车到站是另一个事件。。。。
    在编程序的时候我们关心的是某一个事件, 而不是汽车本身。
    我们分别对启动和到站编写程序。
    **“面向对象"😗*构造^汽车’这个对象。
    对象包含动力、服役时间、生产厂家等等一系列的“属性”;
    也包含加油、启动、加速、刹车、拐弯、鸣喇叭、到站、维修等一系列的“方法”。
    通过对象的行为表达相应的事件
    😁💖😜🤷‍♂️😁‘

小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

posted @ 2022-07-10 11:11  周末不下雨  阅读(24)  评论(0编辑  收藏  举报