学python的第十九天

网络通信和访问数据库

1.1 基本的网络知识

@TCP/IP

       IP是低级的路由协议,它将数据拆分在许多小的数据包中,并通过网络将他们发送到某一特定地址,但无法保证所有包都抵达目的地,也不能保证包按顺序抵达

       TCP(传输控制协议),是一种高层协议,是面向连接的可靠数据传输协议,数据包未收到,会重发,并对数据包进行准确性检查,保证数据包按顺序抵达。

@IP地址,IPv4和IPv6

       特殊IP地址,127.0.0.1回送地址,只进行本机进程间通信,不进行任何网络传输

@端口(范围:0~65535,小于1024的保留给预定义的服务,如HTTP,80    FTP,20/21   Telnet,23   Email,25等等)

       网络通信程序运行提供网络服务或进行通信,需要不同的端口号进行通信,不仅要指定IP地址,还要指定端口号

@HTTP(端口80)/HTTPS(端口443)

HTTP(超文本传输协议)

HTTP/1.1共定义了8种请求方法,GET和POST方法最常用

HTTPS(超文本传输安全协议):HTTP+SSL,用于提供加密通信及对网络服务器身份的鉴定

1.2 搭建自己的Web服务器

1,安装JDK(java开发工具包)

2,配置java运行环境

3,安装Apache Tomcat服务器

4,启动Apache Tomcat服务器

1.3 urllib.request模块

1,发送GET请求

# 发送GET请求,获取响应
import urllib.request  # 导入urllib.request模块

url = 'http://www.baidu.com/?action=query&ID=10'   # 请求URL网址,?后的内容是请求参数,多个参数用&分隔,例如action是参数名,query是参数值

req = urllib.request.Request(url)  # 创建一个请求对象,默认是GET请求

with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可是使用with as代码块管理和释放
    data = response.read()      # 读取数据,为字节序列数据
    json_data = data.decode()   # 将字节序列数据转换为字符串
    print(json_data)   # 输出字符串数据

2,发送POST请求,提交数据
# 发送POST请求,提交数据

import urllib.request  # 导入urllib.request模块

url = 'http://www.baidu.com/'

# 准备HTTP参数
params_dict = {'action': 'query', 'ID': '10'}
params_str = urllib.parse.urlencode(params_dict)  # 将字典转换为URL参数字符串
print(params_str)

# 字符串转换为字节序列数据
params_bytes = params_str.encode()

# 创建一个请求对象,设置请求方法为POST
req = urllib.request.Request(url, data=params_bytes)  # 发送POST请求,并设置请求方法为POST

with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可使用with as代码块管理和释放
    data = response.read()      # 读取数据,为字节序列数据
    json_data = data.decode()   # 将字节序列数据转换为字符串
    print(json_data)   # 输出字符串数据

1.4 JSON数据 

JSON(JavaScript Object Notation)

构成JSON文档的两种结构为:JSON对象(object)和JSON数组(array)

@1.4.1 JSON对象类似于python中的字典类型

JSON数据中的解码(decode)指将JSON数据转换为python数据,当从网络中接收或从磁盘中读取JSON数据时,需要将其解码为Python数据

{

"name": "a.htm",

"size": "345",

"saved": "true"

}

@1.4.2 JSON数组类似于python中的列表类型,示例如下:

    "text","html","css"

]

@1.4.3 JSON的数值有字符串,数字,true,false,null,对象或数组。null表示空的对象,而且对象和数组可以嵌套

@1.4.4 使用json模块提供的loads(str)函数进行JSON数据的解码,参数str是JSON字符串,返回python数据。

代码示例:

import urllib.request  # 导入urllib.request模块
import json    # 导入json模块

url = 'http://www.baidu.com/?action=query&ID=10'   # 请求URL网址,?后的内容是请求参数,多个参数用&分隔,例如action是参数名,query是参数值

req = urllib.request.Request(url)  # 创建一个请求对象,默认是GET请求

