(6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析

目录

  • 前言
  • 1. DataFrame 简介
  • 2. DataFrame的特点
  • 3. DataFrame的创建
    • 3.1 使用字典创建DataFrame
    • 3.2 使用列表的列表(或元组)创建DataFrame
    • 3.3 使用NumPy数组创建DataFrame
    • 3.4 使用Series构成的字典创建DataFrame
    • 3.5 使用字典构成的字典创建DataFrame
  • 4. 从 CSV 文件读取
  • 5. DataFrame的属性和方法
    • 5.1 查看 DataFrame
    • 5.2 访问数据
    • 5.3 修改数据
    • 5.4 DataFrame 的属性
    • 5.5 DataFrame 的方法

前言

大家好!我是架构筑梦的Cherry,本期跟大家分享的知识是 pandas 数据结构——DataFrame。

作者的【 Python智能工坊】专栏及【少儿编程Python:趣味编程,探索未来】正在火热更新中🔥🔥🔥,如果本文对您有帮助,欢迎大家点赞 + 评论 + 收藏 !

1. DataFrame 简介

DataFrame 是 pandas 库中最重要的数据结构之一,它用于存储和操作二维标签化的数据结构(即表格型数据)。它的强大功能、灵活性以及易用性,使其成为数据分析领域的重要工具。
在 DataFrame 中,我们可以拥有行(index)和列(columns),每个单元格可以包含任何数据类型(如整数、浮点数、字符串、Python 对象等)。

2. DataFrame的特点

  • 二维标签化数据结构: DataFrame是一个二维表格型数据结构,具有行和列的标签,允许用户通过索引或列名方便地访问和操作数据。

  • 灵活的数据类型: DataFrame中的每一列可以是不同的数据类型,如整数、浮点数、字符串、布尔值等。这使得DataFrame能够存储和处理复杂的数据集。

  • 丰富的索引功能: DataFrame支持多级索引,可以通过行标签(index)和列标签(columns)进行快速的数据访问。此外,DataFrame还支持基于条件的索引,允许用户根据特定条件筛选和查询数据。

  • 强大的数据处理能力: DataFrame提供了丰富的数据处理功能,包括数据排序、筛选、分组、汇总、连接等。这些功能使得用户能够轻松地对数据进行清洗、转换和分析,以满足不同的数据分析需求。

  • 与其他工具的集成: DataFrame可以与许多其他工具和库(如NumPy、SciPy、Matplotlib等)进行集成,为用户提供更加全面和强大的数据处理和可视化功能。

  • 易于使用和理解: DataFrame的语法和API设计得非常直观和易于理解,使得用户能够快速上手并熟练掌握其使用方法。同时,pandas库还提供了丰富的文档和示例代码,帮助用户更好地理解和应用DataFrame。

  • 高性能和可扩展性: DataFrame在数据处理方面具有很高的性能,能够快速地处理大规模数据集。此外,pandas库还提供了可扩展的接口和工具,允许用户根据自己的需求进行定制和优化。

  • 广泛的应用场景: DataFrame广泛应用于数据分析、数据科学、机器学习等领域。无论是在商业智能、金融分析还是科学研究方面,DataFrame都发挥着重要的作用。

3. DataFrame的创建

在pandas库中,DataFrame的创建可以通过多种方式实现,以下是几种常见且清晰的创建方法:

  • 使用字典创建DataFrame
  • 使用列表的列表(或元组)创建DataFrame
  • 使用NumPy数组创建DataFrame
  • 使用Series构成的字典创建DataFrame
  • 使用字典构成的字典创建DataFrame

pd.DataFrame()是创建DataFrame的常用方法,格式如下:

pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

参数说明:

  • data:用于创建 DataFrame 的数据,可以是二维数组、列表的列表、字典等。
  • index:指定 DataFrame 的行标签,默认为整数序列。
  • columns:指定 DataFrame 的列标签,如果数据中包含列名则无需指定。
  • dtype:指定 DataFrame 中列的数据类型。
  • copy:是否复制输入数据,默认为 False。

以下是一些关于 DataFrame 的实例:

3.1 使用字典创建DataFrame

这是最直观和常用的创建方式之一。当已经有一组数据并且明确了每列的数据和列名时,可以使用字典来创建DataFrame。

import pandas as pd

# 使用字典列表创建
data = {
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': ['p', 'q', 'r']
}
df = pd.DataFrame(data)
print(df)

输出:

   A  B  C
0  1  4  p
1  2  5  q
2  3  6  r

3.2 使用列表的列表(或元组)创建DataFrame

当数据已经以记录方式(即每条记录是一个列表或元组)组织好,并且只需要添加列名时,可以使用此方法。

import pandas as pd
 
# 使用列表的列表创建DataFrame
data = [['Alice', 25, 'New York'], ['Bob', 30, 'Paris'], ['Charlie', 35, 'London']]
 
# 创建DataFrame,并指定列名
df = pd.DataFrame(data, columns=['Name', 'Age', 'City'])
print(df)

输出:

      Name  Age      City
0    Alice   25  New York
1      Bob   30     Paris
2  Charlie   35    London

3.3 使用NumPy数组创建DataFrame

如果已经有NumPy数组,并且想将其转换为DataFrame,可以这样做。

import pandas as pd
import numpy as np
 
# 创建NumPy数组
nums = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
 
# 创建DataFrame,并指定列名和索引
df = pd.DataFrame(nums, columns=['A', 'B', 'C'], index=['row1', 'row2', 'row3'])
 
print(df)

输出:

      A  B  C
row1  1  2  3
row2  4  5  6
row3  7  8  9

3.4 使用Series构成的字典创建DataFrame

当数据是pandas的Series对象时,也可以将其组合成字典来创建DataFrame。

import pandas as pd
import numpy as np
 
# 创建Series对象
s1 = pd.Series([1, 2, 3], name='A')
s2 = pd.Series([4, 5, 6], name='B')
 
# 创建DataFrame
df = pd.DataFrame({'A': s1, 'B': s2})
print(df)

输出:

   A  B
0  1  4
1  2  5
2  3  6

3.5 使用字典构成的字典创建DataFrame

此方法适用于数据是嵌套的字典结构,外层的字典键作为列名,内层的字典键作为行索引。

import pandas as pd
 
# 嵌套字典数据
data = {
    'a': {'一': 1, '二': 2},
    'b': {'一': 10, '二': 20},
    'c': {'一': 100, '二': 200}
}
 
# 创建DataFrame
df = pd.DataFrame(data)
print(df)

输出:

      a   b    c
一  1  10  100
二  2  20  200

这些方法是创建DataFrame的常见方式,可以根据具体的数据结构和需求选择最适合的方法。

4. 从 CSV 文件读取

在pandas库中,从CSV(Comma Separated Values)文件读取数据以创建DataFrame是非常常见的操作。这可以通过pd.read_csv()函数来实现。以下是一些使用pd.read_csv()函数的基本示例和参数说明:

import pandas as pd
 
# 读取CSV文件
df = pd.read_csv('file.csv')
 
# 显示DataFrame内容
print(df)

pd.read_csv()函数有很多参数可以定制读取行为,以下是一些常用的参数:

  • filepath_or_buffer:文件路径或类似文件的对象。这是必须的参数。
  • sep 或 delimiter:字段分隔符,默认为,。如果你的CSV文件使用其他分隔符(如制表符\t),你需要更改这个参数。
  • header:用作列名的行号。默认为0(即第一行)。如果CSV文件没有标题行,可以设置为None,并使用names参数手动指定列名。
  • names:如果数据不包含列标题,则可以使用此参数指定列名列表。
  • index_col:用作行索引的列编号或列名。如果未指定,则使用默认的整数索引。
  • usecols:返回列的子集。可以是列名的列表,也可以是列编号的列表。
  • dtype:列的数据类型。可以是单个类型,也可以是为每列指定的字典。
  • nrows:要读取的行数。这对于大文件特别有用,因为可以只读取前几行进行快速测试。
  • skiprows:要跳过的行数(从文件开始处计算)。
  • encoding:用于文件解码的字符编码。例如,‘utf-8’。
  • parse_dates:尝试将数据解析为日期。可以是布尔值,表示是否尝试解析所有列,也可以是列名的列表或解析指令的列表。
  • keep_default_na:如果指定了na_values参数,并且keep_default_na为False,则忽略默认的NaN值(如空字符串)。
  • na_values:识别为NaN或None的附加字符串列表。
  • thousands:用于解析数字的千位分隔符,如’,‘或’.'。
  • skipinitialspace:跳过字段中前导的空白字符。
  • comment:标记要忽略的行。任何包含此行标记的行都将被忽略。

5. DataFrame的属性和方法

5.1 查看 DataFrame

* 使用 `print(df)` 或直接在 Jupyter Notebook 中查看
* 使用 `df.head(n)` 查看前 n 行(默认为 5 行)
* 使用 `df.tail(n)` 查看后 n 行
  • 示例 1: 使用 print(df) 或直接在 Jupyter Notebook 中查看
    在Jupyter Notebook中,通常不需要显式调用print(df)来显示DataFrame。您只需将变量df(在这里它引用了您的DataFrame)作为一个独立的表达式或作为最后一行写入一个代码单元格,然后运行该单元格。Jupyter Notebook将自动显示df的内容。
import pandas as pd
 
# 假设我们有一个名为'example.csv'的CSV文件
df = pd.read_csv('example.csv')
 
# 在Jupyter Notebook中,只需运行以下行(无需print)
df

注意:如果您在标准的Python脚本或交互式环境中工作,则需要使用print(df)来显示DataFrame的内容。

  • 示例 2: 使用 df.head(n) 查看前 n 行(默认为 5 行)
    df.head(n)函数允许您查看DataFrame的前n行。如果未指定n,则默认显示前5行。
import pandas as pd
 
# 假设我们有一个名为'example.csv'的CSV文件
df = pd.read_csv('example.csv')

# 显示前5行(默认)
print(df.head())
 
# 显示前10行
print(df.head(10))
  • 示例 3: 使用 df.tail(n) 查看后 n 行
    类似地,df.tail(n)函数允许您查看DataFrame的最后n行。如果未指定n,则默认显示最后5行。
import pandas as pd
 
# 假设我们有一个名为'example.csv'的CSV文件
df = pd.read_csv('example.csv')

# 显示最后5行(默认)
print(df.tail())
 
# 显示最后10行
print(df.tail(10))

5.2 访问数据

* 通过列名访问整列数据:`df['A']`
* 通过位置访问列:`df.iloc[:, 0]` (等价于 `df['A']` 但基于位置)
* 通过标签访问列:`df.loc[:, 'A']` (也等价于 `df['A']` 但基于标签)
* 访问单个元素:`df.at[row_label, 'A']` 或 `df.iat[row_position, 0]`
* 访问多行多列:使用切片或布尔索引
  • 示例1:通过列名访问整列数据
# 假设我们有一个DataFrame df,它有一个名为'A'的列
col_a = df['A']
  • 示例2:通过位置访问列
# 使用iloc基于整数位置索引访问第一列(位置为0的列)
# 注意这不一定等同于df['A'],除非'A'确实是第一列
col_by_position = df.iloc[:, 0]
  • 示例3:通过标签访问列
# 使用loc基于标签索引访问名为'A'的列
# 这与df['A']等效
col_by_label = df.loc[:, 'A']
  • 示例4:访问单个元素
    有两种主要方式访问单个元素:

使用.at[]基于标签:

# 假设我们想要访问标签为'row_label'的行和名为'A'的列中的元素
element_at = df.at['row_label', 'A']

使用.iat[]基于整数位置:

# 假设我们想要访问第一行(位置为0)和第一列(位置为0)中的元素
# 注意这通常不会直接对应于'A'列,除非'A'是第一列,且'row_label'是第一行的标签
element_iat = df.iat[0, 0]
# 但如果你知道'A'是第n列,可以这样访问:
n = df.columns.get_loc('A')  # 获取'A'列的整数位置
row_position = 0  # 假设要访问第一行
element_specific_iat = df.iat[row_position, n]
  • 示例5:访问多行多列
    – 使用切片
# 访问前两行和前两列(基于位置)
subset_by_slice = df.iloc[:2, :2]

# 访问名为'A'和'B'的列(基于标签)
subset_by_slice_label = df.loc[:, ['A', 'B']]

– 使用布尔索引

# 假设我们有一个条件来选择某些行(例如,'A'列的值大于10)
mask = df['A'] > 10
# 选择满足条件的行和所有列
subset_by_condition = df[mask]
 
# 或者,选择满足条件的行和特定的列(例如,'B'和'C'列)
subset_by_condition_and_columns = df.loc[mask, ['B', 'C']]

5.3 修改数据

* 直接修改列的值:`df['A'] = [10, 20, 30]`
* 添加新列:`df['D'] = [100, 200, 300]`
* 删除列:`del df['A']` 或 `df = df.drop(columns=['A'])`
* 删除行:`df = df.drop(index=[0, 1])` (注意这会改变原始的 index)
  • 示例1:直接修改列的值
import pandas as pd
 
# 创建一个简单的 DataFrame
data = {
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
}
df = pd.DataFrame(data)

df['A'] = [10, 20, 30]
print("\n修改列 'A' 后的 DataFrame:")
print(df)

输出:

    A  B  C
0  10  4  7
1  20  5  8
2  30  6  9
  • 示例2:添加新列
df['D'] = [100, 200, 300]
print("\n添加新列 'D' 后的 DataFrame:")
print(df)

输出:

    A  B  C    D
0  10  4  7  100
1  20  5  8  200
2  30  6  9  300
  • 示例3:删除列
del df['A']
print("\n使用 del 删除列 'A' 后的 DataFrame:")
print(df)

输出:

   B  C    D
0  4  7  100
1  5  8  200
2  6  9  300
  • 示例4:使用 drop 方法
df = df.drop(columns=['B'])
print("\n使用 drop 方法删除列 'B' 后的 DataFrame:")
print(df)

输出:

   C    D
0  7  100
1  8  200
2  9  300
  • 示例5:删除行
df = df.drop(index=[0, 1])
print("\n删除索引为 0 和 1 的行后的 DataFrame:")
print(df)

输出:

   C    D
2  9  300

注意:在删除行或列后,原始的 index 可能会被改变(取决于你是否重置了 index)。如果你希望保留原始的 index 值(即使行被删除),你可能需要使用 reset_index 方法并设置 drop=True 来避免旧的 index 成为 DataFrame 的一部分。

5.4 DataFrame 的属性

* `df.shape`:返回 DataFrame 的形状(行数,列数)
* `df.dtypes`:返回每列的数据类型
* `df.index`:返回行标签
* `df.columns`:返回列标签
* `df.values`:返回 DataFrame 的 ndarray 表示
  • 示例:
import pandas as pd
 
# 创建一个简单的 DataFrame
data = {
    'A': [1, 2, 3],
    'B': [4.0, 5.0, 6.0],
    'C': ['foo', 'bar', 'baz'],
    'D': pd.date_range(start='2023-01-01', periods=3)
}
df = pd.DataFrame(data)

# 获取 DataFrame 的形状(行数,列数)
print("Shape of DataFrame:", df.shape) # 输出:Shape of DataFrame: (3, 4)
 
# 获取每列的数据类型
print("Data types of columns:", df.dtypes) # 输出:Data types of columns: A             int64
												# B           float64
												# C            object
												# D    datetime64[ns]
												# dtype: object
 
# 获取行标签
print("Row labels (index):", df.index) # 输出:Row labels (index): RangeIndex(start=0, stop=3, step=1)
 
# 获取列标签
print("Column labels:", df.columns) # 输出:Column labels: Index(['A', 'B', 'C', 'D'], dtype='object')
 
# 获取 DataFrame 的 ndarray 表示
print("NumPy ndarray representation:", df.values)
# 输出:
# NumPy ndarray representation: [[1 4.0 'foo' Timestamp('2023-01-01 00:00:00')]
#  [2 5.0 'bar' Timestamp('2023-01-02 00:00:00')]
#  [3 6.0 'baz' Timestamp('2023-01-03 00:00:00')]]

5.5 DataFrame 的方法

* `df.describe()`:提供 DataFrame 的统计摘要
* `df.sort_values(by='column_name')`:按指定列的值排序
* `df.groupby('column_name')`:按指定列的值进行分组
* `df.merge(other_df, on='column_name')`:基于指定列合并两个 DataFrame
* `df.pivot(index='column1', columns='column2', values='column3')`:将数据重塑为表格格式

当然,以下是您给出的 pandas DataFrame 操作的示例:

  • 示例1:df.describe() :提供 DataFrame 的统计摘要
import pandas as pd

# 创建一个简单的 DataFrame
data = {
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 20, 15],
    'C': [100, 200, 50, 30, 20]
}
df = pd.DataFrame(data)

