【1】Anaconda基本命令以及相关工具:jupyter、numpy、Matplotilb

news2024/11/20 20:28:57

目录

一、Anaconda

◼ anaconda命令行操作

二、jupyter notebook

1 jupyter的基础使用

◼ jupyter的启动

◼ ipynb文件的新建、重命名、删除

◼  菜单说明

◼ 运行cell单元块

◼ 编写文档笔记

2 jupyter的高级使用:常用魔法命令

◼ writefile pycat run

◼ timeit time

◼ whos lsmagic magic

三、Numpy

1 Numpy基础:安装与性能对比

◼ 导入Numpy

◼ Numpy与原生Python的性能对比

2 Numpy数组创建:特定数组、等差数组、随机数组

◼ 创建数组以及Numpy数组的属性

◼ 创建等差数组

◼ 创建随机数组 


一、Anaconda

◼ anaconda命令行操作

conda -V	# 查看版本
conda update conda	 # 更新软件包

conda env list	 # 查看当前存在哪些虚拟环境
conda create -n your_env_name python=X.X	 # 创建虚拟环境
conda activate your_env_name	# 激活虚拟环境
conda deactivate	# 退出虚拟环境
conda remove -n your_env_name --all	  # 先退出虚拟环境,再删除虚拟环境以及其各种依赖包

conda list	 # 查看当前安装的依赖包
conda install package_name    # 安装依赖包
conda search package_name    # 搜索依赖包的版本
conda uninstall python_pakage    # 卸载依赖包
conda remove --name your_env_name package_name    # 卸载某个虚拟环境中的依赖包

二、jupyter notebook

Jupyter Notebook 是一款开源 Web 应用程序,可用于创建和共享包含实时代码、方程式、可视化和文本的文档。Jupyter 附带 IPython 内核,允许使用 Python 编写程序,但目前还有 100 多个其他内核可供使用。

(1)首先说一下交互式

jupyter notebook中一个非常重要的概念就是cell,每个cell能够单独进行运算,这样适合于代码调试。

我们开发一个完整的脚本时变量会随着代码执行的结束而从内存中释放,如果我们想看中间的变量或者结构,我们只能通过断点或者输出日志信息的方式进行调试,这样无疑是非常繁琐的,如果一个程序运行很多这种方式还可行,如果运行时间长达几个小时,这样我们调试一圈耗费的时间就太长了。

而在jupyter notebook中我们可以把代码分隔到不同的cell里逐个进行调试,这样它会持续化变量的值,我们可以交互式的在不同cell里获取到我们想要测试的变量值和类型。

(2)然后说一下富文本

开发代码不仅是给机器去“阅读”,也需要让其他的同事、同学能够很容易的阅读,因此,注释就在开发过程中变的非常重要,一个完善的注释能够让周围人更加容易理解,协作效率也更高,避免重复性劳动。在大多数IDE中都可以进行注释,但是几乎都是相同的,只支持一些简单的文本格式注释,这显然是不够的,jupyter notebook支持Markdown编辑,它的cell不仅可以用于编码,还可以用于书写文本,Markdown可以轻松完成标题、数学公式等格式的编辑,更加有助于解释代码,适用于教学等场景。

(3)最后在说一下轻量、触手可及

开发过程中我经常需要测试一个小的代码块或者函数,这时候有两个选择:

  • 在IDE中新建一个测试脚本;
  • 打开命令行下的Python。

我觉得这两个都不是好的选择,如果在项目下新建一个脚本后续还需要记住把它清理掉,如果写一个完善的测试脚本用于Alpha、beta测试这显然是低效不现实的。而选择在命令行下,界面不友好,操作不灵活,体验更差。

这时候就显现出jupyter notebook的优势,只需要输入jupyter notebook就会在流量器中打开一个网页,能轻量、快捷的进行开发验证,效率很好。

