当前位置: 首页 > news >正文

Python程序设计——列表

一、引言

关键点:一个列表可以存储任意大小的数据集合。

        程序一般都需要存储大量的数值。假设,举个例子,需要读取100个数字,计算出它们的平均值,然后找出多少个数字是高于这个平均值的。程序首先读取100个数字并计算它们的平均值,然后把每个数字和平均值进行比较来确定它是否超过了平均值。为了完成这个任务,这些数字都必须存储在变量内。为了这样做,你必须创建100个变量并且重复编写几乎同样的一段代码100次。显然,编写一个这样的程序是不切实际的。因此,这个问题该怎么,解决?

        我们需要一个高效、条理的方式。Python 提供了一种被称为列表的数据类型,它可以存储一个有序的元素集合。

二、列表基础

关键点:列表是一个用list类定义的序列,它包括了创建、操作和处理列表的方法。列表中的元素可以通过下标来访问。

2.1 创建列表

list类定义了列表。为了创建一个列表,可以使用list的构造方法,如下所示:

list1 = list() # Create an empty list
list2 = list([2,3,4]) # Create a list with elements 2,3,4
list3 = list(["red", "green", "blue"]) # Create a Tist with strings
list4 = list(range(3, 6)) # Create a list with elements 3, 4,5
list5 = list("abcd") # Create a list with characters a,b,C,d

也可以使用下面这个更简单一些的语法来创建列表:

listl = [] # Same as 1ist()
list2 = [2,3,4] # Same as list([2,3,4])
list3 = ["red", "green"] # Same as list(["red", "green"])

列表中的元素用逗号分隔并且由一对中括号([ ])括住。

注意:一个列表既可以包含同样类型的元素也可以包括不同类型的元素。例如,下面的列表也是可以的:

list4 =[2, "three", 4]

2.2 列表是一种序列类型

        Python中的字符串和列表都是序列类型。一个字符串是一个字符序列,而一个列表则是任何元素的序列。序列的常用操作被总结在表10-1 中。对字符串的序列操作同样适用于列表。

2.3 列表使用的函数

        一些Python内嵌函数可以和列表一起使用。可以使用len函数返回列表的元素个数,使用max/min函数返回列表中的最大值元素和最小值元素,而sum函数返回列表中所有元素之和。还可以使用random模块中的shuffle函数随意排列列表中的元素。下面是一些例子:

>>> list1 = [2, 3,4,1,32]
>>> len(list1)
5
>>> max(list1)
32
>>> min(list1)
1
>>> sum(list1)
42
>>> import random
>>> random.shuffle(list1) # Shuffle the elements in 1ist1
>>> list1
[4,1,2,32,3]
>>>

2.4 下标运算符[ ]

一个列表中的元素都可以使用下面的语法通过下标操作符访问:

myList[index]

列表下标是基于0的,也就是说,下标的范围从0到len(myList)-1,如图10-1 中阐述:myList[index]可以像变量一样使用,所以它也被称为下标变量。例如:下面的代码将myList[0]与myList[1]中的值相加并赋给myList[2]。

myList[2] = myList[0] + myList[1]

下面的循环将0赋值给myList[0]、将1赋值给myList[1]、...、将9赋值给myList[9]:

警告:越界访问列表是一个常见的程序设计错误,它会导致一个运行时的“IndexError” 。为了避免这种错误,要确保没有使用超出len(myList)-1的下标。

2.5 列表截取[start:end]

        下标运算符允许选择一个指定下标位置上的元素。而截取操作使用语法list[start:end] 返回列表的一个片段。这个片段是下标从start到end-1的元素构成的一个子列表。下面是一些例子:

>>> list1=[2,3,5,7,9,1]
>>> list1[2 : 4]
[5, 7]
>>>

起始下标和结尾下标是可以省略的。在这种情况下,起始下标为0而结尾下标是最后一个下标。

注意:如果start>=end,那么list[start:end] 将返回一个空表。如果end指定了一个超出列表结尾的位置,那么Python 会将使用列表长度替代end。

2.6  +、*和in/not in运算符

        可以使用连接运算符(+)来组合两个列表,使用复制运算符(*)复制列表中的元素。下面是一些例子:

>>> list1 = [2,3]
>>> 1ist2
[1,9]
>>> list3 = 1ist1 + 1ist2
>>> 1ist3
[2, 3,1,9]
>>>
>>> list4 = 3 * list1
>>> list4
[2, 3,2,3,2,3]
>>>

        通过连接list1 和list2就会得到一个新列表(第3行)。第7行将list1复制三次以创建一个新列表。注意: 3*list1和list1*3相同。

        可以使用in或者not in运算符来判断一个元素是否在列表中。例如:

>>> list1 = [2,3,5,2,33, 21]
>>> 2 in listl
True
>>> 2 not in list1
False
>>>

2.7 使用for循环遍历元素

        Python列表中的元素是可迭代的。Python支持一种便利的for循环,它可以让你在不使用下标变量的情况下顺序遍历列表。例如,下面的代码显示列表mylist中的所有元素。

for u in myList:print(u)

可以这样读代码:“对于mylist中的每个元素u,输出它。”
        如果希望以不同的顺序遍历列表或者改变列表中的元素,那么仍然必须使用下标变量。
例如,下面的代码显示奇数位置上的元素。

for i in range(0, len(myList), 2):print(myList[i])

2.8 比较列表

        可以使用比较运算符(>、>=、<、<=、==、!=)对列表进行比较。为了进行比较,两个列表必须包含同样类型的元素。比较使用的是字典顺序:首先比较前两个元素,如果它们不同就决定了比较的结果;如果它们相同,那就继续比较接下来两个元素,一直重复这个过程,直到比较完所有的元素。下面是一些示例。

>>> listl = ["green", "red", "blue"]
>>> list2 = ["red", "blue", "green"]
>>> list2 == listl
False
>>> list2 != list1
True
>>> list2 >= listl
True
>>> list2 > list1
True
>>> list2 < list1
False
>>> list2 <= listl
False
>>>

2.9 列表解析

        列表解析提供了一种创建顺序元素列表的简洁方式。一个列表解析由多个方括号组成,方括号内包含后跟一个for子句的表达式,之后是0或多个for或if子句。列表解析可以产生一个由表达式求值结果组成的列表。这里是一些例子。

>>> list1 = [ x for x in range(5)] #Returnsalistof0,1,2,3,4
>>> list1
[0,1,2,3,4]
>>>
>>> list2 = [0.5 * x for x in list1]
>>> list2
[0.0,0.5,1.0,1.5,2.0]
>>>
>>> list3 = [x for x in list2 if x < 1.5]
>>> list3
[0.0, 0.5,1.0]
>>>

2.10 列表方法

一旦列表被创建,可以使用list类的方法(如图10-2 所示)来操作列表。

2.11 将字符串分成列表

        str类包括了split 方法,它对于将字符串中的条目分成列表是非常有用的。例如,下面的语句:

items = "Jane John Peter Susan".split()

        就会将字符串“Jane John Peter Susan”分离成列表['Jane' ,'John', 'Peter' ,'Susan']。在这种情况下,字符串中的条目是被空格分隔的。可以使用一个非空格的限定符。例如,下面的语句:

items = "09/20/2012".split("/")

将字符串“09/20/2012” 分成了列表['09','20', '2012']。

注意: Python 支持正则表达式,它是一种使用模式来匹配和分隔字符串的最有效且最有力的特征。正则表达式对于初学者来讲是复杂的。

2.12 输入列表

        可能经常需要编写代码从控制台将数据读入列表。可以在循环里每一行输入一个数据条目并将它追加到列表。例如:下面的代码将10个数字读入一个列表,每一行读一个数字。