with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可是使用with as代码块管理和释放
    data = response.read()      # 读取数据,为字节序列数据
    json_data = data.decode()   # 将字节序列数据转换为字符串
    print('JSON字符串:', json_data)   # 输出字符串数据
    
    py_dict = json.load(json_data)   # 解码json字符串,返回字典
    print('备忘录ID:', py_dict['ID'])
    print('备忘录日期:', py_dict['CDate'])
    print('备忘录内容:', py_dict['Content'])
    print('用户ID:', py_dict['UserID'])
    

@1.4.5 下载图片示例

# 1.4 下载图片示例
import urllib.request  # 导入urllib.request模块

url = 'http://www.baidu.com/img/logo.png'

req = urllib.request.Request(url)  # 创建一个请求对象,默认是GET请求

with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可使用with as代码块管理和释放
    data = response.read()  # 读取数据,为字节序列数据
    f_name = 'logo.png'  # 文件名
    with open(f_name, 'wb') as f:  # 创建文件对象,并设置写入模式,wb表示写入二进制数据
        f.write(data)  # 将字节序列数据写入文件
        print('图片下载完成')

@1.4.6 返回所有备忘录信息示例

# 1.5 返回所有备忘录信息
import urllib.request  # 导入urllib.request模块
import json

url = 'http://www.baidu.com/'  # 请求URL网址

req = urllib.request.Request(url)  # 创建一个请求对象,默认是GET请求

with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可是使用with as代码块管理和释放
    data = response.read()  # 读取数据,为字节序列数据
    json_data = data.decode()  # 将字节序列数据转换为字符串

    py_dict = json.load(json_data)  # 解码json字符串,返回字典
    record_array = py_dict['Record']  # 获取备忘录数组

    for record_obj in record_array:
        print('--------备忘录信息--------')
        print('备忘录ID:', record_obj['ID'])
        print('备忘录日期:', record_obj['CDate'])
        print('备忘录内容:', record_obj['Content'])
        print('用户ID:', record_obj['UserID'])

2.1 SQLite数据库 

SQLite是嵌入式系统使用的关系数据库,目前的主流版本是SQLite 3。SQLite是开源的,采用C语言编写而成,具有可移植性强、可靠性高 、小而易用等特点。SQLite提供了对SQL-92标准的支持,支持多表、索引、事务、视图和触发。

@2.1.1 SQLite的数据类型,是无数据类型的数据库

支持的数据类型:

INTEGER(有符号的整数类型)

REAL(浮点类型)

TEXT(字符串类型,采用UTF-8,UTF-16)

BLOB(二进制大对象类型,能够存放任意二进制数据)

@2.1.2  Python数据类型与SQLite数据类型的映射

Python数据类型SQLite数据类型
NoneNULL
intINTEGRE
floatREAL
strTEXT
bytesBLOB

 @2.1.3 使用GUI管理工具管理SQLite数据库

如DB Browser for SQLite。

自行下载安装,打开后如下图

1. 创建数据库

2.创建数据表

3.执行SQL语句

4.浏览数据 

 2.2 数据库编程的基本操作

数据库编程主要分为两类:查询(Read)和修改(C插入,U更新,D删除)

查询数据和修改数据

2.3 sqlite3模块API(使用此模块访问数据库)

@ 2.3.1 数据库连接对象Connection

访问第一步是数据库连接

通过connect(database)函数建立数据库连接,参数database是SQLite数据库的文件路径,连接成功,返回数据库连接对象Connection。

Connection有如下重要方法:

close()关闭数据库连接,关闭之后再使用数据库连接将引发异常

commit()提交数据库事务

rollback()回滚数据库事务

cursor()获得Cursor游标对象

@ 2.3.2 游标对象Cursor

一个Cursor游标对象表示一个数据库游标,游标暂时保存了SQL操作所影响到的数据。游标是通过数据库连接创建的。

游标Cursor对象有很多方法和属性,其中的基本SQL操作方法如下:

execute(sql[,parameters]):执行一条SQL语句,sql是SQL语句 ,parameters是为SQL提供的参数,可以是序列或字典类型。返回值是 整数,表示执行SQL语句影响的行数。

