文章目录

  • ​​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面向过程和面向对象​​
  • ​​小结​​


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

4.1 函数的定义及调用

4.1.1 为什么要调用函数

1、提高代码复用性一抽象出来, 封装为函数
2、将复杂的大问题分解成一-系列小问题,分而治之一模块化设计的思想
3、利于代码的维护和管理

顺序式

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

抽象成函数

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

4.1.2 函数的的定义及调用

白箱子:输入–处理-- 输出
三要素:参数.函数体、返回值

1、定义

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

2、调用
函数名(参数)

4.1.3 参数传递

  • 形参(形式参数) :函数定义时的参数,实际上就是变量名
  • 实参(实际参数) :函数调用时的参数,实际上就是变量的值

1、位置参数

  • 严格按照位置顺序,用实参对形参进行赋值(关联)
  • 一般用在参数比较少的时候
  • 实参与形参个数必须–对应, -个不能多,-一个不能少

2、关键字参数

  • 打破位置限制,直呼其名的进行值的传递(形参=实参)
  • 必须遵守实参与形参数量上一对应
  • 多用在参数比较多的场合
  • 位置参数可以与关键字参数混合使用
  • 但是,位置参数必须放在关键字参数前面

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

  • 不能为同一一个形参重复传值

3、默认参数

  • 在定义阶段就给形参赋值一该形参的常用值
  • 机器学习库中类的方法里非常常见
  • 调用函数时,可以不对该形参传值
  • 深度之眼(九)——python函数--面向过程的编程_开发语言_06

  • 也可以按正常的形参进行传值
  • 深度之眼(九)——python函数--面向过程的编程_函数体_07

  • 默认参数应该设置为不可变类型(数字、字符串.元组)
  • 深度之眼(九)——python函数--面向过程的编程_面向过程_08

  • 让参数变成可选的
  • *4、可变长参数 args
  • 不知道会传过来多少参数*args
  • 该形参必须放在参数列表的最后
  • 深度之眼(九)——python函数--面向过程的编程_大数据_09

  • 实参打散
  • 深度之眼(九)——python函数--面向过程的编程_面向过程_10

  • **5、可变常参数 kwargs
  • 深度之眼(九)——python函数--面向过程的编程_python_11

  • 字典实参打散

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

  • 可变长参数的组合使用

4.1.4 函数体与变量作用域

  • 函数体就是一段只在函数被调用时,才会执行的代码,代码构成与其他代码并无不同
  • 局部变量一仅在函数体内定义和发挥作用
  • 深度之眼(九)——python函数--面向过程的编程_面向过程_13


  • 全局变量一外部定义的都是全局变量
  • 全局变量可以在函数体内直接被使用

深度之眼(九)——python函数--面向过程的编程_开发语言_14

  • 通过global在函数体内定义全局变量
  • 深度之眼(九)——python函数--面向过程的编程_大数据_15


4.1.5 返回值

1、单个返回值

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

2、多个返回值——以元组形式

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


3、可以有多个return语句,一旦其中一个执行,代表了函数运行的结束

深度之眼(九)——python函数--面向过程的编程_开发语言_18


4、没有returm语句,返回值为None

深度之眼(九)——python函数--面向过程的编程_开发语言_19

4.1.6 几点建议

1.函数及其参数的命名参照变量的命名

  • 字母小写及下划线组合
  • 有实际意义.

2.应包含简要阐述函数功能的注释,注释紧跟函数定义后面

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

3、函数定义前后各空两行

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

4.2 函数式编程实例

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

问题抽象

1、在小丹Vs小伟的二元比赛系统中,小丹每球获胜概率55%,小伟每球获胜概率45%;
2、每局比赛,先赢21球(21分) 者获胜;
3.假设进行n = 1000场独立的比赛,小丹会获胜多少场? (n 较大的时候,实验结果=真实期望)

问题分解

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


1、输入原始数据

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


2、多场比赛模拟

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


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


深度之眼(九)——python函数--面向过程的编程_开发语言_27


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


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、基本形式

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

2、常用用法

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

  • 排序sort() sorted()
  • 深度之眼(九)——python函数--面向过程的编程_python_31

  • max() min()

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

4.4面向过程和面向对象

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

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

深度之眼(九)——python函数--面向过程的编程_开发语言_33


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


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