# 提供 DataFrame 的统计摘要
print(df.describe())

输出:

              A          B           C
count  5.000000   5.000000    5.000000
mean   3.000000  19.000000   80.000000
std    1.581139   7.416198   73.824115
min    1.000000  10.000000   20.000000
25%    2.000000  15.000000   30.000000
50%    3.000000  20.000000   50.000000
75%    4.000000  20.000000  100.000000
max    5.000000  30.000000  200.000000

这将输出每列的基本统计信息,如计数、均值、标准差、最小值、25%分位数、中位数、75%分位数和最大值。

  • 示例2:df.sort_values(by=‘column_name’):按指定列的值排序
# 按列 'B' 的值排序
sorted_df = df.sort_values(by='B')
print(sorted_df)

这将按 ‘B’ 列的值对 DataFrame 进行排序。
输出:

   A   B    C
0  1  10  100
4  5  15   20
3  4  20   30
1  2  20  200
2  3  30   50
  • 示例3:df.groupby(‘column_name’):按指定列的值进行分组
# 按列 'B' 的值进行分组,并计算每组的 'A' 列的均值
grouped = df.groupby('B')['A'].mean()
print(grouped)

这将根据 ‘B’ 列的值对 DataFrame 进行分组,并计算每个组中 ‘A’ 列的均值。
输出:

B
10    1.0
15    5.0
20    3.0
30    3.0
Name: A, dtype: float64
  • 示例4:df.merge(other_df, on=‘column_name’):基于指定列合并两个 DataFrame
# 创建另一个 DataFrame
other_data = {
    'B': [20, 15, 30, 20],
    'D': ['x', 'y', 'z', 'w']
}
other_df = pd.DataFrame(other_data)

# 基于 'B' 列合并两个 DataFrame
merged_df = df.merge(other_df, on='B')
print(merged_df)

这将基于 ‘B’ 列的值将两个 DataFrame 合并为一个新的 DataFrame。
输出:

   A   B    C  D
0  2  20  200  x
1  2  20  200  w
2  3  30   50  z
3  4  20   30  x
4  4  20   30  w
5  5  15   20  y
  • 示例5:df.pivot(index=‘column1’, columns=‘column2’, values=‘column3’):将数据重塑为表格格式
# 假设我们有一个如下的 DataFrame
pivot_data = {
    'year': [2020, 2020, 2021, 2021],
    'product': ['A', 'B', 'A', 'B'],
    'sales': [100, 200, 150, 300]
}
pivot_df = pd.DataFrame(pivot_data)

# 使用 pivot 方法将数据重塑为表格格式
pivoted_df = pivot_df.pivot(index='year', columns='product', values='sales')
print(pivoted_df)