executemany(sql[,seq_of_params]):执行批量SQL语句,sql是S QL语句,seq_of_params是为SQL提供的参数,seq_of_params是序列。 返回值是整数,表示执行SQL语句影响的行数。

在通过execute()和executemany()方法执行SQL查询语句后, 还要通过提取方法从查询结果集中返回数据,相关提取方法如下:

fetchone():从结果集中返回只有一条记录的序列,如果没有数 据,则返回None。

fetchmany(size=cursor.arraysize):从结果集中返回小于等于size 记录数的序列,如果没有数据,则返回空序列,size在默认情况下是整 个游标的行数。

fetchall():从结果集中返回所有数据。

2.4 数据库的CRUD操作示例

@2.4.1 数据插入(Creat)

 数据插入操作的SQL语句INSERT,代码如下:

import sqlite3  # 导入sqlite3模块
import os

# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'

# 检查文件是否存在
if not os.path.exists(db_path):
    print(f"数据库文件 {db_path} 不存在!")
i_name = input('请输入姓名:')  # 获取用户输入的姓名
i_sex = input('请输入性别(1表示男,0表示女):')  # 获取用户输入的性别
i_birthday = input('请输入生日(YYYYMMDD):')  # 获取用户输入的生日

try:
    # 连接到SQLite数据库
    con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')

    # 创建一个Cursor对象,用于执行SQL命令
    cursor = con.cursor()

    # 执行SQL查询操作
    sql = 'INSERT INTO  student(s_name, s_sex, s_birthday) VALUES (?, ?, ?)'
    cursor.execute(sql, [i_name, i_sex, i_birthday])  # 执行SQL命令,参数放到序列或元组中

    # 提取数据库事务
    con.commit()
    print('插入成功!')

except sqlite3.Error as e:
    print('插入数据失败:{}'.format(e))

    # 回滚数据库事务
    con.rollback()

finally:
    # 关闭游标
    if cursor:
        cursor.close()

    # 关闭数据库连接
    if con:
        con.close()

@2.4.2 数据查询(Read)

SQL查询语句是SELECT,根据是否带有WHERE子句,分为:无条件查询和有条件查询

***********无条件查询,没有WHERE子句**********,代码如下:

import sqlite3  # 导入sqlite3模块
import os

# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'

# 检查文件是否存在
if not os.path.exists(db_path):
    print(f"数据库文件 {db_path} 不存在!")

try:
    # 连接到SQLite数据库
    con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')

    # 创建一个Cursor对象,用于执行SQL命令
    cursor = con.cursor()

    # 执行SQL查询操作
    sql = 'SELECT s_id, s_name, s_sex, s_birthday FROM student'
    cursor.execute(sql)  # 执行SQL命令

    # 提取结果集
    result_set = cursor.fetchall()
    for row in result_set:
        print('学号:{0} - 姓名:{1} - 性别:{2} - 生日:{3}'.format(row[0], row[1], row[2], row[3]))

except sqlite3.Error as e:
    print('数据库查询发生错误:{}'.format(e))

finally:
    # 关闭游标
    if cursor:
        cursor.close()

    # 关闭数据库连接
    if con:
        con.close()

 *************有条件查询**************有WHERE子句,WHERE子句是查询条件,

代码如下:

# 有条件查询,有WHERE子句,WHERE自己是查询条件
import sqlite3  # 导入sqlite3模块
import os

# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'

# 检查文件是否存在
if not os.path.exists(db_path):
    print(f"数据库文件 {db_path} 不存在!")

istr = input('请输入生日(YYYYMMDD):')  # 获取用户输入的生日

try:
    # 连接到SQLite数据库
    con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')

    # 创建一个Cursor对象,用于执行SQL命令
    cursor = con.cursor()

    # 执行SQL查询操作
    sql = 'SELECT s_id, s_name, s_sex, s_birthday FROM student WHERE s_birthday < ?'  # 查询学生信息
    cursor.execute(sql, [istr])  # 执行SQL命令,参数放到序列或元组中

    # 提取结果集
    result_set = cursor.fetchall()
    for row in result_set:
        print('学号:{0} - 姓名:{1} - 性别:{2} - 生日:{3}'.format(row[0], row[1], row[2], row[3]))

