第五讲:函数与类库

news2024/11/15 8:26:39

在这里插入图片描述

第五讲:函数与类库

  • 第五讲:函数与类库
    • 函数
      • 定义
      • 实参
      • 变量的作用域
      • 返回值
      • 代码复用
      • 创建和使用类
      • 继承
      • 导入类
    • 模块与库
      • 概念
      • 标准库
      • 第三方库

第五讲:函数与类库

函数

定义

函数就是代码块,只不过我们给这个代码块特地进行命名,固定住它以后就
用来干某个具体的工作。

当我们需要用程序多次执行同一项任务时,就会需要反复编写完成该任务的代码,这将会使我们的代码变得冗长繁杂,所以函数诞生了。我们只需要把这个需要反复编写的代码块定义为某个函数并命名,使用的时候只需要调用它的名字,即可反复执行任务。所以函数的优点是能够通过代码复用是的程序本身的编写、阅读、测试、修复和改进更加简易。

函数定义格式:
在这里插入图片描述

def text(id):
    a = id + "真厉害!"
    return print(a)

text("xqs")
text("123")
text("1234")

在这里插入图片描述

函数名为 text,参数为 id,函数作用为输出简单的称呼,函数体为 S = id + “真厉害!” ,返回值为 print(a) 。函数调用为text(“xqs”) text(“123”)。

实参与形参

函数text(id)要求给id指定一个值。当我们调用这个函数并给定值的时候,它就会输出感恩话语。
其实,在函数text(id)的定义中,变量id是一个形参——形式上的参数,即函数执行任务所需的一项信息。在函数调用text(“xqs”)的时候,我们向形参传递了一个实参——实际参数,即函数执行任务所拥有的一项信息——”xqs“,此时实参”xqs“被储存在形参id中。同理,函数调用text(“123”)时,实参"123"被储存在形参id中;函数调用text(“1234”)时,实参"1234"被储存在形参id中。

实参

由于函数定义中可能会含有多个形参,因此函数调用中也需要输入多个实参。向形参传递实参的方式主要有两种:位置实参和关键字实参。

  1. 位置参数
    在调用参数函数时,必须将每个形参都赋值为每个实参。最简单的关联方式是基于形参的位置顺序传递实参,这种关联方是成为位置参数。
def thank_you(something, name):
    R = "You help me with " + something + "." + name
    S = "Thank you," + name
    return print(R,S)

thank_you("Chinese","xqs")
thank_you("123","456")

这个函数定义为thank_you(something, name),形参顺序是something,name,正确的顺序是先"Chinese"后"xqs"。正确的实参传递是,第一个是You help me with Chinese . xqs;第二个是You help me with xqs . Chinese;

  1. 关键字参数
    由于形参顺序太难处理,我们就可以使用关键字参数方法。关键字参数方法是传递给函数一对——“形参名称-实参”,直接将形参和实参关联起来,因此不会出现顺序混淆导致的错误结果,并且能够指出函数调用各个值的意义。
def thank_you(something, name):
    R = "You help me with " + something + "." + name
    S = "Thank you," + name
    return print(R,S)

thank_you(something="Chinese",name="xqs")
thank_you(name="xqs",something="Chinese")

在这里插入图片描述

当我们指定了将 something 赋值为”Chinese”,将 name 赋值为”xqs”之后,不论顺序如何,都能够正确地输出结果。

变量的作用域

根据程序中变量所在的位置和作用域,分为局部变量和全局变量。

  1. 局部变量
    局部变量是指在函数内部定义的变量,仅在函数内部有效。
def thank_you(something, name):
    R = "You help me with " + something + "." + name
    S = "Thank you," + name
    return print(R,S)

thank_you(something="Chinese",name="xqs")
thank_you(name="xqs",something="Chinese")
print(R)

在这里插入图片描述

我们在函数外部使用函数内部变量 R 的时候,会提示 R 没有定义,即不存在。

  1. 全局变量
    全局变量是指在函数外部定义的变量,在整个程序中有效。若要在函数内部使用全局变量,则分为两种情况:一是单纯引用,则不需要任何操作;二是需要在函数内部修改全局变量,则需要提前使用保留字 global 声明。
    在这里插入图片描述
    在这里插入图片描述

返回值