这将根据 ‘year’ 列的值创建行,根据 ‘product’ 列的值创建列,并将 ‘sales’ 列的值填入对应的单元格中。如果数据不能唯一地确定每个单元格的值(即存在重复的行/列组合),则 pivot 方法会抛出错误。在这种情况下,可以使用 pivot_table 方法,它允许进行聚合操作。
输出:

product    A    B
year
2020     100  200
2021     150  300

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频号的视频,一键就下载了,方法全在这儿了!

居然还有人不知道:视频号里面的视频是没有地址的,只能有微信自带的浏览器中打开。 所以很多人在视频号找到想要的素材,却无法下载,表示很苦恼。 几天每天都有人群里求助:“求好心人帮我下载一下这个视频!…

昇思学习打卡-14-ResNet50迁移学习

文章目录 数据集可视化预训练模型的使用部分实现 推理 迁移学习:在一个很大的数据集上训练得到一个预训练模型,然后使用该模型来初始化网络的权重参数或作为固定特征提取器应用于特定的任务中。本章学习使用的是前面学过的ResNet50,使用迁移学…

STM32 GPIO的工作原理

STM32的GPIO管脚有下面8种可能的配置:(4输入 2 输出 2 复用输出) (1)浮空输入_IN_FLOATING 在上图上,阴影的部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。黄色的高亮部分显示…