此外,我们还可以通过搭建jupyter notebook服务使得它一直在服务器下运行来避免每次需要时都要在命令行下重复打开,我们只需要在浏览器打开对应的网页即可,这一点下文会详细介绍。

(4)其实,除了这些我们耳熟能详的优点之外,jupyter还有很多令人惊叹的亮点:

  • 丰富的插件
  • 主题修改
  • 多语言支持

1 jupyter的基础使用

 ◼ jupyter的启动

命令行输入命令jupyter notebook

conda install jupyter notebook    # 安装jupyter notebook内核
jupyter notebook    # 输入之后回车:启动jupyter notebook
				    # Ctrl + c:关闭jupyter notebook

或者直接点击“jupyter notebook”,也可以进入,

 

◼ ipynb文件的新建、重命名、删除

启动 Notebook 服务器之后就可以开始创建笔记了。

在base下的jupyter notebook换好文件夹之后打开如下,会弹出一个新的网页选项卡。

页面顶部是Untitled一词,这是页面的标题和笔记本的默认名称,是可以修改的。 

◼  菜单说明

  • -『File』,可以创建一个新的笔记本或打开一个预先存在的笔记本。这也是重命名笔记本的地方。菜单项 Save and Checkpoint 这允许创建可以在需要时回滚的检查点。
  • - 『Edit』,剪切、复制和粘贴单元格内容。也可以删除、拆分或合并单元格,也可以在此处重新排序单元格。此菜单中的某些项目是灰色的,原因是它们不适用于当前选定的单元格。
  • - 『View』,用于切换标题和工具栏。还可以打开或关闭单元格内的行号。
  • - 『Insert』,插入菜单仅用于在当前选定单元格的上方或下方插入单元格。
  • - 『Cell』,允许运行一个单元、一组单元或所有单元。也可以在这里更改单元格的类型。另一个方便的功能是能够清除单元格的输出。如果打算与其他人共享的笔记可能需要先清除输出,以便下一个人可以自己运行单元格。内核单元用于处理在后台运行的内核,可以重新启动内核、重新连接、关闭,甚至更改的 Notebook 正在使用的内核。
  • - 『Kernel』,在调试笔记本时会发现需要重新启动内核。
  • - 『Widgets』,小部件菜单用于保存和清除小部件状态。小部件基本上是JavaScript小部件,可以将其添加到单元格中,以使用 Python(或其他内核)制作动态内容。
  • - 『Help』,可以了解 Notebook 的键盘快捷键、用户界面导览和大量参考资料。

选项卡操作注意:使用 Jupyter 的时候切记不要关闭 shell 命令行窗口,关闭时需要确保数据已经保存。

◼ 运行cell单元块

(1)运行代码单元:将代码添加到该单元格,点击上方的“Run”,或者可以使用 Shift+Enter 执行。

运行单元格时单元格左侧的 [n] 。方括号将自动填充一个数字,该数字指示运行单元格的顺序。例如打开一个新笔记本并运行笔记本顶部的第一个单元格,则方括号将填充数字1。

(1) 执行当前ipynb文件中的所有cell,

 

◼ 编写文档笔记

Jupyter Notebook 支持 Markdown,是一种标记语言,是 HTML 的超集。

(1)选择“Markdown”,将新单元格设置为 Markdown,然后将以下文本添加到单元格中。

(2)输入“Hello World”,按住shift + enter执行,以文档形式呈现,

(3)其他格式:

  • 正文:什么都不加;
  • 标头:使用 # 创建标题,也可以用于区分目录层级;
  • 加粗:**;
  • 创建列表:使用破折号(-)、加号(+)或星号(*)来创建列表;
  • 超链接:[]
  • 图片:!
  • 行内公式:$
  • 独立公式:$$

 执行结果,

 (4)如果我们想把它变成单元块,只需要修改cell的type就可以了。

 

2 jupyter的高级使用:常用魔法命令

◼ writefile pycat run