在这里插入图片描述

函数没有返回值,因此打印输出的结果为 None

在这里插入图片描述

函数加上了 return 返回了立方值,因此打印输出结果为 8。

代码复用

  1. 简单的代码复用
    编写函数称为封装,执行函数称为调用,代码复用即将封装起来的函数进行调用。
def text(x):
    a = x**3
    print(a)

def thank_you(something, name):
    R = "You help me with " + something + "." + name
    S = "Thank you," + name
    return print(R,S)

text(2)
thank_you(something="2的立方值",name="xqs")

text(5)
thank_you(name="xqs",something="5的立方值")

在这里插入图片描述

先封装两个函数,然后分别进行调用。

  1. 将函数储存在模块
    将函数储存在模块中,再将模块导入主程序。通过将函数储存在独立文件中,可以把重点放在程序的更高层逻辑上。还能帮助我们在其他程序编写中使用此函数,还可以将此函数分享给其他程序员,同样地还可以使用其他程序员编写的函数库。

首先创建模块,模块是扩展名为.py 的文件,其中为封装好的函数。xqs.py 即为模块我们创建的摸块。
(1) 导入整个模块
当我们导入整个模块之后,那么模块包含的函数就可以使用了。

在同一个文件夹下创建了一个求立方和表示感谢的 py 文件,在这个文件中导入刚才创建的模块,再进行函数调用,可以发现这些代码运行正确。这种导入整个模块再进行函数调用的方法总结为:
在这里插入图片描述
在这里插入图片描述
(2) 导入指定函数
如果整个模块有许多函数,而我们只需要其中的一、两个函数,那么我们可以指定函数名进行特定导入。这种导入指定函数的方法总结为:
在这里插入图片描述

在这里插入图片描述
(3) 使用 as 给模块指定别名
我们的模块名为“xqs”,稍显冗长。我们可以给他指定一个缩写名,方便使用,可以得到一样的运行结果。这种以别名导入模块的方法总结为:
在这里插入图片描述
在这里插入图片描述

(4) 使用 as 给函数指定别名
我们的函数名为“thank_you”,稍显冗长。我们可以给他指定一个缩写名,方便使用。
在这里插入图片描述
在这里插入图片描述

(5) 导入模块中的所有函数
使用(*)符号可以导入模块中的所有函数,如果模块不是自己写的,由于函数名很可能会重复,所以出现一些意想不到的结果。导入模块中的所有函数的方法总结为:
在这里插入图片描述
在这里插入图片描述

综上,代码复用最为推荐以上的第(3)种方式——使用 as 给模块指定别名,这样会减少出错概率,并且使代码更为清晰、更加容易阅读和理解。

类就是对象的抽象式汇总,基于类创建对象的时候,每个对象都具有类的通用属性,在获得通用属性的基础上,可根据需要赋予对象以个性。

创建和使用类

  1. 创建类

现在创建一个表示猫咪的简单类 Cat(习惯上类的命名一般都是开头字母大写)。想象一下猫咪,能联想到的共性是两条信息(名字、胖瘦)和两种动作(舔毛、踩奶),所以我们创建的 Cat 类将包含他们。

Cat类的语法结构:
在这里插入图片描述
具体解释:

第 1 行,类的命名应为首字母大写,括号内是空的;
第 2 行,我们对这个类的功能进行了说明;
第 4 行,我们开始在类中编写函数,实际上除了上文中的模块,类是函数的另一种汇总方式,在类中的函数我们称为方法。
显然在这个类中有三种方法,首先是第 4 行的__ini__()方法,然后是第 9 行的舔毛()方法,再是第 13 行的踩奶()方法。其中__ini__()方法是类中特有的默认的方法,每当我们根据 Cat 类创建新实例时,Python 都会自动运行它。注意它的开头末尾各有两个下划线,这是默认约定,能够避免与我们定义的普通函数发生命名冲突。
单独对__ini__()方法进行剖析,在此方法中包含了三个形参:self、name 和身材。首先,形参 self 不可缺失且必须位于参数最前。具体原因不必深究,这么做的目的是可以理解为方便自己引用自己。再之,对于形参 self,我们不需要传递实参。最后,对于后面两个形参,每次创建 Cat 类实例时,都需要给他俩提供实参。
对于另外两个方法:舔毛()和踩奶()。由于这些方法是单独定义的,因此不需要额外的信息,因此只需要一个形参 self。在这里,舔毛()和踩奶()只是打印一条信息说明猫咪是在作出行为,但是随着学习我们可以编写一个动画真正实现。