在攻防演练中遇到的一个“有马蜂的蜜罐”

在攻防演练中遇到的一个“有马蜂的蜜罐” 有趣的结论,请一路看到文章结尾 在前几天的攻防演练中,我跟队友的气氛氛围都很好,有说有笑,恐怕也是全场话最多、笑最多的队伍了。 也是因为我们遇到了许多相当有趣的事情,其…

Mac窗口辅助管理工具:Magnet for mac激活版

magnet mac版是一款运行在苹果电脑上的一款优秀的窗口大小控制工具,拖拽窗口到屏幕边缘可以自动半屏,全屏或者四分之一屏幕,还可以设定快捷键完成分屏。这款专业的窗口管理工具当您每次将内容从一个应用移动到另一应用时,当您需要…

python学习-容器类型

列表 列表(list)是一种有序容器,可以向其中添加或删除任意元素. 列表数据类型是一种容器类型,列表中可以存放不同数据类型的值,代码示例如下: 列表中可以实现元素的增、删、改、查。 示例代码如下: 增 …

医疗器械网络安全 | 漏洞扫描、渗透测试没有发现问题,是否说明我的设备是安全的?

尽管漏洞扫描、模糊测试和渗透测试在评估系统安全性方面是非常重要和有效的工具,但即使这些测试没有发现任何问题,也不能完全保证您的医疗器械是绝对安全的。这是因为安全性的评估是一个多维度、复杂且持续的过程,涉及多个方面和因素。以下是…