%%writefile保存cell内容到外部文件。

%pycat正好相反,导出单元格的内容/显示外部脚本的内容。

%run,执行python代码

(1)%%writefile方法可以将脚本代码写入本地Py文件。

将当前cell的所有内容输出到指定的文件中,

%%writefile test.py
def Test(name):
    print("Test", name, "success")

 (2)

%pycat test.py

可以看到,jupyter在下面将我们刚写好输入到文件中的内容显示出来了,

(3)%run,在notebook中可以直接执行Py文件,通过%run方法来实现。

%run test.py
Test("Jupyter")

还有一些其他调用方法,

 

◼ timeit time

%time%timeit:计算当前行的代码运行时间。

  • %time 的计算结果包括:CPU time(CPU运行程序的时间), Wall time(Wall Clock Time,墙上挂钟的时间,也就是我们感受到的总的运行时间)。
  • %timeit:计时更为精确,这一命令会运行代码 r 次,每次 n 遍,再对 n*r 遍的结果取平均后,得到运行一遍代码的时间。
    • 会根据执行代码的不同,动态调整设定次数

(1)可能你的代码需要精确的时间控制,如果要评估单条语句的运行时间,那么%timeit方法可以帮到你,

(2)如果要评估整个cell的运行时间,需要使用%%timeit,

(3)timeit会根据执行代码的不同,动态调整设定次数。那么我们如果不想测那么多次,只测一次就可以了, 我们需要把timeit改成time就可以了,而且用法与timeit一样。

◼ whos lsmagic magic

(1)whos可以将前面引入的包、定义的函数和变量都打印出来,同时可以看到其对应的值。

(2)如果我们想查询更多的魔法命令,可以输入%lsmagic 执行 。

(3)如果想要看具体的魔法命令,可以输入%magic 执行。

 

三、Numpy

Python 库 —— NumPy,是 Python 科学计算的基本包,几乎所有用 Python 工作的科学家都利用了的强大功能。此外,它也广泛应用在开源的项目中,如:PandasSeabornMatplotlibscikit-learn等。

1 Numpy基础:安装与性能对比

◼ 导入Numpy

import的时候没有出现任何报错信息,说明运行成功了。

◼ Numpy与原生Python的性能对比

数组x是由 1~n数字组成,我们求数组x的中所有数的平方之和。

n = 1000000

(1)先用Python原生语法实现,求数组x的中所有数的平方之和。

(2)Numpy实现,求数组x的中所有数的平方之和。

 (3)Numpy与原生Python的性能对比:

  •  Python本身含有列表和数组,由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。对于数值运算来说这种结构比较浪费内存和CPU资源。
  • Numpy中的np.arange会限制数据的类型,这样的好处是在处理数据时会更高效;
  •  显而易见,numpy的运行所耗费的时间远远小于python,当然数量级越大这种差别就体现的越明显;

2 Numpy数组创建:特定数组、等差数组、随机数组

◼ 创建数组以及Numpy数组的属性

Numpy中定义的数组叫ndarray,n-dimensions-array 即:n维数组ndarray是存储单一数据类型的多维数组。

(1)用np.array()函数可以创建数组,

a就是数组,也是numpy.ndarray类对象,该类定义了几个常用的属性:

  • ndarray.ndim:维度的数量,二位数组ndim是 2;

  • ndarray.shape:表示数组的形状,每位代表该维度上元素个数;

  • ndarray.size:数组中元素总个数;

  • ndarray.dtype:返回数组中元素的数据类型;

  • ndarray.itemsize:数组中元素存储大小(以字节为单位);

a = np.array([[1,2,3], [4,5,6]])   # 创建ndarray数组

a   # 输出数组
array([[1, 2, 3],
       [4, 5, 6]])

a.ndim   # 维度的数量
2

a.shape   # 每位代表该维度上元素个数,元组长度
(2, 3)

a.size   # 数组中元素总数
6