class Cat():
    def __init__(self, name, 身材):
        self.name = name
        self.身材 = 身材

    def 舔毛(self):
        print(self.name + "正在舔毛")

    def 踩奶(self):
        print(self.name + "正在踩奶")
  1. 实例化

接下来将 Cat 类实例化,即创建一个表示特定猫咪的实例,它的名字叫咪咪,身材属性是胖。

class Cat():
    def __init__(self, name, 身材):
        self.name = name
        self.身材 = 身材

    def 舔毛(self):
        print(self.name + "正在舔毛")

    def 踩奶(self):
        print(self.name + "正在踩奶")

my_cat = Cat("咪咪","胖")

(1)访问属性

self.name 和 self.身材是 Cat 类中的属性,舔毛()和踩奶()是 Cat类中的方法。访问属性时采用句点表示法:
在这里插入图片描述

class Cat():
    def __init__(self, name, 身材):
        self.name = name
        self.身材 = 身材

    def 舔毛(self):
        print(self.name + "正在舔毛")

    def 踩奶(self):
        print(self.name + "正在踩奶")

my_cat = Cat("咪咪","胖")

print("My cat's name is " + my_cat.name + ".")
print("我的小猫咪身材" + my_cat.身材 + "。")

加粗样式
(2)调用方法

调用方法时,也采用句点表示法:
在这里插入图片描述

class Cat():
    def __init__(self, name, 身材):
        self.name = name
        self.身材 = 身材

    def 舔毛(self):
        print(self.name + "正在舔毛")

    def 踩奶(self):
        print(self.name + "正在踩奶")

my_cat = Cat("咪咪","胖")

my_cat.舔毛()
my_cat.踩奶()

在这里插入图片描述
(3)创建多个实例

我们可根据需求创建其他的实例,比如你也有一只猫,那我也可以把你的猫实例化。

class Cat():
    def __init__(self, name, 身材):
        self.name = name
        self.身材 = 身材

    def 舔毛(self):
        print(self.name + "正在舔毛")

    def 踩奶(self):
        print(self.name + "正在踩奶")

my_cat = Cat("咪咪","胖")
print("My cat's name is" + my_cat.name + ".")
print("我的小猫咪身材" + my_cat.身材 + "。")
my_cat.踩奶()

your_cat = Cat("喵喵","瘦")
print("My cat's name is" + my_cat.name + ".")
print("我的小猫咪身材" + my_cat.身材 + "。")
your_cat.舔毛()

继承

  1. 继承父类

如果要编写的类是另一个已经编号的类的特殊版本,那么就可以使用继承。类 a 继承另一个类 A 的时候,将自动获得类 A 的所有属性和方法;原有的类 A 成为父类,新类 a 成为子类。子类除了继承其父类的所有属性和方法之外,还可以定义自己的属性和方法。

例如,模拟英短猫这个品种的猫咪,我们可以在前面创建的 Cat 类基础上创建新类 EdCat,只需要为英短猫特有的属性和行为编写代码。具体来说,EdCat 子类的创建首要完成任务是获得父类 Cat 类的属性,因此需要如下结构形式:首先是 Cat 类代码。创建子类时,父类必须包含在当前文件中,且位于子类前面。接着开始定义子类 EdCat(),括号中必须包含父类名。__init__方法中接受创建 Cat 实例所需信息,super()是一个能够将父类和子类关联的特殊函数,完成继承。
为了测试继承是否成功,创建了my_edcat英短猫my_edcat并输出其身材,发现其与猫咪信息相同,具备猫咪的属性,所以继承成功。

class Cat():
    def __init__(self, name, 身材):
        self.name = name
        self.身材 = 身材

    def 舔毛(self):
        print(self.name + "正在舔毛")

    def 踩奶(self):
        print(self.name + "正在踩奶")

class EdCat(Cat):
    def __init__ (self,name,身材):
        super().__init__(name,身材)

my_edcat = EdCat("咪咪","胖")
print(my_edcat.身材)

