python基础5——正则、数据库操作
文章目录
- 一、数据库编程
- 1.1 connect()函数
- 1.2 命令参数
- 1.3 常用语句
 
- 二、正则表达式
- 2.1 匹配方式
- 2.2 字符匹配
- 2.3 数量匹配
- 2.4 边界匹配
- 2.5 分组匹配
- 2.6 贪婪模式&非贪婪模式
- 2.7 标志位
 
一、数据库编程
- 可以使用python脚本对数据库进行操作,比如获取数据库数据保存到文件中,这个功能可以通过数据库相关模块进行实现。
- 在python2.x版本中使用的是MySQLdb模块,python3.x版本中使用的是pymysql模块,两者用法几乎相同。
- pymysql是第三方模块,需要单独安装,首选通过pip安装PyMySQL。
- 对不同类型的数据库操作,需要安装导入的模块也不同。
1.1 connect()函数
- connect()函数:用来建立和数据库的连接。
| connect()函数常用参数 | 描述 | 
|---|---|
| host | 数据库主机地址 | 
| user | 数据库账户 | 
| passwd | 账户密码 | 
| db | 使用的数据库 | 
| port | 数据库主机端口,默认3306 | 
| connect_timeout | 连接超时时间,默认10,单位秒 | 
| charset | 使用的字符集 | 
| cursorclass | 自定义游标使用的类。上面示例用的是字典类,以字典形式返回结果,默认是元组形式。 | 
1.安装pymysql模块。
pip3 install pymysql
2.准备好数据库信息。
##安装数据库实例。
docker run -d --name qingjun -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.30##创建数据库和表,用来测试。
create database test;
use test;
create table user(id int primary key not null auto_increment,username varchar(50) not null,password varchar(50) not null);

 3.连接数据库,开始操作数据库。