a.dtype   # 数组中元素的数据类型
dtype('int64')

a.itemsize   # 数组中元素存储大小(以字节为单位)
8

(2)创建数组的便捷函数,

除了创建数组外,还有下面的方式创建数组,

"""创建以1填充的数组"""
np.ones(2) # 以1填充的一维数组
array([1., 1.])

np.ones((2,3)) # 以1填充的二维数组,默认创建浮点型数据类型float64
array([[1., 1., 1.],
       [1., 1., 1.]])

a = np.ones(8,dtype='int64') # 以1填充的二维数组,指定创建整型数据类型
array([1, 1, 1, 1, 1, 1, 1, 1])

np.ones_like(a) # 创建与a形状完全相同的二维数组
array([1, 1, 1, 1, 1, 1, 1, 1])

"""创建以0填充的数组"""
np.zeros(2) # 以0填充的一维数组
array([0., 0.])

a = np.zeros((2,3)) # 以0填充的二维数组
array([[0., 0., 0.],
       [0., 0., 0.]])

np.zeros_like(a) # 创建与a形状完全相同的二维数组
array([[0., 0., 0.],
       [0., 0., 0.]])


"""创建空的数组"""
np.empty(8) # 空的二维数组,内容为当时内存中的值
array([2.05186965e-316, 0.00000000e+000, 2.41907520e-312, 2.44029516e-312,
       2.29175545e-312, 2.27053550e-312, 8.48798317e-313, 8.70018275e-313])

a = np.empty((2,4))
array([[2.05186965e-316, 0.00000000e+000, 2.41907520e-312,
        2.44029516e-312],
       [2.29175545e-312, 2.27053550e-312, 8.48798317e-313,
        8.70018275e-313]])

np.empty_like(a)
array([[2.05186965e-316, 0.00000000e+000, 2.41907520e-312, 0],
       [2.29175545e-312, 2.27053550e-312, 0, 0]])


"""创建full填充的数组"""
np.full(8,666)  # 创建666填充的数组
array([666, 666, 666, 666, 666, 666, 666, 666])

a = np.full((2,4),666)
array([[666, 666, 666, 666],
       [666, 666, 666, 666]])
 
np.full_like(a, 666)   # 创建与a形状完全相同的二维数组
array([[666, 666, 666, 666],
       [666, 666, 666, 666]])

◼ 创建等差数组

"""创建等差数组"""
np.arange(6)   # 创建等差数组,用法跟range函数一样
array([0, 1, 2, 3, 4, 5])

np.arange(1,10,2)  # 创建等差数组,起始为1,终止为10,步长为2(默认为1)
array([1, 3, 5, 7, 9])

np.arange(10).reshape(2,5)  # reshape改变数据的形状为2行5列
array([ 0. ,  2.5,  5. ,  7.5, 10. ])


np.linspace(0, 10, num=5) # 创建等差数组,以指定的线性间隔为初值,在0~10(包含)的范围区间内一共生成5个数
array([ 0. ,  2.5,  5. ,  7.5, 10. ])

◼ 创建随机数组 

"""创建随机数数组"""
# random
np.random.random()  # 返回0~1(不包含)之间的随机数
0.6160962522468241

np.random.random(5)  # 返回5个0~1(不包含)之间的随机数
array([0.84127341, 0.48222372, 0.90828922, 0.36954664, 0.22532067])

np.random.random((2,4))  # 返回2行4列个0~1(不包含)之间的随机数
array([[0.27181514, 0.15703565, 0.31419621, 0.08382473],
       [0.54159785, 0.63871858, 0.66251797, 0.62471311]])


rng = np.random.default_rng(0) # 以随机数创建二维数组
rng.random((2,3))
array([[0.63696169, 0.26978671, 0.04097352],
       [0.01652764, 0.81327024, 0.91275558]])

 