except sqlite3.Error as e:
    print('数据库查询发生错误:{}'.format(e))

finally:
    # 关闭游标
    if cursor:
        cursor.close()

    # 关闭数据库连接
    if con:
        con.close()

@2.4.3 数据更新(Update)

数据更新操作的SQL语句是UPDATE。示例如下:

import sqlite3  # 导入sqlite3模块
import os

# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'

# 检查文件是否存在
if not os.path.exists(db_path):
    print(f"数据库文件 {db_path} 不存在!")
i_id = input('请输入学号:')  # 获取用户输入的学号
i_name = input('请输入姓名:')  # 获取用户输入的姓名
i_sex = input('请输入性别(1表示男,0表示女):')  # 获取用户输入的性别
i_birthday = input('请输入生日(YYYYMMDD):')  # 获取用户输入的生日

try:
    # 连接到SQLite数据库
    con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')

    # 创建一个Cursor对象,用于执行SQL命令
    cursor = con.cursor()

    # 执行SQL查询操作
    sql = 'UPDATE  student SET s_name=?, s_sex=?, s_birthday=? WHERE s_id=?'
    cursor.execute(sql, [i_name, i_sex, i_birthday, i_id])  # 执行SQL命令,参数放到序列或元组中

    # 提取数据库事务
    con.commit()
    print('更新数据库成功')

except sqlite3.Error as e:
    print('更新数据库失败:{}'.format(e))

    # 回滚数据库事务
    con.rollback()

finally:
    # 关闭游标
    if cursor:
        cursor.close()

    # 关闭数据库连接
    if con:
        con.close()

@2.4.4数据删除(Delete)

数据删除操作SQL语句是DELETE。示例如下:

import sqlite3  # 导入sqlite3模块
import os

# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'

# 检查文件是否存在
if not os.path.exists(db_path):
    print(f"数据库文件 {db_path} 不存在!")
i_id = input('请输入要删除学生的学号:')  # 获取学号

try:
    # 连接到SQLite数据库
    con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')

    # 创建一个Cursor对象,用于执行SQL命令
    cursor = con.cursor()

    # 执行SQL查询操作
    sql = 'DELETE  FROM student  WHERE s_id=?'
    cursor.execute(sql, [i_id])  # 执行SQL命令,参数放到序列或元组中

    # 提取数据库事务
    con.commit()
    print('删除数据成功')

except sqlite3.Error as e:
    print('删除数据失败:{}'.format(e))

    # 回滚数据库事务
    con.rollback()

finally:
    # 关闭游标
    if cursor:
        cursor.close()

    # 关闭数据库连接
    if con:
        con.close()

可以看到下图s_id=5的学生张三被删除 

2.5 防止 SQL注入攻击

示例如下:

import sqlite3  # 导入sqlite3模块
import os

# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'

# 检查文件是否存在
if not os.path.exists(db_path):
    print(f"数据库文件 {db_path} 不存在!")

istr = input('请输入生日(YYYYMMDD):')  # 获取用户输入的生日

try:
    # 连接到SQLite数据库
    con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')

    # 创建一个Cursor对象,用于执行SQL命令
    cursor = con.cursor()

    # 执行SQL查询操作
#    sql = 'SELECT s_id, s_name, s_sex, s_birthday FROM student WHERE s_birthday < ?'  # 查询学生信息
#    cursor.execute(sql, [istr])  # 执行SQL命令,参数放到序列或元组中
    sql = 'SELECT s_id, s_name, s_sex, s_birthday FROM student WHERE s_birthday < ' + istr  # 查询学生信息,这种方式容易造成,SQL注入攻击
    cursor.execute(sql)  # 执行SQL命令,参数放到序列或元组中

    # 提取结果集
    result_set = cursor.fetchall()
    for row in result_set:
        print('学号:{0} - 姓名:{1} - 性别:{2} - 生日:{3}'.format(row[0], row[1], row[2], row[3]))