在这里插入图片描述

  1. 子类定义新属性和方法

子类继承了父类属性之后,可添加一些子类特有的新属性和方法。
以英短猫为例,添加新属性以及一个相关联的方法。新属性为英短猫特点以及描述特点的方法。

class Cat():
    def __init__(self, name, 身材):
        self.name = name
        self.身材 = 身材

    def 舔毛(self):
        print(self.name + "正在舔毛")

    def 踩奶(self):
        print(self.name + "正在踩奶")

class EdCat(Cat):
    def __init__ (self,name,身材):
        super().__init__(name,身材)
        self.英短特点 = "圆脸尖耳,好奇心强,与人亲近"

    def 描述_英短特点(self):
        print("英短猫的特点是:" + self.英短特点 + "。")

my_edcat = EdCat("咪咪","胖")
my_edcat.描述_英短特点()

在这里插入图片描述

代码注释:

第 15 行是新属性,第 17 行是与新属性相关联的新方法,第 21 行是调用新方法,运行结果说明新属性和新方法定义成功。如果有需要还可以添加其他新属性与方法,来更加清晰地定义英短猫的类,Python 并无限制。

  1. 重写父类方法

某些父类方法可能不符合子类的特性,我们可以对其进行重写。只要在子类中定义一个与父类重名的方法,Python 在运行时将不会考虑父类方法,而直接选择子类定义的相应方法作为运行对象。
比如 Cat()类中有一个踩奶()的方法,对于英短来说,没有瘦的,都是胖圆健硕的,所以要重写方法。

class Cat():
    def __init__(self, name, 身材):
        self.name = name
        self.身材 = 身材

    def 舔毛(self):
        print(self.name + "正在舔毛")

    def 踩奶(self):
        print(self.name + "正在踩奶")

class EdCat(Cat):
    def __init__ (self,name,身材):
        super().__init__(name,身材)
        self.英短特点 = "圆脸尖耳,好奇心强,与人亲近"

    def 描述_英短特点(self):
        print("英短猫的特点是:" + self.英短特点 + "。")

    def 踩奶(self):
        print(self.name + "英短踩奶")

my_edcat = EdCat("咪咪","胖")
my_edcat.踩奶()

在这里插入图片描述

导入类

为了让代码尽可能实现这个理念,python 允许将类存储在模块中,在主程序中导入所需模块简化代码。上一小节讲了函数可以存储在模块中简化代码,这一节将讲述将类存储在模块中简化代码。

  1. 导入单个类
    (1) 创建包含单个类的模块

首先创建一个只包含 Cat()类的模块,代码与之前的 Cat()类完全相同,区别只是我们将其存储在 cat.py 的模块中。

在这里插入图片描述

(2) 导入单个类

紧接着我们导入 Cat()类并将其实例化,用 from <模块名> import <类名> 语句打开模块 cat 并导入其中的 Cat()类。
PS:如果这个 my_cat.py 文件中包含了整个 Cat 类,它的长度像之前所展示的,非常之长。但是通过将类转移到模块中,编写代码时,导入该模块,就可以使用其所有功能,主程序代码将会整洁易读。从代码编写过程中的逻辑思维来讲,底层逻辑将会被储存在模块这种独立文件中,我们就能够专注于更高层的逻辑。

import cat
my_cat = cat.Cat("咪咪","胖胖")
my_cat.踩奶()
print("\n")
my_edcat = cat.EdCat("哈哈","健硕")
my_edcat.踩奶()

在这里插入图片描述

  1. 导入多个类
    (1) 创建包含多个类的模块

首先创建一个包含 Cat()类和 EdCat()类的模块,既可以模拟猫,也可以模拟英短猫。代码与之前的 Cat()类和 EdCat()类完全相同,区别只是我们将其存储在cat.py 的模块中。

在这里插入图片描述

(2) 导入多个类

我们要在同一个程序中创建猫咪和英短猫咪,因此我们同事导入 Cat()和EdCat()两个类,导入相应的类之后,就可以根据需要创建任意数量的实例,在这个示例中,我们创建了一只叫咪咪的小猫咪和一只叫哈哈的英短猫咪。

from cat import Cat, EdCat