# rand
np.random.rand()  # 返回0~1(不包含)之间的随机数
0.8774587965932436

np.random.rand(5)  # 返回5个0~1(不包含)之间的随机数
array([0.13384554, 0.21306594, 0.30306473, 0.18566478, 0.69966918])

np.random.rand(2,4,3)  # 三维数组,0~1(不包含)之间的随机数
array([[[0.59717132, 0.00826123, 0.29273091],
        [0.37695511, 0.47300885, 0.4161377 ],
        [0.10521003, 0.45477703, 0.38927769],
        [0.96095509, 0.52454654, 0.55049337]],

       [[0.79916878, 0.03631291, 0.93487382],
        [0.251527  , 0.42738936, 0.8647998 ],
        [0.32140807, 0.06587076, 0.72579955],
        [0.1023671 , 0.05277878, 0.64963486]]])



# randint
np.random.randint(5)  # 返回0~5(不包含)之间的随机整数
1

np.random.randint(5,10)  # 返回5(包含)~10(不包含)之间的随机整数
9

np.random.randint(5,10,size=8)  # 返回8个5(包含)~10(不包含)之间的随机整数
array([6, 5, 5, 5, 6, 9, 6, 6])

np.random.randint(5,10,size=(2,4))  # 返回2行4列的5(包含)~10(不包含)之间的随机整数数组
array([[8, 6, 5, 7],
       [9, 5, 9, 9]])



# seed
np.random.seed(666)  # 设置随机种子,传入666

np.random.randint(5,10,size=(2,4))  # 多运行几次,可以看到每次运行的结果都会一样
array([[9, 7, 6, 9],
       [8, 8, 9, 9]])
# randn:返回具有标准正态分布的随机数,标准差为1
np.random.randn(5)    # 返回5个具有标准正态分布的随机数的一维数组
array([ 0.01902826, -0.94376106,  0.64057315, -0.78644317,  0.60886999])

np.random.randn(2,4)    # 返回2行4列个具有标准正态分布的随机数二维数组
array([[-0.93101185,  0.97822225, -0.73691806, -0.29873262],
       [-0.46058737, -1.08879299, -0.57577075, -1.68290077]])


# normal
np.random.normal()    # 默认均值为0,方差为1的随机数
0.2291852477040214

np.random.normal(10,100,20)    # 设置均值为10,标准差为1000,生成20个数
array([-165.66252234,   94.46326187,   37.72198634,   95.2901533 ,
         29.4599603 ,  141.06377157,  164.38436001,  -42.90480243,
        -55.64722973,  -10.15057011,  -60.06158328,   78.71379544,
          7.39242436,  -72.97583197,   39.65537839,  -21.26795036,
        -51.13012744,  -72.17515048,   99.71227031,   23.60786118])

np.random.normal(10,100,size=(4,5))    # 设置均值为10,标准差为1000,生成4行5列个数
array([[ -15.86548011,  121.07656409,   -8.84243873,    5.85107071,
         -88.47919123],
       [-125.22817585,   29.43238455,   36.72393512,  -32.64736981,
         154.77350574],
       [  -9.63061002,  161.814514  ,   17.72218828,    3.60086759,
         104.59234072],
       [ 130.40910055,  -35.12407353, -148.74465098, -176.88554809,
          20.03773732]])
# uniform:返回具有均匀分布的随机数
np.random.uniform()    # 返回具有均匀分布的0~1之间(左闭右开)的随机数
0.5018935081312759

np.random.uniform(1,5)    # 生成具有均匀分布的1~5之间(左闭右开)的随机数
2.993092519645257

np.random.uniform(1,5,(3,4))    # 生成3行4列个具有均匀分布的1~5之间(左闭右开)的随机数
array([[1.4150861 , 2.78577246, 4.87675667, 3.95388449],
       [3.87820243, 4.57217355, 4.85069873, 1.78820091],
       [3.85835986, 1.64769576, 4.46501909, 3.49528099]])

