《python趣味工具》——酷炫二维码(2):批量定制合适的二维码

news2024/12/26 22:53:53

今天,我们将学习如何从Excel中提取相应的内容然后批量生成相应的二维码。


在这里插入图片描述


文章目录

  • 一、Excel的基本操作:
    • 1. Excel的基本结构:
    • 2. 安装xlrd模块:
    • 3. 读取指定工作表:
    • 4. 读取指定内容:
      • Tip:切片读取:
    • 5. 在Excel表中查找指定内容:
      • (1 通过电话号码查找对应的用户:
      • (2 将员工的信息逐行输出:
      • (3 通过姓名查找其他个人信息:
  • 二、 利用Excel表格信息生成对应二维码:
    • 1. 获取文件夹中的文件名:
      • (1 获取路径下所有文件【用户】名:
      • (2 分割文件名获取文件名称:
    • 2. 将姓名与文件名进行比对,生成对应二维码:
    • 3. 生成用户对应二维码:
    • 4. 把二维码保存到新的文件夹中:
  • 三、完整源码:


通过需求分析,我们就得到了解决需求的步骤:

  1. 获取 Excel 中的姓名和电话;
  2. 获取文件夹中的文件名;
  3. 将姓名与文件名进行比对,生成对应二维码;
  4. 把二维码保存到新的文件夹中。

一、Excel的基本操作:

1. Excel的基本结构:

在开始获取表格数据前, 我们需要先学习一下 Excel 表格的基本结构。

汇总一下Excel表格的基本结构:

  1. 工作簿(Workbook):一个Excel表格文件。

  2. 工作表(Worksheet):在工作簿的左下方,可以切换和增删。

  3. 列(Column):默认从字母A开始,依次递增。超过字母Z后,以AA,AB的方式继续计数。

  4. 行(Row):从数字 1 开始,并依次递增。

  5. 单元格(Cell):通过列号和行号对单元格进行定位。

在这里插入图片描述


2. 安装xlrd模块:

接下来,我们要使用 Python 获取 Excel 表格文件。

在这里我们使用 xlrd 模块。

xlrd 不是一个内置模块,所以在使用前要先通过代码
pip install xlrd==1.2.0 进行安装。

如果在自己电脑上安装不上或安装缓慢,可在命令后添加
pip install xlrd==1.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/
进行加速。

安装之后,使用 import 在代码中导入 xlrd 模块。

# 导入xlrd模块
import xlrd

xlrd 模块主要用来读取 Excel 表格数据,支持 .xls 和 .xlsx 类型的文件。
在这里插入图片描述


3. 读取指定工作表:

读取指定工作表可以通过下面这段代码来实现:

# 导入xlrd模块
import xlrd
​
# 将Excel文件路径/Users/minmin/资料.xlsx,赋值给变量path
path = "/Users/minmin/资料.xlsx"# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# print()输出data
print(data)  #输出:<xlrd.book.Book object at 0x7f23fe981a50>

# 调用工作簿的 sheets() 函数,获取所有工作表对象,并以列表方式显示。
tableList = data.sheets()

print(tableList) # 输出:[<xlrd.sheet.Sheet object at 0x7fd3944b9c90>, <xlrd.sheet.Sheet object at 0x7fd3944b4210>]

# 使用sheet_names()获取工作表名称,赋值给变量names
names = data.sheet_names()

# print()输出names
print(names) #输出:['信息', '统计']

上面的代码,使用了 xlrd.open_workbook() 函数和 sheets() 函数,就可以读取 Excel 文件,返回一个指定工作表对象

  1. 调用函数:调用 xlrd.open_workbook() 函数,读取指定路径的工作簿,相当于打开了一份 Excel 文件。

    • 指定路径:工作簿文件的路径需要作为函数参数传入。但如果文件就在代码运行的工作目录,就可以直接传入文件名。(就是绝对路径和相对路径的意思啦)

    • 返回对象:xlrd.open_workbook() 函数读取成功后,会返回一个工作簿对象,本例中我们将这个对象赋值给了变量 data。

  2. Sheet对象:通过调用工作簿的 sheets() 函数,获取所有工作表对象,并以列表方式显示。

如果事先不知道工作簿内有哪些工作表,我们可以通过调用工作簿的 sheet_names() 函数,来获取一个包含所有工作表名称的列表。


接着,通过索引的方式来获得对应的工作表对象,并赋值给变量。

在本例中,获取工作簿中第一个工作表。

# 使用sheets()获取工作表对象,索引第一个工作表赋值给变量table
# 方法一:
tableList = data.sheets()
table = tableList[0]

# print()输出table
print(table) #输出:<xlrd.sheet.Sheet object at 0x7f8f377dedd0>

# 方法二:相当于上面的合二为一
table = data.sheets()[0]

# print()输出table
print(table) #输出:<xlrd.sheet.Sheet object at 0x7f8f377dedd0>

4. 读取指定内容:

读取到指定的工作表后,接下来就可以获取指定的内容。

在这里,我们要学习三种读取方式:

  1. 指定行;
  2. 指定列;
  3. 指定单元格。
# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# 使用sheets()获取工作表对象,索引第一个元素赋值给变量table
table = data.sheets()[0]

# 通过调用工作表的 row_values() 函数,读取工作表中第2行数据,并以列表形式返回。
row_value = table.row_values(1)
print(row_value) # 输出:[35.0, '白涵', '女', 15085645407.0, '运营']

# 通过调用工作表的 col_values() 函数,读取工作表中第2列数据,并以列表形式返回。
col_value = table.col_values(1)
print(col_value) # 输出:['名字', '白涵', '白浩涆', '白赫然', '白英发', '白筠']

# 通过调用工作表的 cell_value() 函数,读取工作表中指定单元格数据,并返回单元格的值。这里返回第2行第4列的单元格数据.
cell_value = table.cell_value(1, 3)
print(cell_value)# 输出:15085645407.0
  1. 指定行👇

row_values() 函数传入的参数是行数的索引,即下标从0开始
row_values(0),读取Excel的第 1 行数据;
row_values(1),读取Excel的第 2 行数据。

  1. 指定列👇

col_values() 函数传入的参数是列数的索引,下标也从0开始
col_values(0),读取 Excel 的第 1 列数据;
col_values(1),读取 Excel 的第 2 列数据。

  1. 指定单元格👇

cell_value() 函数的第一个参数为行索引,第二个参数为列索引,且下标都从0开始
cell_value(2, 3) 为第 3 行第 4 列的单元格的值;
cell_value(3, 7) 为第 4 行第 8 列的单元格的值。


Tip:切片读取:

学习了如何读取 Excel 文件指定内容后,现在我们需要读取表格中的名字(第二列)和电话(第四列)。

我们可以使用工作表的 col_values() 函数(返回值为一个列表),读取指定的列,由于表头是我们不需要的内容,所以这里要利用切片 [1:],从第二个元素开始读取!
在这里插入图片描述

切片在前面的列表中有讲,想复习的同学可以去看看:https://eternity.blog.csdn.net/article/details/132748179?spm=1001.2014.3001.5502
(CSDN的博客阅读系统好像是用类似于栈的结构来实现的😄,所以你不必担心点击链接之后回不来的情况!)

# 读取工作表第2列非表头数据,赋值给变量allNames
allNames = table.col_values(1)[1:]

# 读取工作表第4列数据非表头数据,赋值给变量allNumbers
allNumbers=table.col_values(3)[1:]

# print()输出allNames和allNumbers
print(allNames)
print(allNumbers)
# 输出都应该是列表

5. 在Excel表中查找指定内容:

现在我们通过下面3个例子来看看如何在Excel表中查找我们需要的内容:
在这里插入图片描述

(1 通过电话号码查找对应的用户:

怎样通过电话号码查找到对应的用户是谁呢?

这里我们需要了解两个知识点:

1️⃣index() 函数:

用于从列表中找出某个值的索引位置,如:

nameList = ["Coco", "Yoyo", "Lily", "Anna"]
name = nameList.index("Anna")
print(name) # 3

2️⃣字典的运用:

当我们要定义一个dict操作时,可以使用下面的格式:

# 定义应一个字典:
productItems{"apple":10,"banana":20,"orange":30,"mango":40}

#输出字典
print(productItems)

# 输出字典中某个键的值
print(productItems["apple"])

# 修改字典中的“apple”为“苹果”
productItems["apple"]="苹果"

# 向字典中添加一个键值对
productItems["grapes"]=50

# 再次输出字典
print(productItems)

OK,下面我们来看看如何查找:

# 导入xlrd
import xlrd

# 将Excel文件夹路径/Users/minmin/资料.xlsx,赋值给变量path
path = "/Users/minmin/资料.xlsx"

# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# 使用sheets()获取工作表对象,索引第一个元素复制给变量table
table = data.sheets()[0]

# 需要查询的电话
phoneList = [111112113114115]

# 新建一个字典name_dic
name_dic={}

# 调用col_values()和切片读取工作表第2列非表头数据,赋值给变量allNames
# 读取工作表第4列数据非表头数据,赋值给变量allNumbers

allNames=table.col_values(1)[1:]
allNumbers=table.col_values(3)[1:]
# for循环遍历phoneList赋值给num
for num in phoneList:
    # 如果num在列表allNumbers中
    if num in allNumbers:
        # 通过index()函数查找num
        # 赋值给变量index
        index=allNumbers.index(num)
        # 在字典中添加键值对
        # 键为num,对应的值为列表allNames索引index的元素
        name_dic[num]=allNames[index]
    # 否则
    else:
        # 将"查无此人"赋值给字典中num对应的值
        name_dic[num]= "查无此人"

# print()输出name_dic
print(name_dic)      

(2 将员工的信息逐行输出:

想要逐行输出 Excel 表格数据,应该怎么做呢?

在这里,我们需要可以获取工作表中的总行数,然后一行一行的传入 row_values() 函数中,这样就可以按行输出数据了。

在这里插入图片描述

.nrows 属性可以获取工作表的行数,如下:

rows = table.nrows
print(rows)

示例代码如下:

# 导入xlrd模块
import xlrd

# 将Excel文件夹路径/Users/minmin/资料.xlsx,赋值给变量path
path = "/Users/minmin/资料.xlsx"

# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# 使用sheets()获取工作表对象,索引第一个元素赋值给变量table
table = data.sheets()[0]

# 获取工作表的行数
rows=table.nrows
i=0
while i<rows:
    row_value=table.row_values(i)
    print(row_value)
    i+=1
    
# for row in range(1,rows):
#     data_row=table.row_values(row)
#     print(data_row)    


(3 通过姓名查找其他个人信息:

怎样做可以实现只要输入姓名,就可以找到该同事的全部信息。

步骤如下:

  1. 使用 input() 函数输入查找员工姓名;

  2. 遍历工作表,按行提取数据;

  3. 如果行数据中的第二个元素为员工姓名,就是输出这一行的数据。

工作表部分截图

在这里插入图片描述
示例代码如下:

# 导入xlrd模块
import xlrd

# 将Excel文件夹路径/Users/minmin/资料.xlsx,赋值给变量path
path = "/Users/minmin/资料.xlsx"

# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# 使用sheets()获取工作表对象,索引第一个元素赋值给变量table
table = data.sheets()[0]

# 获取table的行数,并赋值给变量rows
rows = table.nrows

# 使用input()函数"请输入员工姓名:",将输入内容赋值给name
name=input("请输入员工姓名:")

# for循环遍历工作表非表头的行数,赋值给变量row
for row in range(1,rows):
    # 使用row_values()得到工作表的对应行数据,并赋值给变量data_row
    data_row=table.row_values(row)
    # 如果data_row的第二个元素为name
    if(data_row[1]==name):
        # print()输出data_row
        print(data_row)
        
        # 退出循环
        break

二、 利用Excel表格信息生成对应二维码:

步骤:

  1. 获取 Excel 中的姓名和电话;✅
  2. 获取文件夹中的文件名;
  3. 将姓名与文件名进行比对,生成对应二维码;
  4. 把二维码保存到新的文件夹中。

1. 获取文件夹中的文件名:

现将存有头像图片的文件夹放在路径 /Users/minmin/Selfie,我们需要获取的是该文件夹中所有的文件名称。

在这里,我们要分两步获取文件名称:

  • 第一步,获取文件夹内全部的文件名;
  • 第二步,分割文件名获取文件名称。
    在这里插入图片描述

(1 获取路径下所有文件【用户】名:

# 要对文件进行处理,首先导入 os 模块
# os 模块是 Python 的内置模块,不需要安装可以直接导入。
import os


# 定义一个变量 pathFile 并将文件夹路径以字符串的格式赋值给它
pathFile = "/Users/yequ/picture"

# 调用 listdir() 函数获取文件夹中所有文件名,传入参数文件夹路径
allItems = os.listdir(pathFile)

# listdir()函数返回一个列表,列表中的每个元素是文件夹中的文件名。
print(allItems)

great!从文件夹中获取了全部的文件名,如果你在本地运行代码,输出文件夹中所有的文件名,就会有出现一个".DS_Store"🤔

.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于 Windows 的 desktop.ini。
这个文件对我们的项目没有用处,在接下来的操作中,我们可以把它排除掉。


(2 分割文件名获取文件名称:

Python 中的内置函数 split() ,通过指定分隔符对字符串进行切片。

# 定义一个字符串
item = "qq.png"

# 将分隔符作为参数传入到 split() 函数中
# 即可把字符串按照指定分隔符切分成多个字符串组成的列表。
# 分隔符不会保留在分割后的字符串中。
fileName = item.split(".") # 输出列表
print(fileName)

# 由于 split() 函数返回的是分割后字符串组成的列表
# 而列表中的元素可以索引提取:
fileName1 = item.split(".")[0] # 输出前一个元素
print(fileName1)

好了,现在我们就能得到所有的文件名啦!

示例代码如下:

# 导入xlrd模块
import xlrd

# 导入os模块
import os

# 将Excel文件路径/Users/minmin/资料.xlsx,赋值给变量path
path = "/Users/minmin/资料.xlsx"

# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# 使用sheets()获取工作表对象,索引第一个元素赋值给变量table
table = data.sheets()[0]

# 调用col_values()和切片读取工作表第2列非表头数据,赋值给变量allNames
# 读取工作表第4列数据非表头数据,赋值给变量allNumbers
allNames = table.col_values(1)[1:]
allNumbers = table.col_values(3)[1:]

# 将文件夹路径"/Users/minmin/Selfie",赋值给pathFile
pathFile = "/Users/minmin/Selfie"

# 使用os.listdir()函数获取该路径下所有文件名,并赋值给变量allItems
allItems = os.listdir(pathFile)

# for循环遍历allItems,赋值给变量item
for item in allItems:
    # 如果item不等于".DS_Store"
    if item != ".DS_Store":
        # 通过"."分割文件名
        # 索引第一个元素赋值给变量fileName
        fileName = item.split(".")[0]
        # print()输出fileName
        print(fileName)

2. 将姓名与文件名进行比对,生成对应二维码:

接下来,我们要把文件名称与 Excel 文档中的姓名进行比对,找到对应的电话号码。

之前,我们已经把所有姓名存储在列表 allNames 中,所有电话存储在列表 allNumbers 中,这两个列表中的元素,是一 一对应的关系。也就是说,如果文件名称在列表 allNames 中,就找到该文件名称在列表 allNames 中的索引;通过索引也就能找到列表 allNumbers 中对应的电话号码。🤔

如何查找列表中的元素的索引,上面已经说过了,使用 index() 函数,传入查找对象,返回对应的索引位置。

示例代码如下:

# 导入xlrd模块
import xlrd

# 导入os模块
import os

# 将Excel文件路径/Users/minmin/资料.xlsx,赋值给变量path
path = "/Users/minmin/资料.xlsx"

# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# 使用sheets()获取工作表对象,索引第一个元素赋值给变量table
table = data.sheets()[0]

# 调用col_values()和切片读取工作表第2列非表头数据,赋值给变量allNames
# 读取工作表第4列数据非表头数据,赋值给变量allNumbers
allNames = table.col_values(1)[1:]
allNumbers = table.col_values(3)[1:]

# 将文件夹路径"/Users/minmin/Selfie",赋值给pathFile
pathFile = "/Users/minmin/Selfie"

# 使用os.listdir()函数获取该路径下所有文件名,并赋值给变量allItems
allItems = os.listdir(pathFile)

# for循环遍历allItems,赋值给变量item
for item in allItems:
    # 如果item不等于".DS_Store"
    if item != ".DS_Store":
        # 通过"."分割文件名
        # 索引第一个元素赋值给变量fileName
        fileName = item.split(".")[0]
        # 如果fileName在列表allNames中
        if fileName in allNames:
            # 查找fileName在列表allNames中的索引位置
            # 赋值给变量index
            index = allNames.index(fileName)
            # 通过列表allNumbers索引index,赋值给变量phoneNumber
            phoneNumber = allNumbers[index]
            # print()输出phoneNumber
            print(phoneNumber)

太好啦~我们根据文件名称,找到了对应的电话号码。
在这里插入图片描述


3. 生成用户对应二维码:

接下来,就要将电话号码与对应的头像作为参数值,传入生成二维码的代码里。

下面是生成二维码的一些常用函数:
在这里插入图片描述
我们这里通过4步来生成二维码:

  1. 首先,从 MyQR 模块中导入 myqr

  2. 调用 myqr.run() 函数,传入参数 words,由于其类型为字符串,我们要使用str()函数,将变量 phoneNumber 从整型转换成字符串;

  3. 传入参数 picture,设置参数值为头像路径,需要使用格式化将文件夹路径与文件名拼接,也就是 f"/Users/minmin/Selfie/{item}"。

  4. 添加参数 save_name,将二维码图片的文件名设置为对应的头像名 item。

示例代码如下:

# 导入xlrd模块
import xlrd

# 导入os模块
import os

# 使用from...import从MyQR模块中导入myqr
from MyQR import myqr

# 将Excel文件路径/Users/minmin/资料.xlsx,赋值给变量path
path = "/Users/minmin/资料.xlsx"

# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# 使用sheets()获取工作表对象,索引第一个元素赋值给变量table
table = data.sheets()[0]

# 调用col_values()和切片读取工作表第2列非表头数据,赋值给变量allNames
# 读取工作表第4列数据非表头数据,赋值给变量allNumbers
allNames = table.col_values(1)[1:]
allNumbers = table.col_values(3)[1:]

# 将文件夹路径"/Users/minmin/Selfie",赋值给pathFile
pathFile = "/Users/minmin/Selfie"

# 使用os.listdir()函数获取该路径下所有文件名,并赋值给变量allItems
allItems = os.listdir(pathFile)

# for循环遍历allItems,赋值给变量item
for item in allItems:
    # 如果item不等于".DS_Store"
    if item != ".DS_Store":
        # 通过"."分割文件名
        # 索引第一个元素赋值给变量fileName
        fileName = item.split(".")[0]
        
        # 如果fileName在列表allNames中
        if fileName in allNames:
            # 查找fileName在列表allNames中的索引位置
            # 赋值给变量index
            index = allNames.index(fileName)
            # 通过列表allNumbers索引index,赋值给变量phoneNumber
            phoneNumber = allNumbers[index]    
            
            # 从myqr中调用run()函数
            # 添加参数words,参数值为字符串phoneNumber
            # 添加参数picture,参数值为f"/Users/minmin/Selfie/{item}"
            # 添加参数save_name,参数值为item
            myqr.run(words=str(phoneNumber),
                     picture=f"/Users/minmin/Selfie/{item}",
                     save_name=item)

代码运行成功后,会生成黑白二维码,用手机扫码,出现对应了电话号码。


4. 把二维码保存到新的文件夹中:

接下来,我们要调整下二维码的样式,把图片变成彩色,并保存在新建的文件夹里。

  • 继续在 myqr.run() 函数设置参数,传入参数 colorized,参数值设置为 True

  • 传入参数 save_dir,将生成的二维码保存在指定的文件夹中,文件夹路径为:“/Users/minmin/myqr”。

 myqr.run(words=str(phoneNumber),
                     picture=f"/Users/minmin/Selfie/{item}",
                     save_name=item,
                     colorized=True,
                     save_dir="/Users/minmin/myqr")

代码运行成功后,在名为 myqr 的文件夹中生成了彩色的二维码,不错不错👏👏👏

在本地练习时,一定要先创建空白文件夹,再把二维码保存在指定文件夹路径中,不然程序就会报错哦~


三、完整源码:

🎉🎉🎉完结撒花!!!我们已经成功地实现了如何去批量定制合适的二维码,下面附上完整的代码:

# 导入xlrd模块
import xlrd

# 导入os模块
import os

# 使用from...import从MyQR模块中导入myqr
from MyQR import myqr

# 将Excel文件路径/Users/minmin/资料.xlsx,赋值给变量path
path = "/Users/minmin/资料.xlsx"

# 读取path的工作簿并赋值给变量data
data = xlrd.open_workbook(path)

# 使用sheets()获取工作表对象,索引第一个元素赋值给变量table
table = data.sheets()[0]

# 调用col_values()和切片读取工作表第2列非表头数据,赋值给变量allNames
# 读取工作表第4列数据非表头数据,赋值给变量allNumbers
allNames = table.col_values(1)[1:]
allNumbers = table.col_values(3)[1:]

# 将文件夹路径"/Users/minmin/Selfie",赋值给pathFile
pathFile = "/Users/minmin/Selfie"

# 使用os.listdir()函数获取该路径下所有文件名,并赋值给变量allItems
allItems = os.listdir(pathFile)

# for循环遍历allItems,赋值给变量item
for item in allItems:
    # 如果item不等于".DS_Store"
    if item != ".DS_Store":
        # 通过"."分割文件名
        # 索引第一个元素赋值给变量fileName
        fileName = item.split(".")[0]
        
        # 如果fileName在列表allNames中
        if fileName in allNames:
            # 查找fileName在列表allNames中的索引位置
            # 赋值给变量index
            index = allNames.index(fileName)
            # 通过列表allNumbers索引index,赋值给变量phoneNumber
            phoneNumber = allNumbers[index]    
            
            # 从myqr中调用run()函数
            # 添加参数words,参数值为字符串phoneNumber
            # 添加参数picture,参数值为f"/Users/minmin/Selfie/{item}"
            # 添加参数save_name,参数值为item
            myqr.run(words=str(phoneNumber),
                     picture=f"/Users/minmin/Selfie/{item}",
                     save_name=item
                     colorized=True,
                     save_dir="/Users/minmin/myqr")

注意,完整的源码复制过去可能并不能运行,你需要根据实际情况修改路径!但是代码的思路是一样的,可以进行参考!


在这里插入图片描述

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

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

相关文章

线性代数的学习和整理19,特征值,特征向量,以及引入的正交化矩阵概念(草稿)

目录 1 什么是特征值和特征向量&#xff1f; 1.1 特征值和特征向量这2个概念先放后 1.2 直观定义 1.3 严格定义 2 如何求特征值和特征向量 2.1 方法1&#xff1a;结合图形看&#xff0c;直观方法求 2.1.1 单位矩阵的特征值和特征向量 2.1.2 旋转矩阵 2.2 根据严格定义…

buuctf crypto 【RSA2】解题记录

1.打开文件 2.写脚本 3.16进制转字符串

Ardupilot — AP_OpticalFlow代码梳理

文章目录 前言 1 Copter.cpp 1.1 void Copter::setup() 2 system.cpp 2.1 void Copter::init_ardupilot() 3 sensors.cpp 3.1 void Copter::init_optflow() 3.2 对象optflow说明 4 OpticalFlow.cpp 4.1 void OpticalFlow::init(uint32_t log_bit) 5 AP_OpticalFlow_…

十三、函数式编程(1)

本章概要 新旧对比Lambda 表达式 递归 函数式编程语言操纵代码片段就像操作数据一样容易。 虽然 Java 不是函数式语言&#xff0c;但 Java 8 Lambda 表达式和方法引用 (Method References) 允许你以函数式编程。 在计算机时代早期&#xff0c;内存是稀缺和昂贵的。几乎每个人…

手写Spring:第20章-事务处理

文章目录 一、目标&#xff1a;事务处理二、设计&#xff1a;事务处理2.1 事务单元测试2.2 事务设计 三、实现&#xff1a;事务处理3.1 工程结构3.2 事务管理的核心类图3.3 定义事务注解3.3.1 定义事务注解3.3.2 定义事务接口3.3.3 默认事务定义实现类3.3.4 委托事务定义实现类…

Java 多线程系列Ⅵ(并发编程的六大组件)

JUC 组件 前言一、Callable二、ReentrantLock三、Atomic 原子类四、线程池五、Semaphore六、CountDownLatch 前言 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 标准库中的一个包&#xff0c;它提供了一组并发编程工具&#xff0c;本篇文章就介绍几组常见的 JUC 组…

win10自带wifi共享功能

1、按下【wini】组合键打开windows设置&#xff0c;点击【网络和internet】&#xff1b; 2、按照下图&#xff0c;打开个移动热点&#xff0c;设置名称、密码。

Blender--》页面布局及基本操作讲解

接下来我会在three.js专栏中分享关于3D建模知识的文章&#xff0c;如果学习three朋友并且想了解和学习3D建模&#xff0c;欢迎关注本专栏&#xff0c;关于这款3D建模软件blender的安装&#xff0c;我在前面的文章已经讲解过了&#xff0c;如果不了解的朋友可以去考考古&#xf…

DeepinV20安装MSJDK17

装什么版本的JDK https://learn.microsoft.com/zh-cn/java/openjdk/download#openjdk-17 通常来讲&#xff0c;选择最适应自己应用程序的版本&#xff0c;例如最新开发的程序基本需要运行在jdk17了&#xff0c;又或者前几年的java程序基本都是jdk11,再旧一点的jdk8。尽可能选…

【C++深入浅出】类和对象中篇(六种默认成员函数、运算符重载)

目录 一. 前言 二. 默认成员函数 三. 构造函数 3.1 概念 3.2 特性 四. 析构函数 4.1 概念 4.2 特性 五. 拷贝构造函数 5.1 概念 5.2 特性 六. 运算符重载 6.1 引入 6.2 概念 6.3 注意事项 6.4 重载示例 6.5 赋值运算符重载 6.6 前置和后置运算符重载 七. c…

【Rust日报】2023-09-07 Servo 项目将加入欧洲 Linux 基金会

Servo 项目将加入欧洲 Linux 基金会 Servo 项目由 Mozilla Research 于 2012 年创建&#xff0c;是除编译器本身之外的首个主要 Rust 代码库&#xff0c;自此成为实验性网络引擎设计的标志。Servo 的主要组件已被集成到 Firefox 网络浏览器中&#xff0c;其若干解析器和其他底层…

渗透测试基础之永恒之蓝漏洞复现

渗透测试MS17-010(永恒之蓝)的漏洞复现 目录 渗透测试MS17-010(永恒之蓝)的漏洞复现 目录 前言 思维导图 1,渗透测试 1,1,什么是渗透测试? 1.2,渗透测试的分类: 1.3,渗透测试的流程 1.3.1,前期交互 1.3.2,情报收集 1.3.3,威胁建模 1.3.4,漏洞分析 1.3.5,漏洞验…

软件设计模式(五):代理模式

前言 代理模式是软件设计模式的重中之重&#xff0c;代理模式在实际应用比较多&#xff0c;比如Spring框架中的AOP。在这篇文章中荔枝将会梳理有关静态代理、动态代理的区别以及两种实现动态代理模式的方式。希望能对有需要的小伙伴有帮助~~~ 文章目录 前言 一、静态代理 二…

自定义Dynamics 365实施和发布业务解决方案 - 1. 准备工作

在当前的商业世界中,竞争每时每刻都在加剧每个企业都必须找到在竞争中保持领先的直观方法。其中之一企业面临的主要挑战是在以便为客户提供更好的服务。在这样一个竞争激烈、要求苛刻的时代环境中,对客户关系管理软件的需求是正在增加。 Dynamics 365的CE功能强大且适应性强…

使用JS实现一个简单的观察者模式(Observer)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 手撸Observer⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领…

MySQL数据库——存储引擎(1)-MySQL体系结构、存储引擎简介

目录 MySQL体系结构 连接层 服务层 引擎层 存储层 存储引擎简介 概念 语句 演示 下面开始学习进阶篇的第一个内容——存储引擎 分为四点学习&#xff1a; MySQL体系结构存储引擎简介存储引擎特点存储引擎选择 MySQL体系结构 连接层 最上层是一些客户端和链接服务&am…

小米和金山集团董事长雷军访问武汉:加大投资力度,深化务实合作

小米集团创始人雷军一行在9月6日到访了武汉&#xff0c;受到了当地政府的热情欢迎。武汉方面表示&#xff0c;小米、金山集团作为全球知名的企业集团&#xff0c;与武汉有着良好合作基础。未来&#xff0c;武汉希望小米、金山集团持续深耕武汉&#xff0c;加大投资力度&#xf…

主页整理:8月1日---9月10日

目录 8月1日17点 8月1日20点 8月3日13点 8月3日18点 8月15日19点 8月28日9点 8月28日18点 8月29日8点 8月29日9点 9月2日21点 9月5日17点 9月9日18点 9月10日7点 粉丝变化数 8月1日17点 8月1日20点 8月3日13点 8月3日18点 8月15日19点 8月28日9点 8月28日18点…

Element-ui container常见布局

1、header\main布局 <template> <div> <el-container> <el-header>Header</el-header> <el-main>Main</el-main> </el-container> </div> </template> <style> .el-header { …

日常开发小汇总(3)js类型判断

1.typeof 能判断出字符串、数字、方法和undefined&#xff0c;array、null、object判断不出 let num 1;let str "x";let fn function user(){}let arr [1,2]let obj {name:"zhangs"}let und;let nul null;console.log(typeof num) //numberconsole.l…