my_cat= Cat("咪咪","胖胖")
print("My cat's name is " + my_cat.name + ".")
print("我的小猫咪身村" + my_cat.身材 + "的。")
my_cat.踩奶()

print("\n")

my_edcat = EdCat("哈哈","健硕")
print("我的英短的名字是" + my_edcat.name + "。")
my_edcat.踩奶()
my_edcat.描述_英短特点()

在这里插入图片描述

  1. 导入整个模块
    (1)导入整个模块

导入整个模块之后,使用句点表示法访问需要的类。

import cat
my_cat = cat.Cat("咪咪","胖胖")
my_cat.踩奶()
print("\n")
my_edcat = cat.EdCat("哈哈","健硕")
my_edcat.踩奶()

(2)导入模块中的所有类

与之前的导入模块中的所有函数相同,使用语法为:
在这里插入图片描述

这种方式不推荐,因此不列举具体示例。
不推荐的原因有两点:一是不能清除地知道程序使用了哪些类,二是有可能会出现相同命名的名称。

模块与库

概念

  1. 模块
    模块即一组函数或者一组类,它的作用是将函数或者类成组地保存为独立文件,方便我们更专注于程序编写的更高层逻辑。

  2. 库即一组模块,它的作用是将模块成组地保存为独立文件,方便我们更专注于程序编写的更更高层逻辑。

前面 4 讲所学的普通程序语句是最底层,后面的函数和类算是平级(但是类中可以包含多个方法,类中方法即函数),类稍大一级,都归于中层,再后面的模块是高层,最后是超高层——库。
在这里插入图片描述

标准库

库分为标准库和第三方库,标准库是 Python 内置的,无需安装;第三方库则是由国内外大神自己开发的开源使用的库,需要安装。

  1. turtle 库
    turtle(海龟)是一个能够进行图形绘制的库,它的绘制概念非常直观——turtle 小海龟在笛卡尔直角坐标系中爬行,其爬行轨迹形成了图形。小海龟最初位于坐标系原点(0, 0),前进方向为 X 轴正向,小海龟有有“前进”、“旋转”、“后退”等爬行操作,如,输入以下代码,“小海龟”正在向前爬 1000个像素。
import turtle
turtle.forward(1000)

在这里插入图片描述
下面介绍一道 Python 二级真题,让我们来看看具体如何考察?
考生文件夹下存在一个文件 PY201.py,请写代码替换横线,不修改其他代码,实现以下功能:【10 分】
使用turtle库的turt1e.right()函数和turt1e.fd()函数绘制一个正方形,
边长为 200 像素,效果如图所示。
在这里插入图片描述

import turtle

#方法一
d = 0
for i in range(4):
    turtle.fd(200)
    d += 90
    turtle.seth(d)

#方法二
for i in range(1,5):
    turtle.fd(200)
    turtle.seth(90*i)

#方法三
for i in range(4):
    turtle.fd(200)
    turtle.seth(90)

turtle.fd()是前进函数,turtle.seth()函数可以改变海龟的行进方向(角度按逆时针)。方法二是一个 for 循环,不做过多解释;方法三中turtle.left()函数也可以改变海龟的行进方向(角度按逆时针)。

  1. random 库
    Python 提供的 random 库可用于产生各种分布的伪随机数序列。在random 库中,最基本的函数random.random(),它能够胜出一个[0.0, 1.0)之间的随机小数。
    在这里插入图片描述
    下面是一道 Python 二级真题,让我们来看看具体如何考察?
    考生文件夹下存在一个文件 PY103.py,请写代码替换横线,不修改其他代码,题目要求如图 5.36,实现以下功能:【5 分】
  • 以 123 为随机数种子,随机生成 10 个在 1(含)到 999(含)之间的随机数,每个随机数后跟随一个逗号进行分隔,屏幕输出这 10 个随机数
  • random.seed()是产生随机数种子的函数,random.randint()函数可以在某个数字范围内产生随机数,end 参数可以在每个输出结果后面进行逗号分隔。

在这里插入图片描述

第三方库