如果我们忘记了uniform函数功能,我们可以使用该条代码来查看详细的文档,具体参数的含义,下面还有例子。

np.random.uniform?

 如果不喜欢弹出的方式查看文档,我们也可以使用help。

help(np.random.uniform)

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

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

相关文章

【Golang】来用GoLand开发第一个Go程序

​ 📓推荐网站(不断完善中):个人博客 ​ 📌个人主页:个人主页 ​ 👉相关专栏:CSDN专栏、个人专栏 ​ 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 文章目录&#x1f34a…

【JAVA程序设计】基于JAVA的坦克大战小游戏--入门级小游戏

基于JAVA的坦克大战小游戏--入门级小游戏零、项目获取一、项目简介二、开发环境三、游戏玩法四、运行截图零、项目获取 获取方式(点击下载):是云猿实战 项目经过多人测试运行,可以确保100%成功运行。 一、项目简介 本项目是基于…

基于Java+Spring+Strusts2+Hibernate 社区智慧养老服务平台 系统设计与实现

一.项目介绍 本系统分为前端 和 后端 两块, 前端包括:首页、健康新闻、疾病预防、养生之道、动态通知、登录和注册 各模块的文章点击查看,支持评论以及回复功能, 登录成功之后点击欢迎您:后面的账号即可进入后台管理 后端包括&…

老杨说运维 | 非常重要,事关转型

《荀子》有云:“水能载舟,亦能覆舟。”在公司日常运营过程中,数据指标就像是水,孕育着生命,承载着万物。科学的数据指标能指引公司在正确的道路上不断前进,使平淡无常的业务焕发新生,而不合理的…

Qt QUndoStack、QUndoCommand(实现撤回和回撤)

用到的类: 1 QUndoStack: 一个存放 QUndoCommand 命令的栈. 2 QUndoCommand:The QUndoCommand class is the base class of all commands stored on a QUndoStack. 3 QUndoView:The QUndoView class displays the contents of a QUndoStack.&…

C#上位机系列(3)—定时器和串口的介绍

本文是讲解C#.net平台的Winform框架下的第三个内容,手把手介绍上位机项目的创建方式以及一些写软件时常用的功能,讲解从零开始的每一个步骤。 本次介绍上位机中定时器的使用和串口的配置 定时器:每过一段设定好的时间进入执行函数&#xff…

SIMULIA现实仿真解决方案 SIMULIA仿真模拟应用程序

由 3DEXPERIENCE 平台提供技术支持,SIMULIA 可提供仿真模拟应用程序,这些应用程序使用户能够探究现实生活中产品、自然和生命的行为 SIMULIA 通过虚拟测试实现性能要求促进协作。其产品组合提供强大的工具,能够对采用V6设计的零件、组件和产…

敏捷开发失败的五个原因以及解决方案

作者:David Bevans , Mendix公司高级内容营销经理 敏捷开发是一个可以改变软件交付方式的框架且效果十分惊人,但鉴于需要反复不断规划、测试、集成以及其他进行中的开发方式,敏捷开发在某些情况下行不通。下文将对常见的敏捷开发失灵以及相应…

菁染料CY3/CY5/CY7标记链霉亲和素/胰岛素,CY3/CY5/CY7-Streptavidin/Insulin

产品名称:菁染料CY3/CY5/CY7标记链霉亲和素/胰岛素 英文名称:CY3/CY5/CY7-Streptavidin/Insulin 链霉亲和素(streptavidin下称SA)是与亲和素(avidin下称AV)有相似生物学特性的一种蛋白质,是streptomyces avidinii菌的分泌物,其分…

AotuDL中Linux环境下运行pix2pix-tensorflow的环境配置(tensorflow==1.8.0 python==3.6)