import pymysql##数据库信息。
conn = pymysql.connect(host='192.168.161.132',port=3306,user='root',password='123456',db='test',charset='utf8',cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()    ##建立数据库连接。# 创建一条记录.
sql = "insert into user(username, password) values('qingjun', '123456')"
cursor.execute(sql)    ##执行sql语句。
conn.commit()          ##写入到数据库。
4.查看数据库数据。
 
1.2 命令参数
| 连接对象常用方法 | 描述 | 
|---|---|
| commit() | 提交事务。对支持事务的数据库和表,如果提交修改操作,不适用这个方法,则不会写到数据库中 | 
| rollback() | 事务回滚。对支持事务的数据库和表,如果执行此方法,则回滚当前事务。在没有commit()前提下。 | 
| cursor([cursorclass]) | 创建一个游标对象。所有的sql语句的执行都要在游标对象下进行。MySQL本身不支持游标,MySQLdb模块对其游标进行了仿真。 | 
| 游标对象常用方法 | 描述 | 
|---|---|
| close() | 关闭游标 | 
| execute(sql) | 执行sql语句 | 
| executemany(sql) | 执行多条sql语句 | 
| fetchone() | 从运行结果中取第一条记录,返回字典 | 
| fetchmany(n) | 从运行结果中取n条记录,返回列表 | 
| fetchall() | 从运行结果中取所有记录,返回列表 | 
1.3 常用语句
1.插入数据。
import pymysql
conn = pymysql.connect(host='192.168.161.132',port=3306,user='root',password='123456',db='test',charset='utf8',cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()##插入一条数据。
sql = "insert into user(username, password) values('wuhan', '88')"
cursor.execute(sql)
conn.commit()
conn.close()    ##关闭游标##插入多条数据。
sql = "insert into user(username, password) values(%s,%s)"
args = [('beijing',222),('shenzheng',9990)]
cursor.executemany(sql,args)
conn.commit()
conn.close()    ##关闭游标

2.查询数据。
import pymysql
conn = pymysql.connect(host='192.168.161.132',port=3306,user='root',password='123456',db='test',charset='utf8',cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()##查询数据。
sql = "select * from user"
cursor.execute(sql)
print(cursor.fetchone())   ##获取第一条记录。
print(cursor.fetchmany(1))   ##从运行结果中,获取1条记录。
print(cursor.fetchall())   ##获取所有记录。
conn.close()    ##关闭游标

3.修改数据。
import pymysql
conn = pymysql.connect(host='192.168.161.132',port=3306,user='root',password='123456',db='test',charset='utf8',cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()##修改数据。
sql = "update user set password='100' where username='wuhan'"
cursor.execute(sql)
conn.commit()
conn.close()    ##关闭游标

 4.删除数据。
import pymysql
conn = pymysql.connect(host='192.168.161.132',port=3306,user='root',password='123456',db='test',charset='utf8',cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()##删除数据。
sql = "delete from user where username='qingjun'"
cursor.execute(sql)
conn.commit()
conn.close()    ##关闭游标

5.遍历查询结果。
try:with conn.cursor() as cursor:sql = "select id,username,password from user"cursor.execute(sql)result = cursor.fetchall()for dict in result:print(f"ID: {dict['id']}, 用户名: {dict['username']}, 密码: {dict['password']}")
finally:    ##不管try是否执行成功,finally都执行。conn.close()

二、正则表达式
- 正则表达式是对字符串操作的一种逻辑方式,就是用实现定义好的一些特定字符及这些特定字符的组合,组成一个规则字符串,这个规则字符串就是表达对字符串的逻辑,给定一个正则表达式和另一个字符串,通过正则表达式从字符串我们想要的部分。
- Python正则表达式主要由re标准库提供,拥有了基本所有的表达式。
2.1 匹配方式
| 方法 | 描述 | 
|---|---|
| re.compile(pattern, flags=0) | 把正则表达式编译成一个对象。 pattern 指的是正则表达式,flags是标志位的修饰符,用于控制表达式匹配模式 | 
| re.match(pattern, string, flags=0) | 匹配字符串开始,如果不匹配返回None | 
| re.search(pattern, string, flags=0) | 扫描字符串寻找匹配,如果符合返回一个匹配对象并终止匹配,否则返回None | 
| re.split(pattern, string, maxsplit=0, flags=0) | 以匹配模式作为分隔符,切分字符串为列表 | 
| re.findall(pattern, string, flags=0) | 以列表形式返回所有匹配的字符串 | 
| re.finditer(pattern, string, flags=0) | 以迭代器形式返回所有匹配的字符串 | 
| re.sub(pattern, repl, string, count=0, flags=0) | 字符串替换,repl替换匹配的字符串,repl可以是一个函数 | 
1.老方法匹配字符串。优点是,方便再次使用。
a = 'this is jdasi1!#@sjkdjalk'import re
pattern = re.compile("this")  ##预定义正则表达式。
baimu = pattern.match(a)   ##使用预定义的正则表达式匹配字符串,
print(baimu)
print(baimu.group())   ##过滤出匹配的字符串。

 2.常用方式匹配,优点是,更直观。从第一个字符串开始匹配。
a = 'this is jdasi1!#@sjkdjalk'import re
qingjun = re.match("this",a)
print(qingjun.group())

 3.扫描匹配。
import re
s = "我今年23335岁"
result2 = re.search("\d+", s)
print(result2.group())

 4.以匹配模式作为分隔符,切分字符串为列表。
import re
s = "我今年23335岁"
result2 = re.split("\d+", s)   ##\d+作为分隔符。
print(result2)

 5.以列表形式返回所有匹配的字符串。
import re
s = "我今年23335岁,张三今年22岁"
result2 = re.findall("\d+", s)   ##匹配字符串中所有的数字,并返回一个列表,
print(result2)

 6.替换匹配。
import re
s = "我今年23335岁,张三今年22岁"
result2 = re.sub("\d+","50",s)   ##将字符串中的所有数字替换成50
print(result2)

2.2 字符匹配
| 字符匹配 | 描述 | 
|---|---|
| . | 任意单个字符(除了\n) | 
| [ ] | 匹配中括号中的任意1个字符。并且特殊字符写在[ ]会被当成普通字符来匹配 | 
| [ .-.] | 匹配中括号中范围内的任意1个字符,例如[a-z],[0-9] | 
| [^] | 匹配 [^字符] 之外的任意一个字符 | 
| \d | 匹配数字,等效[0-9] | 
| \D | 匹配非数字字符,等效[^0-9] | 
| \s | 匹配单个空白字符(空格、Tab键),等效[\t\n\r\f\v] | 
| \S | 匹配空白字符之外的所有字符,等效[^\t\n\r\f\v] | 
| \w | 匹配字母、数字、下划线,等效[a-zA-Z0-9_] | 
| \W | 与\w相反,等效[^a-zA-Z0-9_] | 
1.匹配单个字符,使用"."
a = 'this is jdasi1!#@sjkdjalk'
import reqingjun1 = re.match(".",a)
qingjun2 = re.match("..",a)
qingjun3 = re.match("...",a)
print(qingjun1.group())
print(qingjun2.group())
print(qingjun3.group())

 2.匹配[ ]中任意一个字符。
a = 'this is jdasi1!#@sjkdjalk'
import reqingjun1 = re.match("[tZZx]",a)
qingjun2 = re.match("[tZZx][shj]",a)
qingjun3 = re.match("[tZZx][shj][iOk]",a)     ##第1个[]匹配字符串中第1个字符,第2个[]匹配字符串中第1个字符,以此类推。
qingjun4 = re.match("[^i]",a)       ##取反匹配,匹配除i之外的任意字符,所以能匹配到t。
qingjun5 = re.match("[a-z][a-k]",a)     ##匹配a~z中任意字符。
print(qingjun1.group())
print(qingjun2.group())
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())

3.匹配数字,”\d“。
a = '99isl3'
import reqingjun1 = re.match("[0-9]",a)
qingjun2 = re.match("[0-9][0-9]",a)
qingjun3 = re.match("[0-9][0-9][a-z]",a)
qingjun4 = re.match("\d\d",a)       ## \d等同于[0-9]
qingjun5 = re.match("\d\d[a-z]",a)
qingjun6 = re.match("\d\d\D",a)    ## \D等同于[^0-9]
print(qingjun1.group())
print(qingjun2.group())
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
print(qingjun6.group())

 4.匹配单个空白字符,”\s“。
a = '99 isl3'
import reqingjun3 = re.match("\d\d\s\D",a)
qingjun4 = re.match("[0-9][0-9]\s[a-z]",a)
print(qingjun3.group())
print(qingjun4.group())

 5.匹配空白字符之外的所有字符,”\S“。
a = '99 isl3'
import reqingjun3 = re.match("\d\d\s\D",a)
qingjun4 = re.match("[0-9][0-9]\s[a-z]",a)
qingjun5 = re.match("\S\S\s[a-z]",a)
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())

 6.匹配字母、数字、下划线,“\w”
a = '99 _\sl3'
import reqingjun3 = re.match("\d\d\s\w\D",a)   ##  \w等效[a-zA-Z0-9_]
print(qingjun3.group())

 7.自动转义,”r““表示原始字符串,有了它,字符串里的特殊意义符号就会自动加转义符。
a = '99\\aks'
import reqingjun3 = re.match("\d\d\\\\[a-z][a-z][a-z]",a)    ##不加r,则需要额外对\转义。
qingjun4 = re.match(r"\d\d\\[a-z][a-z][a-z]",a)    ##加r,自动对\转义。
print(qingjun3)
print(qingjun4)

2.3 数量匹配
| 字符 | 描述 | 
|---|---|
| * | 匹配前面的子表达式0次或多次(无限次) | 
| + | 匹配前面的子表达式1次或多次 | 
| ? | 匹配前面的子表达式0次或1次 | 
| {n} | 匹配花括号前面字符n个字符 | 
| {n,} | 匹配花括号前面字符至少n个字符 | 
| {n,m} | 匹配花括号前面字符至少n个字符,最多m个字符 | 
1.匹配0次或无限次,“ * ”的用法。
a = 'dddjsksls'
import reqingjun3 = re.match(".*",a)   ##匹配所有字符。
qingjun4 = re.match(r"d*",a)    ##匹配d出现的0次或多次。
qingjun5 = re.match(r"dddj*",a)    ##匹配j出现的0次或多次。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())

2.匹配1次或多次,“ + ”的用法。
a = 'dddjsksls'
import reqingjun3 = re.match(".*",a)   ##匹配所有字符。
qingjun4 = re.match(r"d+",a)    ##匹配d出现的1次或多次。
qingjun5 = re.match(r"\D+",a)    ##前面字符出现1次或多次。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())

 3.匹配1次或多次,“ ? ”的用法。
a = 'dddjsksls'
import reqingjun3 = re.match(".*",a)   ##匹配所有字符。
qingjun4 = re.match(r"dd?",a)    ##匹配d出现的0次或1次。
qingjun5 = re.match(r"\D?",a)    ##前面字符出现0次或1次。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())

 4.限制匹配,只匹配{ n }前的n个字符,超过n个字符的之外所有字符都不能被匹配到。
a = '136182290672292'
import reqingjun3 = re.match(".*",a)   ##匹配所有字符。
qingjun4 = re.match(r"\d+",a)    ##匹配所有字符。
qingjun5 = re.match(r"\d{11}",a)    ##限制匹配前11位字符。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())

 5.限制匹配,至少匹配{ n, }中n个字符。
a = '136182290672292'
import reqingjun3 = re.match(".*",a)   ##匹配所有字符。
qingjun4 = re.match(r"\d+",a)    ##匹配所有字符。
qingjun5 = re.match(r"\d{11}",a)    ##限制匹配前11位字符。
qingjun6 = re.match(r"\d{11,}",a)    ##至少匹配前11位字符。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
print(qingjun6.group())

 6.限制匹配,至少匹配{ n,m }中前n位字符,且至多匹配前m位字符。
a = '136182290672292'
import reqingjun3 = re.match(".*",a)   ##匹配所有字符。
qingjun4 = re.match(r"\d+",a)    ##匹配所有字符。
qingjun5 = re.match(r"\d{11}",a)    ##限制匹配前11位字符。
qingjun6 = re.match(r"\d{11,}",a)    ##至少匹配前11位字符。
qingjun7 = re.match(r"\d{11,13}",a)    ##至少匹配前11位,至多匹配13位字符。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
print(qingjun6.group())
print(qingjun7.group())

2.4 边界匹配
| 字符 | 描述 | 
|---|---|
| ^ | 匹配以什么开头 | 
| $ | 匹配以什么结尾 | 
| \b | 匹配单词边界 | 
| \B | 匹配非单词边界 | 
1.例一,判断用户输入的邮箱格式。
import reemail = input("请输入你的邮箱:")
qingjun = re.match('^\w+@[a-z]+\.[a-z]+$',email)   #2571788322@qq.com
if qingjun:print("格式正确!")
else:print("格式错误!")

2.5 分组匹配
| 字符 | 描述 | 
|---|---|
| | | 匹配竖杠两边的任意一个正则表达式 | 
| (re) | 匹配小括号中正则表达式。使用\n反向引用,n是数字,从1开始编号,表示引用第n个分组匹配的内容。 | 
| (?Pre) | 分组别名,name是表示分组名称 | 
| (?P=name) | 引用分组别名 | 
1.分组选择匹配,能匹配中()中的任意一个。
##判断用户输入的邮箱格式。
import reemail = input("请输入你的邮箱:")
qingjun = re.match('^(\w|-)+@[a-z]+\.(com|163)+$',email)   #-2571788322@qq.com、-2571788322@qq.163
if qingjun:print("格式正确!")
else:print("格式错误!")

 
 2.引用分组。
import re
s = '<f1>18213921321<f1>'
qingjun1 = re.match('<(\w+).*<(\w+)>',s)   ##qingjun1效果等于qingjun2。
qingjun2 = re.match('<(\w+).*<(\\1)>',s)  ##正常语法是\n,n为数字,这里需要转义一下,表示引用第一个分组结果。print(qingjun2.group())   ##匹配所有分组。
print(qingjun2.group(1))   ##匹配第1个分组。
print(qingjun2.group(2))   ##匹配第2个分组。

3.分组别名引用。
import re
s = '<f1>18213921321<f1>'
qingjun = re.match('<(?P<baimu1>\w+).*<(?P<baimu2>\w+)>',s)  ##常对分组定义别名,因为引用数字容易出错。
print(qingjun.group())   ##匹配所有分组
print(qingjun.group("baimu1"))   ##引用baimu1分组内容。
print(qingjun.group("baimu2"))   ##引用baimu2分组内容。

2.6 贪婪模式&非贪婪模式
- 贪婪模式:尽可能最多匹配。
- 非贪婪模式:尽可能最少匹配,一般在量词(*、+)后面加个?问号就是非贪婪模式。
1.例一,贪婪模式和非贪婪模式的区别。
import re
s = "hello 666666"
result = re.match("hello 6+", s) # 贪婪匹配
print(result)
result = re.match("hello 6+?", s) # 非贪婪匹配
print(result)

 2.例2,贪婪模式。
import re
s = "我今年23335岁"
result = re.match("\w+(\d+)\w+", s) # 贪婪匹配
print(result.group(1))

 3.例三,非贪婪模式。
import re
s = "我今年23335岁"
result = re.match("\w+?(\d+)\w+", s) # 贪婪匹配
print(result.group(1))

2.7 标志位
| 字符 | 描述 | 
|---|---|
| re.I/re.IGNORECASE | 忽略大小写 | 
| re.S/re.DOTAIL | 匹配所有字符,包括换行符\n,如果没这个标志将匹配除了换行符 | 
1.忽略大小写匹配。
import re
s = "hello world"
result1 = re.match("Hello",s)
print(result1)result2 = re.match("Hello",s,re.I)   ##写法一。
print(result2) result3 = re.match("Hello",s,re.IGNORECASE)    ##写法二。
print(result3)

 2.匹配所有字符,包括换行符。
import re
s = """hello
world
"""result2 = re.match("h.*",s,re.S)  
print(result2)

相关文章:
 
python基础5——正则、数据库操作
文章目录 一、数据库编程1.1 connect()函数1.2 命令参数1.3 常用语句 二、正则表达式2.1 匹配方式2.2 字符匹配2.3 数量匹配2.4 边界匹配2.5 分组匹配2.6 贪婪模式&非贪婪模式2.7 标志位 一、数据库编程 可以使用python脚本对数据库进行操作,比如获取数据库数据…...
 
SpringAOP原理:手写动态代理实现
0、基础知识 AOP我们知道,是在不修改源代码的情况下,为代码添加一些新功能的技术。通过动态代理,可以在不修改原始类代码的前提下,对方法进行拦截和增强。 动态代理常用于在不改变原有业务逻辑的情况下,对方法…...
 
【旅游度假】Axure酒店在线预订APP原型图 旅游度假子模块原型模板
作品概况 页面数量:共 10 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:旅游度假,生活服务 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本作品为「酒店在线预订」的移动端…...
Android JNI系列详解之CMake和ndk-build编译工具介绍
一、前提 CMake和ndk-build只是编译工具,本次主要介绍ndk-build和CMake的区别,下节课介绍他们的使用。 二、CMake工具介绍 CMake:cross platform make,是跨平台的编译工具 CMake是在AndroidStudio2.2之后引入(目前默认…...
 
【Linux取经路】解析环境变量,提升系统控制力
文章目录 一、进程优先级1.1 什么是优先级?1.2 为什么会有优先级?1.3 小结 二、Linux系统中的优先级2.1 查看进程优先级2.2 PRI and NI2.3 修改进程优先级2.4 进程优先级的实现原理2.5 一些名词解释 三、环境变量3.1 基本概念3.2 PATH:Linux系…...
 
TCP编程流程(补充)
目录 1、listen: 2、listen、tcp三次握手 3、 发送缓冲区和接收缓冲区: 4、tcp编程启用多线程 1、listen: 执行listen会创建一个监听队列 listen(sockfd,5) 2、listen、tcp三次握手 三次握手 3、 发送缓冲区和接收缓冲区:…...
 
每天一道leetcode:433. 最小基因变化(图论中等广度优先遍历)
今日份题目: 基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如,&quo…...
 
【C++】做一个飞机空战小游戏(十)——子弹击落炮弹、炮弹与飞机相撞
[导读]本系列博文内容链接如下: 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…...
 
去除UI切图边缘上多余的线条
最近接到UI切图,放进项目,显示边缘有多余线条,影响UI美观。开始以为切图没切好,实则不是。如图: ->解决: 将该图片资源WrapMode改为Clamp...
 
Spring高手之路13——BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor解析
文章目录 1. BeanFactoryPostProcessor 概览1.1 解读 BeanFactoryPostProcessor1.2. 如何使用 BeanFactoryPostProcessor 2. BeanDefinitionRegistryPostProcessor 深入探究2.1 解读 BeanDefinitionRegistryPostProcessor2.2 BeanDefinitionRegistryPostProcessor 的执行时机2.…...
【LeetCode动态规划】详解买卖票I~IV,经典dp题型买
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...
 
【深入探究人工智能】:常见机器学习算法总结
文章目录 1、前言1.1 机器学习算法的两步骤1.2 机器学习算法分类 2、逻辑回归算法2.1 逻辑函数2.2 逻辑回归可以用于多类分类2.3 逻辑回归中的系数 3、线性回归算法3.1 线性回归的假设3.2 确定线性回归模型的拟合优度3.3线性回归中的异常值处理 4、支持向量机(SVM&a…...
设计模式之解释器模式详解及实例
1、解释器设计模式概述: 解释器模式(Interpreter Pattern)是一种设计模式,它主要用于描述如何构建一个解释器以解释特定的语言或表达式。该模式定义了一个文法表示和解释器的类结构,用于解释符合该文法规则的语句。解…...
 
Nodejs沙箱逃逸--总结
一、沙箱逃逸概念 JavaScript和Nodejs之间有什么区别:JavaScript用在浏览器前端,后来将Chrome中的v8引擎单独拿出来为JavaScript单独开发了一个运行环境,因此JavaScript也可以作为一门后端语言,写在后端(服务端&#…...
 
No115.精选前端面试题,享受每天的挑战和学习
文章目录 变量提升和函数提升的顺序Event Loop封装 FetchAPI,要求超时报错的同时,取消执行的 promise(即不继续执行)强缓存和协商缓存的区别token可以放在cookie里吗? 变量提升和函数提升的顺序 在JavaScript中&#…...
 
Elasticsearch:语义搜索 - Semantic Search in python
当 OpenAI 于 2022 年 11 月发布 ChatGPT 时,引发了人们对人工智能和机器学习的新一波兴趣。 尽管必要的技术创新已经出现了近十年,而且基本原理的历史甚至更早,但这种巨大的转变引发了各种发展的“寒武纪大爆炸”,特别是在大型语…...
 
Flink学习笔记(一)
流处理 批处理应用于有界数据流的处理,流处理则应用于无界数据流的处理。 有界数据流:输入数据有明确的开始和结束。 无界数据流:输入数据没有明确的开始和结束,或者说数据是无限的,数据通常会随着时间变化而更新。 在…...
 
[Raspberry Pi]如何用VNC遠端控制樹莓派(Ubuntu desktop 23.04)?
之前曾利用VMware探索CentOS,熟悉Linux操作系統的指令和配置運作方式,後來在樹莓派價格飛漲的時期,遇到貴人贈送Raspberry Pi 4 model B / 8GB,這下工具到位了,索性跳過樹莓派官方系統(Raspberry Pi OS),直…...
 
17.HPA和rancher
文章目录 HPA部署 metrics-server部署HPA Rancher部署Rancherrancher添加集群仪表盘创建 namespace仪表盘创建 Deployments仪表盘创建 service 总结 HPA HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源&…...
 
VS2022远程Linux使用cmake开发c++工程配置方法
文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…...
 
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
 
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
 
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
 
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
 
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
 
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
 
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
