【数据分析】Pandas_DataFrame读写详解:案例解析(第24天)
系列文章目录
一、 读写文件数据
二、df查询数据操作
三、df增加列操作
四、df删除行列操作
五、df数据去重操作
六、df数据修改操作
文章目录
- 系列文章目录
- 前言
- 一、 读写文件数据
- 1.1 读写excel文件
- 1.2 读写csv文件
- 1.3 读写mysql数据库
- 二、df查询数据操作
- 2.1 查询df子集基本方法
- 2.2 loc/iloc获取子集
- 2.2.1 loc/iloc基本介绍
- 2.2.2 loc属性获取子集
- 2.2.3 iloc属性获取子集
- 2.3 query函数获取子集
- 2.4 isin函数获取子集
- 三、df增加列操作
- 四、df删除行列操作
- 五、df数据去重操作
- 六、df数据修改操作
- 6.1 直接修改数据
- 6.2 replace函数修改
- 6.3 s对象通过apply函数执行自定义函数
- 6.4 df对象通过apply函数执行自定义函数
- 6.5 df对象通过applymap函数执行自定义函数
前言
本文主要详解了Pandas_DataFrame的读写。
提示:以下是本篇文章正文内容,下面案例可供参考
一、 读写文件数据
可以参考pandas的官网文档
https://pandas.pydata.org/
1.1 读写excel文件
-
数据保存到excel文件
# 导入模块 import pandas as pd # 构造数据集 data = [[1,'张三', '1990-10-02', 34],[2, '李四', '2000-03-03', 24],[3, '王五', '2005-12-23', 19],[4, '隔壁老王', '1982-11-12',42]] df = pd.DataFrame(data=data, columns=['id', 'name', 'birthday', 'age']) df # 存储路径 # sheet名称 # 是否存储行索引作为一列 # 是否存储列名 df.to_excel('./output/student.xls', sheet_name='student',index=True, header=True) -
读取excel文件数据
df_excel = pd.read_excel('output/student.xls') df_excel # 通过index_col指定某列的值作为行索引, 可以写列名或列下标值 # pd.read_excel('output/student.xls',index_col='id') pd.read_excel('output/student.xls',index_col=0)
1.2 读写csv文件
-
数据保存到csv(逗号,分隔符)/tsv(制表符
\t分隔符)文件中# 参数1:存储路径 # index:是否存储行索引值 # mode:存储的方式 df.to_csv('output/student.csv', index=False, mode='w') # 存储到tsv文件中 \t # sep:指定列值之间的分隔符 df.to_csv('output/student.tsv', sep='\t') -
读取csv/tsv文件数据
df_csv = pd.read_csv('output/student.csv') df_csv # parse_dates: 将指定的列转换成日期时间类型, 可以传入列名或列下标值 # temp_df = pd.read_csv('output/student.csv', parse_dates=['birthday']) # temp_df = pd.read_csv('output/student.csv', parse_dates=[2]) # parse_dates: 可以传入True或False, 将行索引值转换成日期时间类型, 需要和行索引值进行结合使用 temp_df = pd.read_csv('output/student.csv',index_col='birthday' ,parse_dates=True) temp_df.info() # 读取tsv文件数据 pd.read_csv('output/student.tsv', sep='\t', index_col=0)
1.3 读写mysql数据库
-
保存数据到mysql数据库
from sqlalchemy import create_engine # 创建数据库链接对象 engine = create_engine('mysql+pymysql://root:123456@192.168.88.100:3306/BI_db') # name:表名, 表不存在会自动创建 # con:数据库链接对象 # index:是否存储行索引 # if_exists:存储方式, append:追加写 replace:覆盖写 df.to_sql(name='student', con=engine, index=False, if_exists='append') -
读取mysql数据库数据
# sql:可以读取表名, 也可以读取sql语句 # columns: 指定读取表中的字段 df_mysql = pd.read_sql(sql='student', con=engine, columns=['name', 'birthday']) df_mysql # 读取sql语句 pd.read_sql(sql='select * from student limit 2', con=engine) # 只能读取sql语句 pd.read_sql_query(sql='select * from student limit 2;',con=engine) # 只能读取表名 pd.read_sql_table(table_name='student', con=engine)
二、df查询数据操作
2.1 查询df子集基本方法
-
head()&tail()
import pandas as pd # 加载数据集, 链家租房数据集 df = pd.read_csv('data/LJdata.csv') df df.head() df.tail() df.head(n=8) -
获取一列或多列数据
# df[列名]或df.列名 # 获取一列数据, 返回s对象 df['价格'] type(df['价格']) df.价格 # 获取一列数据, 返回df对象 df[['价格']] # 获取多列数据 df[[列名1, 列名2, ...]] # 传入列名的列表 df[['区域', '面积', '价格']] -
布尔值向量获取行数据
# 布尔值s对象 df['价格']>8000 df[df['价格']>8000] # 布尔值列表 df_head = df.head() df_head # 构建布尔值列表 bool_list = [True,False,True,False,True] df_head[bool_list] # 布尔值数组 import numpy as np n1 = np.array([True,False,True,False,True]) n1 df_head[n1] -
行索引下标切片获取行数据
# df[起始行下标值:结束行下标值:步长] 类似于字符串/列表/元组的切片操作 # 下标值(只能是整数)和索引值(整数,字符串,日期时间)不是一个东西 # 左闭右开 -> 包含起始值, 不包含结束值 temp_df = df.head(10) temp_df # 获取1,3,5行数据 temp_df[:5:2] # 获取前3行数据 temp_df[:3] # 步长为负数, 倒序获取行数据, 下标值可以为负数 temp_df[-1:-3:-1]
2.2 loc/iloc获取子集
2.2.1 loc/iloc基本介绍
loc和iloc是s/df对象的属性
loc是通过索引值(肉眼看到的值), iloc是通过索引下标值(0,1,2,3…) 获取数据
df.loc[行索引值] -> 获取行数据
df.loc[行索引值, 列名] -> 获取行列数据
df.iloc[行索引下标] -> 获取行数据
df.iloc[行索引下标, 列名下标] -> 获取行列数据
2.2.2 loc属性获取子集
# 获取一行数据 df[行索引值]
# 获取第5行数据, 返回s对象
temp_df.loc[4]
# 获取第5行数据, 返回df对象
temp_df.loc[[4]]
# 获取多行数据 df[[行索引值1, 行索引值2, ...]]
# 获取第1, 3, 5行数据
temp_df.loc[[0, 2, 4]]
# 行索引值切片获取行数据
# df.loc[起始索引值:结束索引值:步长]
# 左闭右闭 -> 包含起始值, 包含结束值
# 获取第2,3,4行数据
temp_df.loc[1:3]
# 根据索引下标值
temp_df[1:3]
# 隔一行获取一行数据
temp_df.loc[::2]
# 倒序获取子集, 起始值和结束值要反过来, 步长为负数
temp_df.loc[8:2:-1]
# 布尔值向量获取行数据 df.loc[布尔值向量]
temp_df['朝向']=='南'
temp_df.loc[temp_df['朝向']=='南']
# 布尔值向量结合列名获取行列数据 df.loc[布尔值向量, [列名1, 列名2, ...]]
temp_df.loc[temp_df['朝向']=='南', ['地址', '朝向']]
# 行索引值结合列名获取行列数据 df.loc[[行索引值1, 行索引值2,...],[列名1, 列名2, ...]]
# 获取某个值数据
temp_df.loc[0, '价格']
# 获取多行多列数据
temp_df.loc[[0, 2, 4], ['地址', '户型', '价格']]
# 行索引值切片结合列名获取行列数据 df.loc[起始索引值:结束索引值:步长, [列名1, 列名2, ...]]
temp_df.loc[:4:2, ['地址', '面积', '价格']]
2.2.3 iloc属性获取子集
# 获取一行数据 df.iloc[行下标值]
# 获取第一行数据, 返回s对象
temp_df.iloc[0]
temp_df.iloc[[0]]
# 获取最后一行数据
temp_df.iloc[-1]
# 获取多行数据 df.iloc[[行下标1, 行下标2, ...]]
temp_df.iloc[[0, 2, 4]]
# 行下标切片获取多行数据 df.iloc[起始下标值:结束下标值:步长] 等同于 df[起始下标值:结束下标值:步长]
# 左闭右开
temp_df.iloc[:5:2]
temp_df[:5:2]
# 行列下标切片获取子集 df.iloc[起始下标值:结束下标值:步长, 起始列下标值:结束列下标值:步长]
# 获取1,3,5行, 并且获取地址,面积和朝向列
temp_df.iloc[:5:2, 1:6:2]
# 行下标切片和列下标值获取子集 df.iloc[起始下标值:结束下标值:步长, [列下标1, 列下标2, ...]]
# 获取1,3,5行, 并且获取地址,面积和朝向列
temp_df.iloc[:5:2, [1, 3, 5]]
# 行列下标值获取子集 df.iloc[[行下标值1, 行下标值2, ...], [列下标值1, 列下标值2, ...]]
# 获取1,3,5行, 并且获取地址,面积和朝向列
temp_df.iloc[[0, 2, 4], [1, 3, 5]]
# 行下标值和列下标切片获取子集 df.iloc[[行下标值1, 行下标值2, ...], 起始列下标值:结束列下标值:步长]
# 获取1,3,5行, 并且获取地址,面积和朝向列
temp_df.iloc[[0,2,4],1:6:2]
2.3 query函数获取子集
# df.query(判断表达式) -> 判断表达式和df[布尔值向量]相同
# 获取区域列中为 望京租房 的数据
temp_df['区域'] == '望京租房'
temp_df[temp_df['区域'] == '望京租房']
# sql语句 select * from 表a where 区域 == "望京租房"
temp_df.query('区域 == "望京租房"')
# 判断表达式中有多个判断条件, 可以使用 and(&)或or(|)
# 查询租房区域为望京、天通苑、回龙观并且朝向为东、南的房源数据
# 链式调用, query函数返回新的df, 新的df继续可以调用query()
temp_df.query('区域 in ("望京租房", "天通苑租房", "回龙观租房")').query('朝向 in ("东", "南")')
temp_df.query('(区域 in ("望京租房", "天通苑租房", "回龙观租房")) & (朝向 in ("东", "南"))')
# temp_df.query('(区域 in ("望京租房", "天通苑租房", "回龙观租房")) and (朝向 in ("东", "南"))')temp_df[((temp_df["区域"]=='望京租房') | (temp_df['区域']=='天通苑租房') | (temp_df['区域']=='回龙观租房')) & ((temp_df['朝向']=='东') | (temp_df['朝向']=='南'))]
2.4 isin函数获取子集
# 判断s或df对象中的数据值是否在values列表中, 如果在返回True, 否则返回False -> s/df.isin(values=[值1, 值2, ...])
# 返回一个布尔值构成的df对象
temp_df.isin(values=['2室1厅','东'])
temp_df[temp_df.isin(values=['2室1厅','东'])]
# 返回布尔值构成的s对象
temp_df['区域'].isin(values=["望京租房", "天通苑租房", "回龙观租房"])
temp_df['区域'][temp_df['区域'].isin(values=["望京租房", "天通苑租房", "回龙观租房"])]
temp_df[temp_df['区域'].isin(values=["望京租房", "天通苑租房", "回龙观租房"])]
# 查询租房区域为望京、天通苑、回龙观并且朝向为东、南的房源数据
temp_df['区域'].isin(values=["望京租房", "天通苑租房", "回龙观租房"]) & temp_df['朝向'].isin(values=['东', '南'])
temp_df[(temp_df['区域'].isin(values=["望京租房", "天通苑租房", "回龙观租房"])) & (temp_df['朝向'].isin(values=['东', '南']))]
三、df增加列操作
# 导入模块
import pandas as pd
import warnings
warnings.filterwarnings('ignore') # 忽略警告信息
# 加载数据集
df = pd.read_csv('data/LJdata.csv')
# 获取前5行数据
temp_df = df.head().copy()
temp_df
# 在df末尾增加新列数据 df['新列名'] = 常数值/列表/series对象
# 在df末尾新增一列省份列, 值都为北京 -> 常数值
temp_df['省份'] = '北京'
temp_df
# 在df末尾新增一列区县列, 值为['朝阳区', '朝阳区', '西城区', '昌平区', '朝阳区'] -> 列表
# df的行数要和新增列表中的元素个数要相等
temp_df['区县'] = ['朝阳区', '朝阳区', '西城区', '昌平区', '朝阳区']
temp_df
# 在df末尾新增一列新价格列, 在原价格上加1000 -> series对象 (s对象的运算)
temp_df['新价格'] = temp_df['价格'] + 1000
temp_df
# 通过insert()在指定位置新增一列
# df.insert(loc=列下标值, column=新列名, value=常数值/列表/s对象)
# 在区域和地址列之间新增一列国家列, 值都为中国
temp_df.insert(loc=1, column='国家', value='中国')
temp_df
# 在价格新增一列价格2列, 值为 价格和新价格的求和
temp_df.insert(loc=6, column='价格2', value=temp_df['价格'] + temp_df['新价格'])
temp_df
四、df删除行列操作
# df.drop(labels=, axis=, inplace=)
# labels: 根据 行索引值或列名 进行删除
# axis: 按行或列删除, 默认是按行 0或index; 按列 1或columns
# inplace: 是否在源数据集上删除, 默认是False, True
# 删除第1, 3, 5行数据, 默认删除行数据
drop_df = temp_df.drop(labels=[0, 2, 4])
drop_df
# 删除价格2列数据
temp_df.drop(labels='价格2', axis='columns')
# 在源df上删除价格2列数据
temp_df.drop(labels='价格2', axis=1, inplace=True)
# 保留地址, 户型, 面积三列数据
temp_df[['地址', '户型', '面积']]
五、df数据去重操作
# s/df.drop_duplicates(subset=,keep=,inplace=)
# subset: 默认不写, 所有列值都相同的行数据; 可以通过列名列表指定对应列相同的行数据
# keep: 默认保留第一条数据 first, 保留最后一条数据 last, 删除所有重复数据 false
# inplace: 是否在源数据集上修改
# 根据所有列相同的行数据进行去重
temp_df.drop_duplicates()
# 根据户型和朝向列判断是否有重复行数据
# 默认保留第一条重复数据
temp_df.drop_duplicates(subset=['户型', '朝向'])
# 保留最后一条重复数据
temp_df.drop_duplicates(subset=['户型', '朝向'], keep='last')
# 删除重复的数据
temp_df['朝向'].drop_duplicates(keep=False)
# df对象没有unique操作
temp_df['朝向'].unique() # 返回数组
temp_df['朝向'].nunique() # 去重计数 count(distinct)
六、df数据修改操作
6.1 直接修改数据
# 直接修改数据值 df[列名] = 新值 -> 常数值/列表/s对象
temp_df = df.head().copy()
temp_df
# 修改看房人数列, 改为 100
temp_df['看房人数'] = 100
temp_df
# 修改面积列, 改为 [70, 99, 90, 120, 80] -> df的行数和列表中的元素个数相同
temp_df['面积'] = [70, 99, 90, 120, 80]
temp_df
# 修改价格列, 价格列+1000
temp_df['价格'] = temp_df['价格'] + 1000
temp_df
# 获取s对象
temp_s = temp_df['价格']
temp_s# s[索引下标值] = 新值
temp_s[2] = 20000
temp_s
6.2 replace函数修改
# 通过replace函数实现修改
# s/df.replace(to_replace=, value=, inplace=)
# to_replace:需要替换的值
# value:替换后的值
# 将2室1厅替换成3室2厅
temp_df.replace(to_replace='2室1厅', value='3室2厅', inplace=True)
temp_df
temp_df.replace(to_replace=[20000, 100], value=999)
# 对s对象实现替换操作
temp_df['朝向'].replace(to_replace='东南', value='北')
6.3 s对象通过apply函数执行自定义函数
temp_df = df.head().copy()
temp_df
# 编写自定义函数 根据区域列的值判断是否为天通苑租房, 是返回昌平区, 否返回其他区
# 最少接受一个形参, 形参对应的实参值是s对象中每个值
def func1(x):print('x的值是->',x)if x == '天通苑租房':return '昌平区'else:return '其他区'
# 通过apply函数调用自定义函数 s/df.apply(自定义函数名)
temp_df['区域'] = temp_df['区域'].apply(func1)
temp_df
temp_df = df.head().copy()
temp_df
# 定义自定义函数式, 可以定义多个形参
def func2(x, arg1, arg2):
# print('x的值是->', x)
# print('arg1的值是->', arg1)
# print('arg2的值是->', arg2)if x == '天通苑租房':return arg1else:return arg2
# s对象调用自定义函数
# args=(arg1, arg2)
temp_df['区域'].apply(func2, args=('昌平区', '其他区'))
# 形参名=实参值
temp_df['区域'].apply(func2, arg1='昌平区', arg2='其他区')
6.4 df对象通过apply函数执行自定义函数
-
按列计算
# df对象调用apply函数来执行自定义函数 # 自定义函数接收的是df中一列或一行数据 # 定义自定义函数 def func3(x, arg1):# x是df中一行或一列数据 -> s对象print('x的值是->', x)print('arg1的值是->', arg1)print(x.__dict__)# _name:获取当前列的列名, 或者是获取当前行的行索引值if x._name == '价格':# s对象和数值型变量计算return x + arg1else:return x# 默认是按列进行处理 axis=0 # temp_df.apply(func3, args=(1000,), axis=0) temp_df.apply(func3, arg1 = 2000, axis=0) -
按行计算
# 如果区域列的值为望京租房, 修改价格列的值为arg1 # 自定义函数 def func4(x, arg1):print('x的值是->', x)# 根据s对象的索引值获取数据值 s[索引值]if x['区域']== '望京租房':x['价格'] = arg1return xelse:return x# 按行进行处理, axis=1 temp_df.apply(func4, arg1=3000, axis=1)
6.5 df对象通过applymap函数执行自定义函数
# df对象调用applymap函数来执行自定义函数
# 自定义函数中接收的是df中每个值, 不再是一列或一行数据
# 自定义函数
def func5(x):print('x的值是->', x)if x in ['燕莎租房','望京租房','团结湖租房']:return '朝阳区'elif x == '天通苑租房':return '昌平区'elif x == '团结湖租房':return '西城区'else:return xtemp_df.applymap(func5)