从 Python 实用性角度来讲,随着我们对 Python 的理解更深、应用更广,肯定会安装各种各样的第三方库,这些库都是大神免费开发并提供给我们使用的宝贵财富。比如我们在处理 Excel 表格时,会用到 openpyxl 库、xlsxwriter 库、数据处理库 numpy 和 pandas、包括画图库 matplotlib;在开发网站时,会用到 Django库;在编写爬虫时,会用到 Scrapy 库、requests 库、re 库;在科学数据处理时,会用到 scipy 库等等。

  1. 下载并安装(pip)
    如同 Python 编程之前需要安装 Python 编译器一样,使用第三方库之前首先要进行第三方库的下载与安装。在此仅提供一种最为简便、实用、好用的方法,即 pip 安装,使用方法是使用 win+R 键或者在开始菜单右键打开运行对话框,输入 cmd,打开命令提示符,然后输入一行命令:
    在这里插入图片描述
    以安装 numpy 库为例
    在这里插入图片描述
  2. 更换服务器
    在这里插入图片描述

(1)临时性地更换服务器
这个方法操作非常简便,适用于新手和下载库较少的学习者。在原来 pip install <库名>的基础上加上这么一行:
在这里插入图片描述
(2)永久更换服务器
以清华大学服务器为例,介绍如何永久更换,也比较简单,是个一劳永逸的办法,也是三部曲:
(a)进入自己的系统用户名文件夹
(b)创建 pip 文件夹
(c)创建 pip.ini 文件并进行编辑如下内容:
在这里插入图片描述

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

在这里插入图片描述
3. jieba 库
jieba(“结巴”)库是用于中文文本处理、对文本词语分割的库。
在这里插入图片描述

各个领域第三方库的名称进行了解
在这里插入图片描述

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

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

相关文章

2023年哪个前端框架用的最多?

2023 年&#xff0c;TypeScript 的每月下载量持续稳定增长&#xff0c;年度累计下载量高达2,071,832,110&#xff08;20.7 亿&#xff09;&#xff0c;展现了强大的市场需求和用户认可。 本文来通过详细的数据&#xff08;2023 年 npm 累计下载量&#xff09;&#xff0c;看看…

vio参数文件内相机imu参数的修改

imu标定工具 https://github.com/mintar/imu_utils网络上有各种IMU校准工具和校准教程&#xff0c;曾经花费了巨大精力跟着各种教程去跑校准。 然而&#xff0c;标定使用的数据都是在静止状态下录制的&#xff0c;我们在使用vio或者imu-cam联合标定的时候&#xff0c;imu确是处…

Activity的启动流程

小伙伴们面试的时候是不是被问过Activity的启动流程很多啊。那我们就来看看吧。个人感觉这类文章代码细节太多&#xff0c;反而容易迷失在源码调用之中&#xff0c;从而忽略了Activity启动过程的本质。所以本文就简单地定性地对Activity启动过程进行描述&#xff0c;不会贴上大…

微软的Copilot for Sales(销售助手)和Copilot for Service(服务助手)现已全面开放

深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领域的领跑者。点击订阅&#xff0c;与未来同行&#xff01; 订阅&#xff1a;https://rengongzhineng.io/ 。 微…

Redis 的持久化机制是什么?各自的优缺点?

Redis 提供两种持久化机制 RDB&#xff08;默认&#xff09; 和 AOF 机制: RDB&#xff1a;是Redis DataBase缩写快照 RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中&#xff0c;对应产生的数据文件为dump.rdb。通过配置文件中的save参数来…

vulhub中Adminer ElasticSearch 和 ClickHouse 错误页面SSRF漏洞复现(CVE-2021-21311)

Adminer是一个PHP编写的开源数据库管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等数据库。 在其4.0.0到4.7.9版本之间&#xff0c;连接 ElasticSearch 和 ClickHouse 数据库时存在一处服务端请求伪造漏洞&#xff08…

【PCL】(九)点云体素下采样

&#xff08;九&#xff09;Filtering 体素下采样 点云样例&#xff1a; https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_lms400.pcd 以下程序实现对读取的点云进行体素下采样&#xff0c;并将得到的点云保存。 voxel_grid.cpp #include <…

Web APIs 1 DOM操作

Web APIs 1 引入&#xff1a;const优先Web API 基本认知01 作用和分类02 什么是DOM03 DOM树04 DOM对象 获取DOM对象01 根据CSS选择器获取02 其他获取DOM元素方法 操作元素内容01 innerText 属性02 innerHTML 属性 操作元素属性操作元素的常用属性操作元素的样式属性操作表单元素…