except sqlite3.Error as e:
    print('数据库查询发生错误:{}'.format(e))

finally:
    # 关闭游标
    if cursor:
        cursor.close()

    # 关闭数据库连接
    if con:
        con.close()

图一是查询20050101之前的

图二SQL注入是查询所有数据,如果是删除,损失可想而知!!!! 

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

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

相关文章

【数据结构】哈希桶

目录 前言&#xff1a; 开散列&#xff08;哈希桶&#xff09; 开散列的概念 哈希桶的模拟实现 整体框架 查找 插入 删除 析构函数 前言&#xff1a; 闭散列线性探测缺点&#xff1a;一旦发生哈希冲突&#xff0c;所有的产生哈希冲突的数据连续存储在一块区域&#xff…

算法-栈操作

1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string removeDuplicates(string s) {string stack;for(char& ch:s){if(stack.size()>0&&chstack.back()){stack.pop_back();}else{stack.push_back(ch);}…

2.搭建增长模型-福格行为模型

福格行为模型 Bmat B为行动 m是动机 a是能力 t是触发 mat三者是同时出现的 比如连续签到30天&#xff0c;才送1天会员&#xff0c;这明摆着欺负人&#xff0c;用户难有积极性 但是签到即可或者会员1天&#xff0c;连续30天送30天&#xff0c;这样用户每天都会积极的来签到&…

学习交流论坛-测试报告

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 1. 项目描述2. 测试计划2.1 功能测试2.1.1 测试环境2.1.2 编写测试用例2.1.3 部分手工功能测试 2.2 自动化测试2.2.1 注册页面2.2.2 登录页面2.2.3 博客…

链表(2) ---- 完整版

目录 一 . 前言二 . 头文件声明三 . 代码思绪1. 查找函数的实现2. 在指定位置之前插入3. 在指定位置之后插入4. 删除指定位置的结点5. 删除指定位置之后的结点6. 销毁链表 四 . 完整代码五 . 总结 正文开始 一 . 前言 补充说明&#xff1a; 1、链式机构在逻辑上是连续的&#…

【算法】前缀和

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、一维前缀和二、二维前缀和三、寻找数值的中心下标四、除自身以外数组的乘积五、和为k的子数组六、和…

【Github】sync fork后,意外关闭之前提交分支的pr申请 + 找回被关闭的pr请求分支中的文件

【Github】sync fork后&#xff0c;意外关闭之前提交分支的pr申请 找回被关闭的pr请求分支中的文件 写在最前面原因解析提交pr&#xff0c;pr是什么&#xff1f;rebase 或者 merge 命令 找到分支中被删除的文件找到被关闭的提交请求pr方法1&#xff1a;在公共仓库被关闭的pr中…

LeetCode in Python 69. Sqrt(x) (x的平方根)

求x的平方根&#xff0c;第一想法可能是遍历0&#xff5e;x&#xff0c;求其平方&#xff0c;找到或且但其时间复杂度为O(n)&#xff0c;或是想到遍历0&#xff5e;M即可&#xff0c;其中M x // 2&#xff0c;将时间复杂度降至O()。本文利用二分思想&#xff0c;给出一种时间复…

博睿数据亮相GOPS全球运维大会,Bonree ONE 2024春季正式版发布!

2024年4月25日&#xff0c;博睿数据 Bonree ONE 2024 春季正式版焕新发布。同时&#xff0c;博睿数据AIOps首席专家兼产品总监贺安辉携核心产品新一代一体化智能可观测平台 Bonree ONE 亮相第二十二届 GOPS 全球运维大会深圳站。 Bonree ONE 2024 春季版产品重点升级数据采集、…

网上打印资料多少钱一张?网上打印价格是多少?

在数字化时代&#xff0c;网上打印服务正逐渐成为一种便捷、高效的打印解决方案。对于许多需要打印资料的用户来说&#xff0c;了解网上打印的价格和服务质量至关重要。那么&#xff0c;网上打印资料到底多少钱一张&#xff1f;网上打印价格又是如何呢&#xff1f;今天&#xf…

视频号下载小程序:轻松获取视频号视频

在数字化时代&#xff0c;短视频已成为人们日常生活中不可或缺的一部分。为了满足用户随时随地观看视频的需求&#xff0c;视频号小程序应运而生。本文将详细介绍视频号小程序的下载方法、功能特点以及使用技巧&#xff0c;帮助您更好地享受短视频带来的乐趣。 一、视频号小程…

C++ 之 string类 详细讲解

喜欢的人有点难追怎么办 那就直接拉黑 七个女生在一起是七仙女&#xff0c;那七个男生在一起是什么&#xff1f; 葫芦七兄弟 目录 一、为什么要学习string类 二、标准库中的string类 1.string类 2.string类的常用接口说明 2.1 string类对象的常见构造 2.2 string类对…

Vivado-OOC

OOC⇒Out-of-Context 在Vivado中&#xff0c;对于顶层设计&#xff0c;vivado使用自顶向下的全局&#xff08;global&#xff09;综合&#xff0c;将顶层文件下的所有模块都进行综合&#xff0c;但是在实际设计过程中&#xff0c;顶层设计会被多次修改和综合&#xff0c;但是有…

AI语音侵权第一案:配音演员获赔25万元,如何保护你的声音资产?

会议之眼 快讯 近日&#xff0c;北京互联网法院对全国首例AI声音侵权案作出一审宣判&#xff0c;引发了社会对AI技术与个人权益保护关系的广泛讨论。 原告殷某&#xff0c;一名配音师&#xff0c;发现自己的声音被AI化后在“魔音工坊”APP上出售&#xff0c;遂将运营主体等五…

Linux的学习之路:20、进程信号(2)

摘要 本章讲一下进程信号的阻塞信号和捕捉信号和可重入函数 目录 摘要 一、阻塞信号 1、阻塞信号 2、信号集操作函数 二、捕捉信号 1、内核如何实现信号的捕捉 2、代码实演 三、可重入函数 一、阻塞信号 1、阻塞信号 实际执行信号的处理动作称为信号递达(Delivery) …

MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍

MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍 为了方便操作&#xff0c;我们在sjdwz_test数据库下建立一张表&#xff1a; CREATE TABLE t_student (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(255) DEFAULT NULL COMMENT 名字,age int(255…

Web端Webrtc,SIP,RTSP/RTMP,硬件端,MCU/SFU融合视频会议系统方案分析

Web端视频融合&#xff0c;会议互通已经是视频会议应用的大趋势&#xff0c;一是目前企业有大量的老视频会议硬件设&#xff0c;二新业务又需要Web端支持视频会议监控直播需求&#xff0c;迫切需要一个融合对接的方案&#xff0c;即能把老的设备用起来&#xff0c;又能对接新的…

【每日刷题】Day22

【每日刷题】Day22 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1669. 合并两个链表 - 力扣&#xff08;LeetCode&#xff09; 2. 11. 盛最多水的容器 - 力扣&#…

分类算法——ROC曲线与AUC指标(九)

知道TPR与FPR TPRTP/(TP FN) 所有真实类别为1的样本中&#xff0c;预测类别为1的比例 FPR FP/(FP TN) 所有真实类别为0的样本中&#xff0c;预测类别为1的比例 ROC曲线 ROC曲线的横轴就是FPRate&#xff0c;纵轴就是TPRate&#xff0c;当二者相等时&#xff0c;表示的意义…

Linux 内核设备树 ranges属性

今天有人问了我一下ranges属性&#xff0c;找了相关资料确认后&#xff0c;记录一下&#xff1a; 参考资料链接&#xff1a;让你完全理解linux内核设备树ranges属性地址转换 - vkang - 博客园 (cnblogs.com) ranges属性定义如下&#xff1a; ranges < local_address pa…