lst = [] # Create a list
print("Enter 10 numbers: ")
for i in range(10) :lst.append(eval(input())

        有时候在一行中以空格分隔数据会更加方便。可以使用字符串的split方法从一行输入中提取数据。例如:下面的代码从-行读取10个空格分隔的数给列表。

# Read numbers as a string from the console,
s = input("Enter 10 numbers separated by spaces from one line: ")
items = s.split() # Extract items from the string
lst = [eval(x) for x in items] # Convert items to numbers

        调用input()来读取一-个字符串。使用s.split()来提取字符串s中被空格分隔的条目并返
回列表中的条目。最后一行通过将条目转化成数字来创建一个数字列表 。

2.13 对列表移位

        有时候,需要将列表中的元素向左或向右移动。Python并没有在list类中提供这样的方法,但是可以编写下面的函数来实现向左移。

2.14 简化代码

        列表可以大大简化某些任务的。例如:假设你希望通过给定的月份数字来得到月份的英文名。如果月份名被存储在一个列表中,那么给定月份的名字可以简单地通过下标访问。下面的代码提示用户输人月份数,然后显示它的月份名:

months = ["January", "February", "March", ...., "December"]
monthNumber = eval(input("Enter a month number (1 to 12): "))
print("The month is", months [monthNumber - 1])

        如果不使用months列表,你就只能使用一个冗长的多重if-else语句来决定月份名,如下所示:

if monthNumber == 0:print("The month is January")
elif monthNumber == 1:print("The month is February")
else:print("The month is December")

三、复制列表

关键点:为了将一个列表中的数据复制给另一个列表,必须将元素逐个地从源列表复制到目标列表。

        经常需要在程序中复制一个列表或列表的一部分。在某些情况下,可能会尝试使用赋值语句(=),如下所示:

list2 = list1

        但是,这条语句不会将listl1引用的列表内容复制给list2 ;事实上,它仅仅将list1引用值赋给list2。在这条语句之后,list1 和list2都将指向同一个列表,如图10-7所示。list2 之前指向的列表将不再被引用,它就变成了垃圾( garbage)。list2 所占用的内存空间将被自动收集起来被Python编译器重新使用。

为了将listl完全相同地复制给list2,可以使用:

list2 = [x for x in list1]

或者简化为:

list2 = [] + list1

四、将列表传递给函数

关键点:当列表被传递给函数时,由于列表是一个可变对象,所以列表的内容可能会在函数调用后改变。

        因为列表是一个对象,所以将列表传递给函数就像给函数传递一个对象。例如:下面的函数显示列表中的元素。

def printList(lst) :for element in 1st:print(e1 ement)

可以通过传递列表来调用它。例如:下面的语句调用printlist 函数显示3、1、2、6、4和2。

printList([3,1,2,6,4,2])

注意:前面的语句创建了一个列表,然后把它传递给函数。这里没有显示指向列表的引用变量。这样的列表被称作匿名列表。

        因为列表是可变对象,所以列表的内容可能会在函数内改变。

五、从函数返回一个列表

关键点:当函数返回一个列表时,就会返回这个列表的引用值。

        在调用函数时可以传递列表参数。函数也可以返回列表。例如:下面的函数返回了一个列表,它是另一个列表倒置的结果。

        第2行创建一个新列表result。第4~5行将名为lst的列表中的元素复制给名为result的列表。第7行返回这个列表。例如:下面的语句返回元素为6、5、4、3、2和1的新列表list2。

list1=[1,2,3,4,5,6]
list2 = reverse(list1)

注意: list 类有reverse()方法,可以调用它来倒置一个列表。

六、 查找列表

关键点:如果一个列表是排好序的,那么要查找一个列表中的某个元素,二分查找比线性查找更高效。

        查找是在列表中查找一个特定元素 的方法。例如:判定某个分数是不是包含在一个分数列表里。list 类提供了index 方法来查找并返回匹配列表中某个元素的下标。它也支持in和not in运算符以决定一个元素是否在列表中。

6.1、线性查找法

        线性查找法顺序地将关键元素key和列表中的每一个元素进行比较。它连续这样做,直到这个关键字匹配列表中的某个元素,或者在没有找到匹配元素时已经查找完整个列表。如果找到一个匹配元素,那么线性查找将返回匹配元素在列表中的下标。如果没有匹配,那么查找返回-1。程序清单10-9 中的linearSearch函数可以解释这个方法。

        为了更好地理解这个函数,使用下面的语句对程序进行跟踪。

lst = [1,4,4,2,5,-3,6,2]
i = linearSearch(1st, 4) # Returns 1
j = linearSearch(1st,-4) # Returns -1
k = linearSearch(1st, -3) # Returns 5

        线性查找函数将关键字和列表的每一个 元素进行比较。这些元素可以是任意顺序。如果这,个元素存在,那么算法在找到这个关键字之前需要平均检测列表的一半元素。因为线性查找的运行时间和列表中元素的数量成正比,所以对于大型列表而言,线性查找的效率是很低的。

6.2、 二分查找法

二分查找是对列表值进行查找的另一种常用方法。想运用二分查找法,列表中的元素必须是事先排好序的。假设列表是升序排列的,那么二分查找法会首先将关键字和列表的中间元素进行比较,这时需要考虑下面三种情况

  • 如果关键字小于列表中间的元素,那么你只需要在列表的前半部分继续寻找关键字。
  • 如果关键字等于列表中间的元素,那么查找因为找到一个匹配而结束。
  • 如果关键字大于列表中间的元素,那么你只需要在列表的后半部分继续寻找关键字。

        注意:毫无疑问,二分查找法每次比较之后都排除了一半的列表。有时排除一半的元素,有时排除一半加一个元素。假定这个列表有n个元素。为方便起见,假设n是2的幂。在第一次比较之后,n/2 个元素被留下来进行下一步比较;在第二次比较之后,(n/2) /2个元素被留下。在第k次比较之后,n/2的k次方个元素被留下进行下一步查找。当k= log2n时,列表中只剩下一个元素,只需要进行一次比较即可。因此,在用二分查找时,最坏情况下需要进行log2n+1次比较来在排序列表中找到那个元素。对于一个有着1024 (29) 个元素的列表来说,最坏情况下二分查找只需要进行11次比较,而线性查找则需要进行1023次比较。

        每一次比较之后列表中需要查找的部分就减少一半,分别用low和high来表示列表中当前要查找的第一个下标和最后一个下标。初始情况下,low 是0,而high是len(lst)-1。mid表示中间元素的下标,因此mid是(low+high)/2,图10-9 给出如何利用二分查找在列表[2,4,7,10,11,45,50,59,60,66,69,70,79]中找到关键字11。

        现在,你知道二分查找是如何工作的。下一个任务是如何用Python实现它。但是不要急于一下子就完全实现它。应该逐步开发,一次只做一步。如图10-10a所示,可以从查找的第一次迭代开始。它将关键字和列表的中间元素进行比较,这时low下标是0而high是len(lst)-1。如果key<lst[mid],将high下标指向mid-1 ;如果key==lst[mid],就找到了一个匹配对象,程序将返回mid;如果key>lst[mid],将low下标指向mid+1。

        接下来,考虑添加一个循环来实现函数以完成重复查找,如图10-10b所示。当找到这个关键字,或者当low>high还没有找到,那么这个查找结束。

        当没有找到关键字时,low 是关键字应该被插入以保证列表顺序的插入点。返回插入点要比返回-1更有用。这个函数必须返回一个负值来表示这个关键字不在列表中。能否简单地返回-low?不可以,因为关键字小于lst[0]。一个好的选择是如果关键字不在列表中则让函数返回-low-1。返回-low-1不仅表示这个值不在列表中,也表示值应该被插入的地方。

注意:线性查找法在一个小列表或未排序队列中查找元素时很有用,但是对大型列表而言效率很低,而二分查找法更高效,但是它们需要列表是提前排好序的。

七、排序列表

关键点:对列表元素进行排序的策略有很多种。选择排序和插入排序是两种常用方法。

        就像查找一样,排序也是程序设计中的一个常见任务。类list提供了sort 方法来对一个列表进行排序。

        已经有很多排序算法被开发出来。下面介绍两种简单、直观的排序算法:选择排序和插入排序。通过使用这些算法,可以学会开发和实现其他算法的有价值的技巧。

7.1、选择排序

        假设你希望对一个列表进行升序排列。选择排序会找到列表中的最小元素并将它和第一个元素交换。然后找到剩余元素中值最小的元素并和剩余列表的第一个元素交换,依此类推,直到只剩一个元素。图10-11给出如何运用选择排序对列表[2,9,5,4,8,1,6]进行排序。

        第一次尝试开发一个完整的排序程序可能是比较困难的。编写一段代码完成第一轮迭代,它找到列表的最小元素之后和列表的第一个元素互换,然后观察第二轮迭代时有什么不同,接着是第三轮,依此类推。这样观察会让你能编写一个推广到所有迭代的循环。

7.2、 插入排序

        假如想升序排列一个列表。插入排序算法是通过重复地将一个新元素插 人到一个已排好序的子列表中,直到整个列表排好序。图10-12给出如何利用插入排序对列表[2,9,5,4,8,1,6]进行排序。

 八、总结

  • 可以利用Python内置的len、max、min和sum函数返回一个列表的长度、列表的最大和最小值以及列表中所有元素之和。
  • 可以使用random模块中的shuffle函数将一个列表中的元素打乱。
  • 可以使用下标运算符[]来引用列表中的一个独立元素。
  • 程序员常常会错误地用下标1来引用列表中的第一个元素,但它应该是0。这被称为下标出1错误。
  • 可以使用连接操作符+来连接两个列表,使用复制运算符*来复制元素,使用截取运算符[:]获取一个子列表,使用in和not in运算符来检-一个元素是否在列表中。
  • 可以使用for循环来遍历列表中的所有元素。
  • 可以使用比较运算符来比较两个列表中的元素。
  • 一个列表对象是可变的。可以使用方法append、extend、insert、pop和remove向一个列表添加元素和从一个列表删除元素。
  • 可以使用index方法获取列表中一个元素的下标,使用count方法来返回列表中元素的个数。
  • 可以使用sort和reverse方法来对一个列表中的元素进行排序和翻转。
  • 可以使用split方法来将一个字符串分离成列表。
  • 当调用一个带列表参数的函数时,列表的引用则被传递给这个函数。
  • 如果一个列表已经排好序,那么在列表中查找一个元素时二分查找比线性查找效率更高。
  • 选择排序将列表中的最小元素和第一个元素交换。然后找到剩余元素中最小的元素并与剩余元素的第一个交换,依此类推,直到只剩一个元素为止。
  • 插入排序算法重复地将一个新元素插入排好序的子列表中,直到整个表都排好序为止。

相关文章:

Python程序设计——列表

一、引言 关键点&#xff1a;一个列表可以存储任意大小的数据集合。 程序一般都需要存储大量的数值。假设&#xff0c;举个例子&#xff0c;需要读取100个数字&#xff0c;计算出它们的平均值&#xff0c;然后找出多少个数字是高于这个平均值的。程序首先读取100个数字并计算它…...

NPDP含金量高吗?难考吗?

一&#xff0c;什么是NPDP认证&#xff1f; NPDP认证中文名为产品经理国际资格认证&#xff0c;New Product Development Professional (NPDP) &#xff0c;是由美国 产品开发与管理协会 (PDMA) 所发起&#xff0c; 是国际公认的唯一的新产品开发专业认证&#xff0c;集理论、方…...

windows pip安装出现 error: Microsoft Visual C++ 14.0 is required

可参考&#xff1a;如何解决 Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools“_不吃香菜的小趴菜的博客-CSDN博客 一、安装Visual Studio2022 1、下载&#xff1a;下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 我这使…...

威胁分析风险评估(TARA)影响和攻击可行性评估参考

在威胁分析风险评估&#xff08;TARA)过程中&#xff0c;风险等级由对资产安全属性侵害造成后果的影响等级和威胁的可能性两方面综合评估。 备注&#xff1a;以上内容的评估皆是建立在由信息安全问题引起并导致的前提下。 影响等级评估 影响等级说明&#xff0c;影响从安全&a…...

【教程】H5匿名信源码下载一封来信系统安装流程搭建教程

1、下载源码 匿名信2.0&#xff1a;匿名信h5源码 - 万策云盘 提取码&#xff1a;hOC4 2、查看搭建和使用教程 1,准备授权好的域名和服务器还有源码 2&#xff0c;创建网站和数据库&#xff0c;版本选择7.1【不可以选7.2】 3&#xff0c;上传源码并解压&#xff0c;导入数据…...

PyTorch训练简单的生成对抗网络GAN

文章目录 原理代码结果参考 原理 同时训练两个网络&#xff1a;辨别器Discriminator 和 生成器Generator Generator是 造假者&#xff0c;用来生成假数据。 Discriminator 是警察&#xff0c;尽可能的分辨出来哪些是造假的&#xff0c;哪些是真实的数据。 目的&#xff1a;使…...

django实现文件上传

在django中实现文件上传有三种方法可以实现&#xff1a; 自己手动写使用Form组件使用ModelForm组件 其中使用ModelForm组件实现是最简单的。 1、自己手写 先写一个上传的页面 upload_file.html enctype"multipart/form-data 一定要加这个&#xff0c;不然只会上传文件名…...

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB

本课程基于百度地图技术&#xff0c;由基础入门开始到应用实战&#xff0c;适合零基础入门学习。将企业项目中地图相关常见应用场景的落地实战&#xff0c;包括有地图找房、轻骑小程序、金运物流等。同时讲了基于Netty实现高性能的web服务&#xff0c;来处理高并发的问题。还讲…...

vue实现可缩放拖拽盒子(亲测可用)

特征 没有依赖 使用可拖动&#xff0c;可调整大小或两者兼备定义用于调整大小的句柄限制大小和移动到父元素或自定义选择器将元素捕捉到自定义网格将拖动限制为垂直或水平轴保持纵横比启用触控功能使用自己的样式为句柄提供自己的样式 安装和基本用法 npm install --save vue-d…...

python一次性导出项目用到的依赖

导出依赖列表 如果你用到了Anaconda&#xff0c;记得先激活环境!!!! 下载pipreqs pip install pipreqs 在项目的根目录新建一个run_pipreqs.py文件&#xff0c;复制一下代码&#xff1a; # -*- coding: utf-8 -*- import os import subprocessos.environ["PYTHONIOE…...

移动端网页中的前端视频技术探索

引言 随着移动设备的普及和网络速度的提升&#xff0c;移动端网页中的视频播放已经成为了越来越重要的功能需求。本篇博客将介绍一些在移动端网页中实现前端视频播放的技术探索&#xff0c;并提供详细的代码示例。 1. 基本视频标签 在移动端网页中实现视频播放最基本的方法就…...

题解:ABC277C - Ladder Takahashi

题解&#xff1a;ABC277C - Ladder Takahashi 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;普及。 思维难度&#xff1a;入门。 调码难度&#xff1a;入门。 综合评价&#xff1a;简单。 算法 深度优先搜索简单图论 思路 把每…...

7.11 Java方法重写

7.11 Java方法重写 这里首先要确定的是重写跟属性没有关系&#xff0c;重写都是方法的重写&#xff0c;与属性无关 带有关键字Static修饰的方法的重写实例 父类实例 package com.baidu.www.oop.demo05;public class B {public static void test(){System.out.println("这…...

Android Stodio编译JNI项目,Cmake出错:Detecting C compiler ABI info - failed

在使用Android Stodio编译JNI项目时出现Cmake错误&#xff0c;报错如下&#xff1a; Execution failed for task :app:configureCMakeDebug[arm64-v8a]. > [CXX1429] error when building with cmake using C:\Users\Dell\AndroidStudioProjects\MyApplication2\app\src\ma…...

6.2 Spring Boot整合MyBatis

1、基于Spring BootMyBatis的学生信息系统的设计与实现案例 基于Spring BootMyBatis实现学生信息的新增、修改、删除、查询功能&#xff0c;并实现MySQL数据库的操作。 MySQL数据库创建学生表&#xff08;t_student&#xff09;&#xff0c;有主键、姓名、年龄、性别、出生日…...

在CentOS 7上使用kubeadm部署Kubernetes集群

如有错误&#xff0c;敬请谅解&#xff01; 此文章仅为本人学习笔记&#xff0c;仅供参考&#xff0c;如有冒犯&#xff0c;请联系作者删除&#xff01;&#xff01; 前言&#xff1a; Kubernetes是一个开源的容器编排平台&#xff0c;用于管理和自动化部署容器化的应用程序。…...

这6个免费设计素材网站,设计师都在用,马住

新手设计师不知道去哪里找素材&#xff0c;那就看看这几个设计师都在用的网站吧&#xff0c;免费、付费、商用素材都有&#xff0c;可根据需求选择&#xff0c;赶紧收藏~ 菜鸟图库 https://www.sucai999.com/?vNTYxMjky 菜鸟图库是一个非常大的素材库&#xff0c;站内包含设…...

uni-app引入sortable列表拖拽,兼容App和H5,拖拽排序。

效果: 拖拽排序 背景&#xff1a; 作为一名前端开发人员&#xff0c;在工作中难免会遇到拖拽功能&#xff0c;分享一个github上一个不错的拖拽js库&#xff0c;能满足我们在项目开发中的需要&#xff0c;下面是我在uniapp中使用SortableJS的使用详细流程&#xff1b; vue开发…...

Redis-内存淘汰算法

Redis可以存多少数据 32位的操作系统默认3G 谁现在用32位啊?我们说64位的 一般来讲是不设上限的 但是我们也可以主动配置maxmemory, maxmemory支持各单位: maxmemory 1024 (默认字节) maxmemory 1024KB maxmemory 1024MB maxmemory 1204GB 当Redis存储超过这个配置值&#…...

Git 合并分支时允许合并不相关的历史

git fetch git fetch 是 Git 的一个命令&#xff0c;用于从远程仓库中获取最新的提交和数据&#xff0c;同时更新本地仓库的远程分支指针。 使用 git fetch 命令可以获取远程仓库的最新提交&#xff0c;但并不会自动合并或修改本地分支。它会将远程仓库的提交和引用&#xff…...

世界上最著名的密码学夫妻的历史

Alice和Bob是密码学领域里最著名的虚拟夫妻&#xff0c;自1978年“诞生”以来&#xff0c;到走进二十一世纪的移动互联网时代&#xff0c;作为虚构的故事主角&#xff0c;Alice和Bob不仅在计算机理论、逻辑学、量子计算等与密码学相关的领域中得到应用&#xff0c;他们的名字也…...

二维码网络钓鱼攻击泛滥!美国著名能源企业成主要攻击目标

近日&#xff0c;Cofense发现了一次专门针对美国能源公司的网络钓鱼攻击活动&#xff0c;攻击者利用二维码将恶意电子邮件塞进收件箱并绕过安全系统。 Cofense 方面表示&#xff0c;这是首次发现网络钓鱼行为者如此大规模的使用二维码进行钓鱼攻击&#xff0c;这表明他们可能正…...

前端面试题-CSS

1. 盒模型 ⻚⾯渲染时&#xff0c; dom 元素所采⽤的 布局模型。可通过 box-sizing 进⾏设置。根据计算宽⾼的区域可分为 content-box ( W3C 标准盒模型)border-box ( IE 盒模型)padding-boxmargin-box (浏览器未实现) 2. BFC 块级格式化上下⽂&#xff0c;是⼀个独⽴的渲染…...

6.1 安全漏洞与网络攻击

数据参考&#xff1a;CISP官方 目录 安全漏洞及产生原因信息收集与分析网络攻击实施后门设置与痕迹清除 一、安全漏洞及产生原因 什么是安全漏洞 安全漏洞也称脆弱性&#xff0c;是计算机系统存在的缺陷 漏洞的形式 安全漏洞以不同形式存在漏洞数量逐年递增 漏洞产生的…...

STM32--EXTI外部中断

前文回顾---STM32--GPIO 相关回顾--有关中断系统简介 目录 STM32中断 NVIC EXTI外部中断 AFIO EXTI框图 旋转编码器简介 对射式红外传感器工程 代码&#xff1a; 旋转编码器工程 代码&#xff1a; STM32中断 先说一下基本原理&#xff1a; 1.中断请求发生&#xff1a…...

Python + Selenium 处理浏览器Cookie

工作中遇到这么一个场景&#xff1a;自动化测试登录的时候需要输入动态验证码&#xff0c;由于某些原因&#xff0c;需要从一个已登录的机器上&#xff0c;复制cookie过来&#xff0c;到自动化这边绕过登录。 浏览器的F12里复制出来的cookie内容是文本格式的&#xff1a; uui…...

文件的导入与导出

文章目录 一、需求二、分析1. Excel 表格数据导出2. Excel 表格数据导入一、需求 在我们日常开发中,会有文件的导入导出的需求,如何在 vue 项目中写导入导出功能呢 二、分析 以 Excel 表格数据导出为例 1. Excel 表格数据导出 调用接口将返回的数据进行 Blob 转换,附: 接…...

[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调

文章目录 1、string类的出现1.1 C语言中的字符串 2、标准库中的string类2.1 string类 3、string类的常见接口说明及模拟实现3.1 string的常见构造3.2 string的构造函数3.3 string的拷贝构造3.4 string的赋值构造 4、完整代码 1、string类的出现 1.1 C语言中的字符串 C语言中&…...

【Apollo】赋能移动性:阿波罗自动驾驶系统的影响

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…...

Camunda 7.x 系列【19】表达式语言

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 变量与函数2.1 流程变量2.2 内置环境变量2.3 Spring、CDI Bean2.4 内置上下文函数…...