目录写在前面1. 租用实例时基础镜像的选择2. 配置环境3. 实验记录写在前面 🍀windows环境下运行:【用于图像修复、数据增强等】结合官方代码教程,在Windows 10下运行pix2pix-tensorflow(tensorflow1.4.0 python3.6) A…

【网站架构】服务器弹性伸缩不能全自动,实际如何追加服务器

大家好,欢迎来到停止重构的频道。 本期,我们讨论大型网站的伸缩性。 伸缩性指的是通过自动增减服务器数量以适应用户量或压力。 这些年,微服务、ServerLess、K8S等技术,都让人有一种服务器自动伸缩很容易实现的错觉。 其实&…

最短路径问题

目录 一、前言 二、算法讲解 1、Dijkstra--朴素算法:O(n * n) 2、Dijkstra--堆优化算法:O(mlogm) 3、Bellman_ford贝尔曼算法: O(n * m) 4、Spfa算法:O(n * m) 5、Spfa处理负环:O(n * m) 6、Floyd算法&#xf…

iOS 列表页面实时刷新解决方案

iOS 列表页面实时刷新解决方案 一、背景介绍 1.1 问题的出现 客户要求APP客户端每次切换Tab,都需要从服务器去获取最新的数据,所以每次切换Tab,客户端都会去主动刷新接口,以获取最新的数据。但是实际发现,每次切换T…

基于FPGA MIPS CPU设计学习(1)

关于什么是MIPS以及MIPS架构可参考文章: MIPS架构与指令简介 1 MIPS寄存器学习 MIPS寄存器详细解释如下: • 0 : 即 0: 即 0:

【Shell 脚本速成】04、Shell 脚本格式化输出与用户交互

目录 一、shell格式化输出 1、echo命令 案例演示: 2、输出颜色字体 3、综合案例 二、 用户交互 1、read命令 2、交互输入案例 计算机程序其实就是三步:输入、运算、输出,这个理论也适应于shell编程。 那么计算机是如何将信息按照比较舒服的格式输…

Unity - BRP管线关闭 - UpdateDepthTexture的绘制

最近一直忙着跟项目打杂。。。 比较少时间进修,充电。。。难受香菇 但是 unity 的踩坑经验倒是增加了不少(还有很多坑的经验我都懒得写了,但是这些坑浪费查资料时间,还不如自己记下来,便于日后如果还有 BRP 项目的处理…

Neptune CHT-C助力零束打造智舱界王者

9月27日,上汽子品牌飞凡汽车的首款旗舰车型——飞凡R7刚一上市就牢牢吸引了众多视线,在了解了其配置后,用户纷纷称其为“智驾界卷王”。 飞凡R7搭载的RISING MAX 31巨幕,由中国品牌车型最大尺寸的43英寸宽幅真彩三联屏和全球首发量…

CSS的元素显示模式

元素显示模式是什么&#xff1f;&#xff1a; 由于网页中的标签非常多&#xff0c;在不同地方会用到不同类型的标签&#xff0c;了解他们的特点可以更好的布局我们的网页。 元素显示模式就是元素(标签)以什么方式进行显示&#xff0c;比如<div>独占一行&#xff0c;比如…

线索二叉树

目录 一、线索二叉树的类型定义 二、各种线索化的二叉树 三、中序线索二叉树的算法 完整代码&#xff1a; 一、线索二叉树的类型定义 typedef struct BTNode {ElemType data;//数据域struct BTNode* lchild;//左孩子或线索指针struct BTNode* rchild;//右孩子或线索指针int lt…

锐捷MPLS隧道单域实验配置

目录 配置AS100内的IGP路由协议 配置AS内的LDP 配置PE-PE的MP-BGP协议 在PE侧配置PE-CE的路由协议 在CE侧配置PE-CE的路由协议 将CE的路由重发布进MP-BGP中 将MP-BGP的路由重发布进CE中 MPLS隧道——单域基础理论讲解_静下心来敲木鱼的博客-CSDN博客_mpls隧道https://bl…