AI提示词:打造爆款标题生成器

打开GPT输入以下内容: # Role 爆款标题生成器## Profile - author: 姜小尘 - version: 02 - LLM: Kimi - language: 中文 - description: 利用心理学和市场趋势,生成吸引眼球的自媒体文章标题。## Background 一个吸引人的标题是提升文章点击率和传播力…

优化爬虫体验:揭秘IP重复率过高问题解决方案

在当今信息爆炸的时代,网络中蕴藏着大量宝贵的数据,而爬虫技术成为我们提取这些数据的重要工具。然而,随着爬虫的广泛使用,IP重复率高的问题也随之而来。本篇博文将揭秘解决这一问题的关键方法——使用IP代理。 一、 IP高重复问题…

手慢无,速看︱PMO大会内部学习资料

全国PMO专业人士年度盛会 每届PMO大会,组委会都把所有演讲嘉宾的PPT印刷在了会刊里面,供大家会后回顾与深入学习。 第十三届中国PMO大会-会刊 《2024第十三届中国PMO大会-会刊》 (内含演讲PPT) 会刊:750个页码&…

TK 检查输入框是否为空

在Python的Tkinter库中,你可以使用事件绑定或者在按钮点击事件中检查输入框的值是否为空来实现这个功能。以下是一个简单的例子: import tkinter as tk from tkinter import messageboxdef check_input():entry input_box.get()if not entry:messagebo…

