2024-10-18 学习人工智能的Day10

news2024/10/19 6:17:08

        今天将昨天关于类与对象没有完成的完成了,接着讲了一点python的函数式编程思想。

剩余的类与对象

1.封装

        封装是指隐藏类的实现细节,让使用者不用关心这些细节;封装的目的是让使用者通过尽可能少的方法(或属性)操作对象,但是Python的封装是假的,所以即使是私有方法或者私有属性都是能够强行访问的。   

class A:
    def __init__(self):
        self.__p1 = 100  # 私有属性
    def __m1(self):  # 私有方法
        print("__m1(self) 方法被调用")
    def showA(self):
        self.__m1()
        print("self.__p1 = ", self.__p1)
class B(A):
    def __init__(self):
        super().__init__()
    def showB(self):
        self.__m1()  # 出错,不允许调用
        print("self.__p1 = ", self.__p1)  # 出错,不允许调用
        # self._A__m1()  # 正常调用
        # print("self.__p1 =", self._A__p1)  # 正常访问

a = A()
a.showA()
a.__m1()       # 出错,不允许调用
v = self.__p1  # 出错,不允许调用
b = B()
b.showB()

# 访问私有属性
print(a._A__p1)  # 输出: 100
# 调用私有方法
a._A__m1()  # 输出: __m1(self) 方法被调用
# 不推荐了解就行

 2.super函数

        主要用于解决类似于钻石继承等类的问题,支持调用已覆盖的父类方法。支持多继承,会根据顺序执行父类中的方法。可以简化代码也避免无限循环。经常使用super().__init__()来调用父类的构造函数。(深度学习方法中经常见到super().__init__()

class Parent:
    def __init__(self):
        print("Parent class constructor called")
        self.parent_attribute = "I am a parent attribute"

class Child(Parent):
    def __init__(self):
        super().__init__()
        print("Child class constructor called")
        self.child_attribute = "I am a child attribute"

# 创建一个 Child 类的实例
child_instance = Child()
print(child_instance.parent_attribute)

# 输出
# Parent class constructor called
# Child class constructor called

3.迭代器和生成器 

        1.迭代器

        迭代器是访问可迭代对象的工具,迭代器函数有iter和next

函数说明
iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象
next(iterator)从迭代器iterator中获取下一个记录,如果无法获取一下条记录,则触发 StopIteration 异常

示例:

   # 示例 可迭代对象
    L = [1, 3, 5, 7]
    it = iter(L)  # 从L对象中获取迭代器
    next(it)  # 1  从迭代器中提取一个数据
    next(it)  # 3
    next(it)  # 5
    next(it)  # 7
    next(it)  # StopIteration 异常
    # 示例2 生成器函数
    It = iter(range(1, 10, 3))
    next(It)  # 1
    next(It)  # 4
    next(It)  # 7
    next(It)  # StopIteration

    在介绍迭代器的过程中,老师给我们介绍了try except组合,此组合是用来捕捉错误的,在try下写入可能会出现错误的方法体等,在except中写入捕捉到错误之后程序指向的表达式。  

# 可迭代的对象
L = list(range(10))
it = iter(L)

while True:
    try:
        print(next(it))

    except:
        print("迭代结束")
        break

         2.生成器

        生成器只有yield一个,它通常不在内存中保留大量数据,基本是现用现生成。生成器函数是一种特殊的函数,可以在迭代过程种逐步产生值,而不是直接返回所有结果,对口的是在迭代器中返回值,与他功能相似的是return,但是return返回的是不可迭代的对象,yield返回的是可迭代的对象。        

生成器函数

含有yield 语句的函数是生成器函数,此函数调用回返回一个生成器对象,生成器也是可迭代对象

yield 语句的语法

yield 表达式

生成器函数示例1:

## 定义一个生成器函数, 有 yield 的函数调用后回返回生成器对象
def myrange(stop):
    i = 0
    while i < stop:
        yield i    # 为 遍历次生产器的for 语句提供数据
        i += 1

for x in myrange(5):
    print('x=', x)
    
# 创建一个生成器对象
gen = myrange(5)

# 使用 next() 函数迭代生成器
print(next(gen)) 
print(next(gen))  
print(next(gen)) 
print(next(gen))  
print(next(gen))  

以上实例中,Descendorder 函数是一个生成器函数。它使用 yield 语句逐步产生从 n 到 1 的倒序数字。在每次调用 yield 语句时,函数会返回当前的倒序数字,并在下一次调用时从上次暂停的地方继续执行。

创建生成器对象并使用 next() 函数或 for 循环迭代生成器,我们可以逐步获取生成器函数产生的值。在这个例子中,我们首先使用 next() 函数获取前两个倒序数字,然后通过 for 循环获取剩下的三个倒序数字。

生成器函数的优势是它们可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成器还可以与其他迭代工具(如for循环)无缝配合使用,提供简洁和高效的迭代方式。

函数式编程

定义:用一系列函数解决问题。

  • 函数可以赋值给变量,赋值后变量绑定函数。

  • 允许将函数作为参数传入另一个函数。

  • 允许函数返回一个函数。

1.函数作为参数 

将核心逻辑传入方法体,使该方法的适用性更广

示例1:

def func01():
    print("func01执行")

# a = func01
# # print(a)
# a()

def func02():
    print("func02执行")

# 通用
def func03(func):
    print("func03执行")
    func()

func03(func02)
func03(func01)

将函数作为参数传入主函数,主函数传参的方法调用其他方法和实现主方法。

示例2:

list01 = [4, 54, 56, 65, 67, 7]


# 需求1:定义函数,在列表中查找所有大于50的数字
def find01():
    for item in list01:
        if item > 50:
            yield item

# 需求2:定义函数,在列表中查找所有小于10的数字
def find02():
    for item in list01:
        if item < 10:
            yield item

# “封装” -- 分
def condition01(item):
    return item > 50

def condition02(item):
    return item < 10

# 通用
# “继承” - 隔
def find(func):
    for item in list01:
        # if item < 10:
        # if condition02(item):
        if func(item):
            yield item

# "多态" - 做
for item in find(condition01):
    print(item)

for item in find(condition02):
    print(item)

这里更可以看出函数式编程的特点了,因为两个功能的实现方法相似,直接将二者的核心逻辑融入一个函数体,再将不同的逻辑通过函数做的参的方式让主函数调用。

        1.lambda表达式 

        之前有用过lambda语法,所以就简单的介绍这种匿名函数

语法

# 定义:
变量 = lambda 形参: 方法体

# 调用:
变量(实参)

本次介绍lambda方法主要是为了配合后面的内置高阶函数使用。因为lambda的特点是其方法体只能有一条语句,且不支持赋值语句,而内置高阶函数都有需要传入一个函数,所以简短的lambda是最佳选择

        2.内置高阶函数

        本次介绍的内置高阶函数一共五个,

(1)map(函数,可迭代对象)

使用可迭代对象中的每个元素调用函数,将返回值作为新可迭代对象元素;返回值为新可迭代对象。

(2)filter(函数,可迭代对象)

根据条件筛选可迭代对象中的元素,返回值为新可迭代对象。

(3)sorted(可迭代对象, key=函数, reverse=True)

排序,返回值为排序后的列表结果。

(4)max(可迭代对象, key = 函数)

根据函数获取可迭代对象的最大值。

(5)min(可迭代对象,key = 函数)

根据函数获取可迭代对象的最小值。

简单的理解,map是用于整体查询的,filter是整体按条件查询的,sorted是整体按key=这个关键信息进行排序的,而max是min则是根据key进行比较,最后只返回可迭代对象的一个值作为max或者min函数的结果。所以max和min无法与其他的方法一样在for循环中作为可迭代对象使用。

示例:

class Girl:
    def __init__(self, name="", face_score=0, age=0, height=0):
        self.name = name
        self.face_score = face_score
        self.age = age
        self.height = height

    def __str__(self):
        return "%s-%d-%d-%d" % (self.name, self.face_score, self.age, self.height)


list_girl = [
    Girl("双儿", 96, 22, 166),
    Girl("阿珂", 100, 23, 173),
    Girl("小郡主", 96, 22, 161),
    Girl("方怡", 86, 27, 166),
    Girl("苏荃", 99, 31, 176),
    Girl("建宁", 93, 24, 163),
    Girl("曾柔", 88, 26, 170),
]

# 1.  map 映射
#  在美女列表中获取所有名称
#  类似于:select
for element in map(lambda item: item.name, list_girl):
    print(element)

# 2. filter 过滤器
# 在美女列表中获取颜值大于90的所有美女
#  类似于:find_all
for element in filter(lambda item: item.face_score > 90, list_girl):
    print(element)


# 3. max/min
# 在美女列表中获取颜值最高的美女
#  类似于:get_max
print(max(list_girl,key = lambda item:item.face_score))
print(min(list_girl,key = lambda item:item.face_score))

# 4.sorted 排序
#   注意:没有改变原有列表,而是返回新的
# 升序
for item in sorted(list_girl,key = lambda item:item.height):
    print(item)
# 降序
for item in sorted(list_girl,key = lambda item:item.height,reverse=True):
    print(item)

2. 函数作为返回值 

        2.1 闭包

        闭包是指用了此函数外部嵌套函数的变量的函数 闭包就是能够读取其他函数内部变量的函数。只有函数内部的嵌套函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数,同时这个函数又引用了外部的变量“。

        闭包必须满足的三个条件:1,必须有一个内嵌函数 2,内嵌函数必须引用外部函数中变量 3,外部函数返回值必须是内嵌函数

示例:

def give_yasuiqian(money):
    def child_buy(obj, m):
        nonlocal money
        if money > m:
            money -= m
            print('买', obj, '花了', m, '元, 剩余', money, '元')
        else:
            print("买", obj, '失败')
    return child_buy
cb = give_yashuqian(1000)    
cb('变形金刚', 200)
cb('漫画三国', 100)
cb('手机', 1300)

在其中可以将give_yasuiqian中的return作为一个接口,当give_yasuiqian完成示例创建后,该实例的实际类型为chlid_buy,而如果对使用cb(),启用该函数则激活内嵌函数chlid_buy函数,所以创建give_yasuiqian的实例对象相当于创建了child_buy的实例对象。

        2.2 装饰器  decorators

装饰器的语法:

def 装饰器函数名(fn):
    语句块
    return 函数对象

@装饰器函数名 <换行>
def 被装饰函数名(形参列表):
    语句块

 用函数装饰器替换原函数myfun

def mydeco(fn):
    fn()
    print("装饰器函数被调用了,并返回了fx")
    def fx():
        print("fx被调用了")
        # return fn()
    return fx

@ mydeco
def myfun():
    print("函数myfun被调用")

myfun()
myfun()

这里调用myfun()可以看作将myfun以参数形式传入mydeco()且激活mydeco(),而第一步就是实例化传入的函数体,所以第一个输出的“函数myfun被调用”,而第二步则是打印“装饰器函数被调用了,并返回fx,因为返回的结果为fx这个实例,所以再次调用就是直接直接调用fx这个实例方法,最后输出”fx被调用了“ 。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

飞机大战告尾

参考 PPO算法逐行代码详解 链接 通过网盘分享的文件&#xff1a;PlaneWar 链接: https://pan.baidu.com/s/1cbLKTcBxL6Aem3WkyDtPzg?pwd1234 提取码: 1234 10.17关于博客发了又改这件事 悲催的事 今天训练了一早上ppo模型&#xff0c;满怀期待的检测成果时发现一点长进都…

mac安装brew时踩坑解决方案

安装包 mac上如果按照git等工具可能会使用brew&#xff0c;例如使用&#xff1a;$ brew install git命令&#xff0c;如果电脑没有按照brew&#xff0c;则会提示&#xff1a;zsh: command not found: brew 解决方案 需要我们打开brew的官网https://brew.sh/&#xff0c;复制…

动态规划一>下降路径最小和

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; /**1.创建dp表2.初始化3.填表4.返回值*/public int minFallingPathSum(int[][] matrix) {int n matrix.length;int[][] dp new int[n1][n2];int minNum Integer.MAX_VALUE; for(int i 1; i < n; i) dp[i][0]…

【CSS】纯CSS Loading动画组件

<template><div class"ai-loader-box"><!-- AI loader --><div class"ai-loader"><div class"text"><p>AI智能分析中....</p></div><div class"horizontal"><div class&quo…

简单说说 spring是如何实现AOP的(源码分析)

在spring生命周期流程中&#xff0c;有一个过程是执行BeanPostProcessor的后置方法 BeanPostProcessor 是一个接口&#xff0c;其实现有 aop实现的核心类是AbstractAutoProxyCreator&#xff0c;其位于spring-aop包下&#xff0c;实现了BeanPostProcessor //BeanPostProcesso…

【Java小白图文教程】-04-分支结构

本套课程将会从0基础讲解Java语言核心技术&#xff0c;适合人群&#xff1a; 大学中开设了Java语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想要从事Java相关开发开发的同学 精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https:/…

transformers 推理 Qwen2.5 等大模型技术细节详解(一)transformers 初始化和对象加载(文末免费送书)

上周收到一位网友的私信&#xff0c;希望老牛同学写一篇有关使用 transformers 框架推理大模型的技术细节的文章。 老牛同学刚开始以为这类的文章网上应该会有很多&#xff0c;于是想着百度几篇质量稍高一点的回复这位网友。结果&#xff0c;老牛同学搜索后发现&#xff0c;类…

力扣61~65题

题61&#xff08;中等&#xff09;&#xff1a; 分析&#xff1a; python代码&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def rot…

【含开题报告+文档+PPT+源码】基于SpringBoot电脑DIY装机教程网站的设计与实现

开题报告 随着科技的发展和人们对电脑需求的增加&#xff0c;越来越多的人开始自己组装电脑。然而&#xff0c;针对初学者来说&#xff0c;如何选择合适的硬件配置并进行装机是一个相对复杂的过程。随着各种品牌、型号和规格的硬件不断增多&#xff0c;用户需要一个方便快捷的…

Java项目编译不通过,IDEA无法运行或调试Unit test类

mvn test可以通过&#xff0c;但是通过IDEA无法运行或调试&#xff0c;总是弹出一些依赖错误比如&#xff1a; 程序包xxx.xxx.xxx 不存在或找不到符号 解决办法 步骤1&#xff1a;IDEA 打开 File -> Setting ->Compiler &#xff0c;找到“Automatically show first …

20 Shell Script输入与输出

标出输入、标准输出、错误输出 一、程序的基本三个IO流 一&#xff09;文件描述符 ​ 任何程序在Linux系统中都有3个基本的文件描述符 ​ 比如: ​ cd/proc/$$/fd ​ 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…

基于System.js的微前端实现(插件化)

目录​​​​​​​ 写在前面 一、微前端相关知识 &#xff08;一&#xff09;概念 &#xff08;二&#xff09; 优势 &#xff08;三&#xff09; 缺点 &#xff08;四&#xff09;应用场景 &#xff08;五&#xff09;现有框架 1. qiankun 2. single-spa 3. SystemJ…

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖

写在前面的话 在Pico上接入MRTK3&#xff0c;目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3&#xff0c;无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…

Dockerr安装Oracle以及使用DBeaver连接

拉取镜像 pull container-registry.oracle.com/database/free:latest 创建容器 说明一下我现在的最新版本是23 docker run -d --name oracle23i -h xrilang -p 1521:1521 container-registry.oracle.com/database/free:latest 查看日志 docker logs oracle23i 设置密码 因为创建…

登录时用户名密码加密传输(包含前后端代码)

页面输入用户名密码登录过程中&#xff0c;如果没有对用户名密码进行加密处理&#xff0c;可能会导致传输过程中数据被窃取&#xff0c;就算使用https协议&#xff0c;在浏览器控制台的Request Payload中也是能直接看到传输的明文&#xff0c;安全感是否还是不足。 大致流程&a…

第二百八十八节 JPA教程 - JPA查询连接OrderBy示例

JPA教程 - JPA查询连接OrderBy示例 以下代码显示如何使用ORDER BY子句和连接条件。 List l em.createQuery("SELECT e " "FROM Project p JOIN p.employees e " "WHERE p.name :project " "ORDER BY e.name").setParameter("pr…

【MogDB】MogDB5.2.0重磅发布第四篇-支持windows版gsql,兼容sqlplus/sqlldr语法

一、背景 目前仍然很多客户的运维机使用windows操作系统&#xff0c;开发人员也是在windows环境上进行编码测试&#xff0c;甚至还有一些客户管理比较严格&#xff0c;禁止开发人员登录服务器进行操作。在MogDB 5.2.0版本之前&#xff0c;没有提供windows平台的gsql&#xff0…

在龙芯笔记本电脑上安装loongnix20

在龙芯笔记本电脑上安装loongnix20。该笔记本电脑原来安装了统信操作系统20。使用时发现屏幕调到最暗还是偏亮。使用起来不方便。于是安装另外一款操作系统loongnix20。 于是下载loongnix20。下载速度很快。下载以后安装也比较顺利。装好试了一下&#xff0c;屏幕亮度可以调到…

二叉树中的最长交错路径

题目链接 二叉树中的最长交错路径 题目描述 注意点 每棵树最多有 50000 个节点每个节点的值在 [1, 100] 之间起点无需是根节点 解答思路 要找到最长交错路径&#xff0c;首先想到的是深度优先遍历因为起点无需是根节点&#xff0c;所以对于任意一个节点&#xff0c;其可以…

分类任务中评估模型性能的核心指标

在机器学习尤其是分类任务中&#xff0c;Accuracy&#xff08;准确率&#xff09;、Precision&#xff08;精确率&#xff09;、Recall&#xff08;召回率&#xff09;和F1 Score&#xff08;F1分数&#xff09;是评估模型性能的四个核心指标。每个指标都有其独特的含义和用途&…