FPGA项目(15)——基于FPGA的DDS信号发生器

1.相关概念 DDS&#xff08;Direct Digital Synthesis&#xff0c;直接数字合成&#xff09;是一种通过数字技术生成精确频率和相位可调的信号的方法。它基于数字时钟和数值控制的方式&#xff0c;通过累加器、相位累积器和查表器等组件&#xff0c;以数字方式实现信号的频率和…

RK35x8-RTC(RX8025T)驱动加载

RTC芯片简介 RX8025-T是EPSON 推出的一款拥有I2C接口和温度补偿功能的新型实时时钟芯片&#xff0c;内部集成32.768KHz温度补偿晶体振荡器&#xff0c;可用于各种需要高精度时钟的场合。通过设置相应补偿的控制位&#xff0c;可以实现不同间隔的温度补偿功能&#xff0c;从而大…

聊聊并发编程,另送5本Golang并发编程新书

大家好&#xff0c;我是飞哥&#xff01; 并发编程并不是一个新话题&#xff0c;但是我觉得在近几年以及未来的时间里&#xff0c;并发编程将显得越来越重要。 为什么这样讲&#xff0c;让我们先回到一个基本的问题上来&#xff0c;为什么我们要采用并发编程&#xff1f;关于这…

Gson源码解读

一&#xff0c;概述 gson作为流行的json工具&#xff0c;笔者使用较多。本文主要目的是解读下Gson的源码实现&#xff0c;就没有然后了。 二&#xff0c;实例 实例如下图所示&#xff0c;笔者简单调用gson的toJson方法获得json字符串&#xff0c;fromJson则从json字符串解析…

基于单片机的造纸纸浆液位控制系统结构设计

摘要:为适应无人化与高效化制浆造纸生产体系&#xff0c;造纸企业趋于以嵌入式技术优化造纸过 程中的纸浆液位控制系统&#xff0c;以单片机与传感器相互耦合实现纸浆液位控制。本文基于单片机 设计了造纸纸浆液位控制系统&#xff0c;其结构由控制模块、信息采集模块、物联网模…

ASP.NET Core 自定义解压缩提供程序

写在前面 在了解ASP.NET Core 自定义请求解压缩中间件的应用时&#xff0c;依据官方文档操作下来碰到了几个问题&#xff0c;这边做个记录。 关键点就是配置 Content-Encoding&#xff0c;参数需要和代码中添加的提供程序的Key保持一致&#xff1b; builder.Services.AddRequ…

(bean配置类的注解开发)学习Spring的第十三天

bean配置类的注解开发 问题提出 用类充当配置文件 applicationcontext.xml : Configuration注解标识此类为配置类,替代原有xml文件 看原配置文件applicationcontext.xml代码 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http:/…

ctfshow——文件包含

文章目录 web 78——php伪协议第一种方法——php://input第二种方法——data://text/plain第三种方法——远程包含&#xff08;http://协议&#xff09; web 78——str_replace过滤字符php第一种方法——远程包含&#xff08;http://协议&#xff09;第二种方法——data://&…

FPGA项目(16)——基于FPGA的音乐演奏电路

1.设计要求 能在实验箱上&#xff0c;循环播放一段音乐。&#xff08;需要源码的直接看最后一节&#xff09; 2.设计原理 组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需要的两个基本要素&#xff0c;问题是如何来获取这两个要素所对应的数值以及通过纯硬件…

2024.2.3

单向循环链表的头插 头删 尾插和尾删 //头结点插入 Linklist insere_element(Linklist head,datatype element) {Linklist screat();s->dataelement;if(NULLhead){heads;}else{Linklist phead;while(p->next!head){pp->next;}s->nexthead;heads;p->nexthead;}r…

探索前端开发框架:React、Angular 和 Vue 的对决(一)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Linux下vim命令详解

vim #创建或编辑新的文件 #这将在当前目录下创建一个名为fi.txt的新文本文件。如果文件已经存在&#xff0c;将会编辑现有文件。 [rootsever ~]#vim fi.txt #对于普通的文本编辑操作&#xff0c;可以使用以下键盘命令&#xff1a; - i&#xff1a;进入插入模式&#xff…