相关文章:
【数据分析】Pandas_DataFrame读写详解:案例解析(第24天)
系列文章目录 一、 读写文件数据 二、df查询数据操作 三、df增加列操作 四、df删除行列操作 五、df数据去重操作 六、df数据修改操作 文章目录 系列文章目录前言一、 读写文件数据1.1 读写excel文件1.2 读写csv文件1.3 读写mysql数据库 二、df查询数据操作2.1 查询df子集基本方…...
quill编辑器使用总结
一、vue-quill-editor 与 quill 若使用版本1.0,这两个组件使用哪个都是一样的,无非代码有点偏差;若需要使用表格功能,必须使用 quill2.0 版本,因为 vue-quill-editor 不支持table功能。 二、webpack版本问题 在使用 q…...
快手矩阵管理系统:引领短视频运营新潮流
在短视频行业蓬勃发展的今天,如何高效运营和优化内容创作已成为企业和创作者关注的焦点。快手矩阵管理系统以其强大的核心功能,为短视频内容的创作、发布和管理提供了一站式解决方案。 智能创作:AI自动生成文案 快手矩阵管理系统的智能创作…...
文心一言:探索AI写作的新境界
在人工智能飞速发展的今天,AI写作助手已经成为许多写作者、内容创作者和营销专家的重要工具。"文心一言"作为一个先进的AI写作平台,以其强大的语言理解和生成能力,为用户提供了从文本生成到编辑、优化等一系列服务。本文将介绍如何…...
认证资讯|Bluetooth SIG认证
在当今高度互联的世界中,无线技术的普及已经成为我们生活和工作中不可或缺的一部分。作为领先的无线通信技术之一,Bluetooth技术以其稳定性、便捷性和广泛的应用场景而备受青睐。然而,要想在激烈的市场竞争中脱颖而出,获得Bluetoo…...
我国静止无功发生器(SVG)市场规模逐渐扩大 高压SVG为主流产品
我国静止无功发生器(SVG)市场规模逐渐扩大 高压SVG为主流产品 静止无功发生器(SVG)又称为静止同步补偿器、先进静止补偿器、静止调相机等,是利用全控型功率器件组成的桥式变流器来实现动态无功调节的一种先进无功自动补…...
【漏洞复现】用友U8 CRM downloadfile 任意文件读取漏洞
0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件,旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 /pub/downloadfile.php接囗处存在任意文件读取漏洞,未经身份验证的远程攻击…...
计算机网络 | 期末复习
物理层: 奈氏准则:带宽(w Hz),在不考虑噪音的情况下,最大速率(2W)码元/秒 信噪比S/N:以分贝(dB)为度量单位。信噪比(dB)…...
动手实操微软开源的GraphRAG
微软在今年4月份的时候提出了GraphRAG的概念,然后在上周开源了GraphRAG,Github链接见https://github.com/microsoft/graphrag,截止当前,已有6900Star。 安装教程 官方推荐使用Python3.10-3.12版本,我使用Python3.10版本安装时,在…...
【网络安全】实验七(ISA防火墙的规则设置)
一、实验目的 二、配置环境 打开两台虚拟机,并参照下图,搭建网络拓扑环境,要求两台虚拟机的IP地址要按照图中的标识进行设置,并根据搭建完成情况,勾选对应选项。注:此处的学号本人学号的最后两位数字&…...
实验代码结构介绍
提高模型复用性,让模型对应的配置更加清晰,代码书写条理 学习自https://zhuanlan.zhihu.com/p/409662511 Project ├── checkpoints # 存放模型 ├── data # 定义各种用于训练测试的数据集 ├── eval.py # 测试代码 ├── loss.py # 定义的…...
Java多线程不会?一文解决——
方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例: class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…...
Mac上pyenv的安装及使用
Mac上pyenv的安装及使用 安装 brew update brew install pyenv 报错 git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallowgit -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow那就执行这2句 还报错 git -C /…...
【SpringBoot】IDEA查看spring bean的依赖关系
前因:研究springcloud config组件时,我发现config-server包下的EnvironmentController不在扫描的包路径下却可以响应客户端的请求,这引起了我的注意,我的问题是:EnvironmentController是怎么被添加进bean工厂的。本章就…...
项目代码优化(1)——下单逻辑
给一个电商开发的系统排查,发现漏洞很多。很多经验不够的开发者很容易忽视的逻辑错误陷阱。在给一个项目做二次开发时候,检测到的相关经典案例。这里整理支付和产品相关的逻辑,方便后续查看。,这里进行一些简单的逻辑漏洞梳理与修…...
探索 WebKit 的缓存迷宫:深入理解其高效缓存机制
探索 WebKit 的缓存迷宫:深入理解其高效缓存机制 在当今快速变化的网络世界中,WebKit 作为领先的浏览器引擎之一,其缓存机制对于提升网页加载速度、减少服务器负载以及改善用户体验起着至关重要的作用。本文将深入探讨 WebKit 的缓存机制&am…...
JVM:介绍
文章目录 一、什么是JVM二、JVM的功能1、解释和运行2、内存管理3、即时编译 三、常见的JVM四、Java虚拟机规范五、HotSpot发展历程 一、什么是JVM JVM的全称为Java Virtual Machine,Java虚拟机。本质上是一个运行在计算机上的程序,职责是运行Java字节码…...
和鲸“101”计划领航!和鲸科技携手北中医,共话医学+AI 实验室建设及创新人才培养
为进一步加强医学院校大数据管理与应用、信息管理与信息系统,医学信息工程等专业建设,交流实验室建设、专业发展与人才培养经验,6 月 22 日,由北京中医药大学(简称“北中医”)主办,上海和今信息…...
Linux 网络抓包工具tcpdump编译
tcpdump 的编译步骤 1. 下载源代码 访问 tcpdump 的官方网站(如:http://www.tcpdump.org/)下载最新的源代码压缩包,如tcpdump-4.9.2.tar.gz(注意版本号可能会有所不同)。 2. 解压缩源代码 使用 tar 命令…...
『C++成长记』string模拟实现
🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...