《梦醒蝶飞:释放Excel函数与公式的力量》10.4 IMREAL函数

第四节 10.4 IMREAL函数 10.4.1 函数简介 IMREAL函数是Excel中的一个工程函数,用于提取复数的实部。在复数运算中,实部是复数的一部分,表示没有虚部参与的部分。IMREAL函数提供了一个简单的方法来获取复数的实部,便于进一步计算…

Java 8革新:现代编程的全新标准与挑战

文章目录 一、方法引用二、接口默认方法三、接口静态方法四、集合遍历forEach()方法 一、方法引用 方法引用是Java 8中一种简化Lambda表达式的方式,通过直接引用现有方法来代替Lambda表达式。 方法引用使得代码更加简洁和易读,特别是在处理函数式接口时&…

ns3学习笔记(四):路由概述

基于官网文档的 Routing Overview 部分详细研究一下ns3中路由是怎么工作的 文档链接16.4. Routing overview — Model Library 一、概述 NS3整体的工作架构如下: 路由部分的工作架构如下: 路由部分目前大多数用到的算法都包含在Ipv4RoutingProtocol部分…

常用网络概念

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ​​ 目录 了解组织 局域网技术 …

【Ty CLI】一个开箱即用的前端脚手架

目录 资源链接基础命令模板创建命令帮助选择模板开始创建开发模板 开发背景npm 发布流程问题记录模板创建超时 更新日志 资源链接 文档:https://ty.cli.vrteam.top/ 源码:https://github.com/bosombaby/ty-cli 基础命令 1. npm 全局安装 npm i ty-cli…

开发个人Go-ChatGPT--6 OpenUI

开发个人Go-ChatGPT–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI,旨在完全离线运行。它支持各种 LLM 运行器,包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由,OpenAI 的接口需要密钥才…

NAS免费用,鲁大师 AiNAS正式发布,「专业版」年卡仅需264元

7月10日,鲁大师召开新品发布会,正式发布旗下以“提供本地Ai部署和使用能力以及在线NAS功能”并行的复合软件产品:鲁大师 AiNAS。 全新的鲁大师 AiNAS将持续满足现如今大众对于数字化生活的全新需求,将“云存储”的便捷与NAS的大容…

html5——表单

目录 表单基本结构 表单标签 常用表单元素 文本框 密码框 邮箱 单选按钮 复选框 文件域 隐藏域 列表框 多行文本域 lable标签 表单按钮 常用表单属性 只读与禁用 placeholder required pattern autofocus autocomplete 用于指定表单是否有自动完…

软件架构之系统分析与设计方法(2)

软件架构之系统分析与设计方法(2) 8.4 面向对象的分析与设计8.4.1 面向对象的基本概念8.4.2 面向对象分析8.4.3 统一建模语言 8.5 用户界面设计8.5.1 用户界面设计的原则8.5.2 用户界面设计过程 8.6 工作流设计8.6.1 工作流设计概述8.6.2 工作流管理系统 8.7 简单分…