【Python基础:语法第四课】列表和元组——Python 里的“爱情”:列表善变,元组长情

【Python基础:语法第四课】列表和元组——Python 里的“爱情”:列表善变,元组长情

在这里插入图片描述


🎬 个人主页艾莉丝努力练剑
专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:

在这里插入图片描述

文章目录


在这里插入图片描述

1 ~> 列表和元组的概念

1.1 列表和元组概念

1.1.1 概念初识

在编程中,我们经常需要使用变量,来保存 / 表示数据。

如果代码中需要表示的数据个数比较少,我们直接创建多个变量即可。

num1 =10 num2 =20 num3 =30......

但是有的时候,代码中需要表示的数据特别多,甚至也不知道要表示多少个数据。这个时候,就需要用到列表。

1.1.2 列表是一种让程序猿在代码中批量表示/保存数据的方式

就像我们去超市买辣条,如果就只是买一两根辣条,那咱们直接拿着辣条就走了。

但是如果一次买个十根八根的,这个时候用手拿就不好拿,超市老板就会给我们个袋子。

这个袋子,就相当于 列表

1.1.3 元组和列表相比,是非常相似的,只是列表中放哪些元素可以修改调整,元组中放的元素是创建元组的时候就设定好的,不能修改调整

列表就是买散装辣条,装好了袋子之后,随时可以把袋子打开,再往里多加辣条或者拿出去一些辣条。

元组就是买包装辣条,厂家生产好了辣条之后,一包就是固定的这么多,不能变动了。
在这里插入图片描述

1.2 最佳实践

# 列表和元组的概念# 变量就是内存空间,用来表示 / 存储数据# 如果表示的数据少,直接定义几个变量就行了# num1# num2# num3# 也有的时候,要表示的数据就比较多# Python的列表和元组,就是这样的机制,可以用一个变量来表示很多个数据# 就类似于其他编程语言中的“数组”# 此处的这个袋子,就是列表 / 元组# 袋子里的辣条,就是我们要表示的数据# 列表和元组,大部分的功能都是差不多的!但是有一个功能是非常明显的区别:# (1)列表是可变的:创建好了之后,随时能改# (2)元组是不可变的:创建好了之后,改不了,要想改,只能丢弃旧的,搞个新的~# 散装辣条,想再多来几根,很容易-->可以随时改 => 列表可变# 包装辣条,想再多来几根不容易,但是可以换一个大包的 => 元组不可变
在这里插入图片描述

2 ~> 创建列表和访问下标

2.1 创建列表

创建列表主要有两种方式。

2.1.1 [ ] 表示一个空的列表

alist =[] alist = list() print(type(alist))

2.1.2 如果需要往里面设置初始值,可以直接写在[ ]当中

可以直接使用 print 来打印 list 中的元素内容。

alist =[1, 2, 3, 4] print(alist)

2.1.3 列表中存放的元素允许是不同的类型

在这里插入图片描述

这一点和 C++ Java 差别较大。

alist =[1, 'hello', True] print(alist)

因为list本身是Python中的内建函数,不宜再使用list作为变量名,因此命名为 alist

2.2 访问下标

在这里插入图片描述

2.2.1 可以通过下标访问操作符 [ ] 来获取到列表中的任意元素

在这里插入图片描述

我们把 [ ] 中填写的数字,称为 下标 或者 索引

在这里插入图片描述
alist =[1, 2, 3, 4] print(alist[2])
在这里插入图片描述

也就是说,如下图所示——

在这里插入图片描述
注意: 下标是从0开始计数的,因此下标为2,则对应着3这个元素。

2.2.2 通过下标不光能读取元素内容,还能修改元素的值

alist =[1, 2, 3, 4] alist[2]=100 print(alist)

2.2.3 如果下标超出列表的有效范围,会抛出异常

在这里插入图片描述
alist =[1, 2, 3, 4] print(alist[100])
在这里插入图片描述


在这里插入图片描述

2.2.4 因为下标是从0开始的,因此下标的有效范围是[0,列表长度-1]。

使用len函数可以获取到列表的元素个数。

在这里插入图片描述
alist =[1, 2, 3, 4] print(len(alist))

2.2.5 下标可以取负数

下标可以取负数,表示 “倒数第几个元素”

在这里插入图片描述
alist =[1, 2, 3, 4] print(alist[3]) print(alist[-1])
alist[-1] 相当于 alist[len(alist) - 1]

2.3 最佳实践

# 列表的创建和下标访问# 创建链表# # 1、直接使用字面值来创建# # [] 就表示一个空的列表# a = []# print(type(a))## # 2、使用 list() 来创建# b = list()# print(type(b))# # 3、使用[]还有个好处:可以在创建列表的时候,在[]中指定列表的初始值# 元素之间使用 , 来分割# a = [1,2,3,4]# print(a)# 4、可以在同一个列表里放不同的变量# a = [1,'hello',True,[4,5,6]]# print(a)# 列表里面可以管理很多元素,通过下标访问的方式来获取到列表中的元素# 要用到一个下标访问运算符 —— 也是[],注意联系上下文,就像-(负号 / 减号) a =[]# 列表# 把[]放到一个列表变量的后面,同时[]写上一个整数此时它就是下标访问运算符# []中间写的这个整数,就是称为“下标”或者“索引”# 5、使用下标访问元素# a = [1,2,3,4]# print(a[2])# # C语言开始,后世的各种语言,下标都是从0开始计数的# # Python中的下标,是从0开始计数的# 6、使用下标来修改列表元素 --> 元组就是只能使用下标来读不能来写了# a = [1,2,3,4]# a[2] = 100# print(a[2])# 由于下标是从0开始计算的-->对于列表来说,下标的有效范围,从0开始,一直到其长度-1为止# 当我们下标超出有效范围的时候,尝试访问,就会出现异常,程序崩溃# 7、超出下标有效范围,就会出现异常# a = [1,2,3,4]# a[100] = 0# print(a)# 报错:IndexError: list assignment index out of range# 报错内容:超出列表的有效范围# 8、可以使用内建函数 len 来获取到列表的长度(元素个数),和字符串类似# a = [1,2,3,4]# print(len(a)) # 知道了列表长度,就很容易知道列表的下标范围了# len(length):len可以传字符串,列表,元组,字典,自定义的类...=>(一个函数可以传这么多类型的原理)动态类型# 9、Python中的下标,其实还可以写成负数# 例如写成 -1,其实等价于len(a) - 1 a =[1,2,3,4] print(a[len(a) - 1])# 或者直接这样理解:-1就是倒数第一个元素!-2就是倒数第二个,以此类推…… print(a[-1])# 简单直观,其实就是a(len(a) - 1)的简写# 4# 4

3 ~> 切片操作

3.1 概念

通过下标操作是一次取出里面第一个元素。

通过切片,则是一次取出一组连续的元素,相当于得到一个 子列表

3.2 理论

3.2.1 使用 [ : ] 的方式进行切片操作

alist =[1, 2, 3, 4] print(alist[1:3])
在这里插入图片描述


alist[1 : 3]中的1 : 3表示的是[1 , 3)这样的由下标构成的前闭后开区间。

也就是从下标为1的元素开始(下标为1的元素即2)到下标为3的元素结束(也就是4),但是不包含下标为3的元素,所以最终结果只有2 , 3

在这里插入图片描述

3.2.2 切片操作中可以省略前后边界

在这里插入图片描述
alist =[1, 2, 3, 4] print(alist[1:])# 省略后边界, 表示获取到列表末尾 print(alist[:-1])# 省略前边界, 表示从列表开头获取 print(alist[:])# 省略两个边界, 表示获取到整个列表
在这里插入图片描述

3.2.3 切片操作还可以指定“步长”,也就是“每访问一个元素后,下标自增几步”

在这里插入图片描述
alist =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(alist[::1]) print(alist[::2]) print(alist[::3]) print(alist[::5])
在这里插入图片描述

3.2.4 切片操作指定的步长还可以是负数,此时是从后往前进行取元素,表示“每访问一个元素之后,下标自减几步”

alist =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(alist[::-1]) print(alist[::-2]) print(alist[::-3]) print(alist[::-5])
在这里插入图片描述

3.2.5 如果切片中填写的数字越界了,不会有负面效果,只会尽可能的把满足条件的元素获取到

alist =[1, 2, 3, 4] print(alist[100:200])
在这里插入图片描述

3.3 最佳实践

# 列表的切片操作# 和列表的下标访问操作很类似——下标访问操作是一次取出一个元素,而切片操作是一次取出一段连续的元素,# 本质上相当于取出当前列表的一个子列表# 一旦涉及到区间,最常见的就是前闭后开区间# 1、切片操作的基本使用# a = [1,2,3,4]# print(a[1:3])# # 2、使用切片的时候,省略边界# a = [1,2,3,4]# # 省略后边界,意思是从开始位置,一直取到整个列表结束# print(a[1:])## # 省略前边界,意思还、是从列表的 0 号元素开始取,一直取到结束的后边界# print(a[:2])## # 此处切片中的下标也可以写成负数# print(a[:-1])## # 还可以把开始边界和结束边界都省略掉?!得到的还是列表自身!# print(a[:])# 3、带有步长的切片操作# 切片操作,还可以指定“步长”,range# a = [1,2,3,4,5,6,7,8,9,0]# print(a[::1])# print(a[::2])# print(a[::3])# print(a[1:-1:2]) # 从1开始到-1结束,步长设定为2# 4、步长还可以是负数,当步长为负数的时候,意思是从后往前来取元素# a = [1,2,3,4,5,6,7,8,9,0]# print(a[::-1]) # 从后往前来取元素# print(a[::-2])# 5、当切片中的访问超出有效下标之后,不会出现异常!而是尽可能地把符合要求的元素给获取到! a =[1,2,3,4,5,6,7,8,9,0] print(a[1:100])# 不光列表,元组也是一样的,甚至前面的字符串也是可以通过切片操作取出其中的一部分的,所涉及到的规则都是一样的

4 ~> 遍历列表元素

4.1 概念

“遍历”指的是把元素一个一个的取出来,再分别进行处理。

4.2 理论

在这里插入图片描述

4.2.1 最简单的办法就是使用 for 循环

alist =[1, 2, 3, 4]forelemin alist: print(elem)

4.2.2 也可以使用 for 循环按照范围生成下标,按下标访问

alist =[1, 2, 3, 4]foriin range(0, len(alist)): print(alist[i])

4.2.3 还可以使用 while 循环,手动控制下标的变化

alist =[1, 2, 3, 4] i =0while i < len(alist): print(alist[i]) i +=1

4.3 最佳实践

在这里插入图片描述


在这里插入图片描述
# 列表的遍历操作# 遍历:把一个列表里面的每个元素,都依次的取出来,并进行某种操作# 就像老师上课点名,不重不漏# 遍历 ==> 搭配循环# 1、使用 for 循环来遍历列表(最常用的,不修改列表本身)# elem就代表了列表里的每个元素,elem就是element这个单词的缩写# a = [1,2,3,4,5]# for elem in a: # for in后面这个要求是一个可迭代对象(可以一个一个取出里面包含的元素)# print(elem) # 在这个遍历过程中,循环里面写的,不一定是打印,还可以是别的# # 不会对原来的列表产生影响,只是修改了elem这个变量# a = [1,2,3,4,5]# for elem in a: # for in后面这个要求是一个可迭代对象(可以一个一个取出里面包含的元素)# # print(elem) # 在这个遍历过程中,循环里面写的,不一定是打印,还可以是别的# elem = elem + 10## print(a)# 2、使用 for 循环遍历——通过下标的方式(如果想在遍历过程中修改列表的值,选择)# a = [1,2,3,4,5]# for i in range(0,len(a)):# print(a[i])# 取到了实打实在列表里面的元素,会对原来的列表产生影响# a = [1,2,3,4,5]# for i in range(0,len(a)):# # print(a[i])# a[i] = a[i] + 10## print(a)# 3、使用 while 循环,通过下标遍历(想在遍历过程中对列表本身的值进行修改) a =[1,2,3,4,5] i =0while i < len(a): print(a[i]) i +=1

5 ~> 新增元素:列表的插入操作

5.1 理论

5.1.1 使用 append 方法,向列表末尾插入一个元素(尾插)

alist =[1, 2, 3, 4] alist.append('hello') print(alist)
在这里插入图片描述

5.1.2 使用 insert 方法,向任意位置插入一个元素

insert 第一个参数表示要插入元素的下标。
alist =[1, 2, 3, 4] alist.insert(1, 'hello') print(alist)
在这里插入图片描述

5.1.3 什么是“方法(method)”

方法其实就是函数,只不过函数是独立存在的,而方法往往要依附于某个“对象"。

像上述代码alist.append,append就是依附于alist,相当于是"针对alist这个列表,进行尾插操作"。

在这里插入图片描述

5.2 最佳实践

# 列表的插入操作# 1、使用 append 往列表末尾新增一个元素(最常用)# a = [1,2,3,4] # 黄色波浪线警告:这个列表初始化可被替换成列表字面量(Pycharm自动识别出我们的代码不太科学)# a.append(5)# a.append('hello') # 完成拼接操作# # 不如直接 ——> a = [1,2,3,4,5,'hello']# print(a)## # 此处的append是搭配列表对象a,来一起使用的,而不是作为一个独立的函数# # type,print,input,len,自定义函数...都是独立的函数# # 这种要搭配对象来使用的函数(function),也叫做“方法”(method)# # 此处,在我们Python中,对象就可以视为“变量”## b = [5,6,7,8]# b.append('world')# print(b)# 2、还可以使用 insert 方法,往列表的任意位置来新增元素 a =[1,2,3,4] a.insert(1,'hello')# 第一个元素是位置,第二个元素是新增元素 a.insert(100,'world')# 超出列表范围,会直接把元素放在列表末尾 print(a)

6 ~> 列表的查找和删除

6.1 查找元素

6.1.1 理论

6.1.1.1 使用 in 操作符,判定元素是否在列表中存在(返回值是布尔类型)
alist =[1, 2, 3, 4] print(2in alist) print(10in alist)
在这里插入图片描述
6.1.1.2 使用 index 方法,查找元素在列表中的下标(返回值是一个整数)

如果元素不存在, 则会抛出异常。

alist =[1, 2, 3, 4] print(alist.index(2)) print(alist.index(10))

6.1.2 最佳实践

# 列表的查找和删除# 一、查找元素# 1、使用 in 来判定某个元素是否在列表中存在# a = [1,2,3,4]# print(1 in a) # 用 in 这样一个运算符就搞定了!# print(10 in a) # 存在返回True,不存在返回False# print(1 not in a)# print(10 not in a)# 2、使用 index 方法来判定当前元素在列表当中的位置,得到了一个下标# a = [1,2,3,4]# print(a.index(2)) # 2的下标# print(a.index(3)) # 3的下标# print(a.index(10)) # 10的下标这里不存在,Python语言允许下标为负数,其他语言下标不能为负数,返回的是-1# # 运行结果:抛出异常 ---> ValueError: 10 is not in list(10并不在列表当中)

6.2 删除元素

6.2.1 理论

6.2.1.1 使用 pop 方法删除最末尾元素
alist =[1, 2, 3, 4] alist.pop() print(alist)
在这里插入图片描述
6.2.1.2 pop 也能按照下标来删除元素
alist =[1, 2, 3, 4] alist.pop(2) print(alist)
在这里插入图片描述
6.2.1.3 使用 remove 方法,按照值删除元素
alist =[1, 2, 3, 4] alist.remove(2) print(alist)
在这里插入图片描述

6.2.2 最佳实践

# 列表的查找和删除# 二、删除元素# 1、使用 pop 删除列表中的最末尾的元素# pop 和前面的 append 是正好相反的# a = [1,2,3,4]# a.pop()# print(a)# 2、使用 pop 还能删除列表中任意位置的元素,pop的参数可以传一个下标过去# 根据下标来更加精确地进行删除# a = [1,2,3,4]# a.pop(1)# print(a)# 3、使用 remove 这个方法 —— 可以按照值来进行删除(不知道下标,但是知道删除的是谁也可以) a =['aa','bb','cc','dd'] a.remove('aa') print(a)

7 ~> 连接链表:列表的拼接

7.1 理论

7.1.1 使用 + 能够把两个列表拼接在一起

此处的结果会生成一个新的列表,而不会影响到旧列表的内容。
alist =[1, 2, 3, 4] blist =[5, 6, 7] print(alist + blist)
在这里插入图片描述


在这里插入图片描述

7.1.2 使用 extend 方法,相当于把一个列表拼接到另一个列表的后面

a.extend(b),是把b中的内容拼接到a的末尾。不会修改b,但是会修改a。

alist =[1, 2, 3, 4] blist =[5, 6, 7] alist.extend(blist) print(alist) print(blist)
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

7.1.3 None(什么都没有)

在这里插入图片描述

7.2 最佳实践

# 列表的拼接# 连接列表# 1、使用 + 针对两个列表进行拼接# a = [1,2,3,4]# b = [5,6,7,8]# c = a + b # 拿 c 接受一下# print(c)# print(a)# print(b)# 使用 + 拼接列表的时候,只是针对当前列表内容生成了一个新的更大的列表,# 旧的原来的 a 和 b 是不变的(原有列表的内容是不变的)# 2、使用 extend 来进行拼接,这个拼接是把后一个列表的内容拼接到前一个列表里(会修改列表内容)# 不需要再来一个额外的变量来接受 a + b 的返回值了# a = [1,2,3,4]# b = [5,6,7,8]# a.extend(b) # 把 b 拼接到 a 的里面# print(a)# print(b)# # 如果用一个变量 c 来接收一下 a + b 的返回值# a = [1,2,3,4]# b = [5,6,7,8]# c = a.extend(b) # 把 b 拼接到 a 的里面# print(a)# print(b)# print(c)# 运行结果:None是一个特殊的变量的值,表示“啥都没有”# extend 方法其实是没有返回值的!# 拿一个变量来接收一个没有返回值的方法的返回值# None非常类似于C语言里面的空指针NULL或者Java里面的null(空引用)# 3、使用 += 来进行拼接# a += b等价于a = a + b# a.extend(b)则是直接把 b 的内容直接拼到了 a 的后面# a += b 和 a.extend(b)有什么区别呢?# a += b 相当于是 a 原来的内容(旧的值)不要了(回收了),把 a 回收之前列表里面的内容和 b 拼接到一个新的大的列表# 这里涉及到重新赋值之后 a 原来内容的一个回收以及数据的一个拷贝构造,所以这个行为相对来说是更加低效的# a.extend(b)相对来说更加高效,省去了数据拷贝和数据释放这样两个过程 a =[1,2,3,4] b =[5,6,7,8] a += b print(a) print(b)# 多了三步操作# 1、多了构造新的大列表的操作# 2、多了把大的列表的值赋给 a 里面的操作# 3、多了把 a 的旧值释放的操作# a.extend(b)则是直接把 b 的内容直接拼到了 a 的后面# 因此我们更倾向于用 extend 来完成列表的一个拼接工作

8 ~> 关于元组:元组的操作

在这里插入图片描述

8.1 概念

元组的功能和列表相比,基本是一致的(区别后面艾莉丝会介绍)。

元组使用 () 来表示。

atuple =() atuple = tuple()

8.2 理论

8.2.1 元组不能修改里面的元素,列表则可以修改里面的元素

因此,像读操作,比如访问下标、切片、遍历、in(是否存在),index(下标)、+等,元组也是一样支持的。

但是,像写入操作,比如修改元素、新增元素、删除元素、extend等,元组则不能支持。

另外,元组在Python中很多时候是默认的集合类型。例如,当一个函数返回多个值的时候——

def getPoint(): return10, 20 result = getPoint() print(type(result))
在这里插入图片描述


此处的 result 的类型,其实是元组。

8.2.2 问题来了,既然已经有了列表,为啥还需要有元组?

元组相比于列表来说,优势有两方面——

(1)假如你有一个列表,现在需要调用一个函数进行一些处理,但是你有不是特别确认这个函数是否会把你的列表数据弄乱,那么这时候传一个元组就安全很多。

(2)我们马上要介绍的字典,是一个键值对结构,要求字典的键必须是“可hash对象(字典本质上也是一个hash表)”,而 一个可hash对象的前提就是不可变。因此元组可以作为字典的键,但是列表不行。

8.3 最佳实践

# 元组的操作# 元组在功能上和列表相比,基本上是一致的# 1、创建元组# 创建空的元组,并且打印元组的类型# a = ()# print(type(a))# b = tuple() # 使用 tuple 这样一种方式来构造元组# print(type(b))# 2、创建元组的时候,指定初始值# a = (1,2,3,4) # 和列表很相似,只不过[]换成了()# print(a)# 3、元组中的元素也可以是任意类型的# a = (1,2,'hello',True,[])# print(a)# 4、(对于元组来说,很多列表上的操作也是支持的)通过下标访问元组中的元素,下标也是从 0 开始,到 len - 1 结束# a = (1,2,3,4)# print(a[1])# print(a[-1]) # 下标可以取负数,表示倒数第一个元素# print(a[100]) # 超出列表范围和列表的行为类似,也会抛出异常,# 运行结果报错 --> IndexError: tuple index out of range(元组的下标超出范围)# 5、通过切片来获取元组中的一个部分# a = (1,2,3,4)# print(a[1:3])# 6、(和列表类似)元组也同样使用 for 循环等方式来进行遍历元素# a = (1,2,3,4)# for elem in a:# print(elem)# 7、可以使用 in 来判定元素是否存在,使用 index 查找元素的下标# a =(1,2,3,4)# print(3 in a) # 判断是否存在# print(a.index(3)) # 下标# 8、可以使用 + 来拼接两个元组# 构建新的可以,修改旧的不行 --> 有些修改性质的操作,元组是不支持的# a = (1,2,3,4)# b = (5,6,7,8)# print(a + b) # 拼出了一个更大的元组# 这个拼接没有修改a、b,只是说基于a、b构建出了一个更大的新元组(旧的没有改)# 上述这些行为,元组和列表都是一样的(没啥区别)# 仔细观察:上面这些操作都是只读的 —— 这些操作只是在读取元组里面的值,而没有对元组进行修改# 元组是“袋装的辣条”,这些操作是不行的# 元组只是支持“读”的操作,不能支持“修改”类的操作# a = (1,2,3,4)# a[0] = 100# 运行结果报错:TypeError: 'tuple' object does not support item assignment(元组不支持修改操作)# a.append(5)# 运行结果报错:AttributeError: 'tuple' object has no attribute 'append'(根本没有append这个方法)# a.pop(0)# 运行结果报错:AttributeError: 'tuple' object has no attribute 'pop'(根本没有pop这个方法,也是不支持的)# a.extend()# 运行结果报错:AttributeError: 'tuple' object has no attribute 'extend'# 上面这些可能涉及到修改的方法写的时候Pycharm都没有补全出来,可见都不行,元组都不支持# 元组和列表之间很大的一个区别就是:列表能读能修改,元组只能读# 10、当进行多元赋值的时候,其实本质上是按照元组的方式来进行工作的! def getPoint(): x =10 y =20return x,y x,y = getPoint()# 这里的x,y也是一个元组,只不过没写括号 print(type(getPoint()))# 打印输出结果:<class 'tuple'> --> 元组# 既然列表能读能修改,为什么还要搞一个只能读不能修改的元组能?# 元组有它自己的用途——# 协同开发的时候,一个程序员 A 实现一些功能,提供给程序员 B 来使用# A 写完一些函数,让 B 去调用# 函数要传参# B 在传参的时候可能会纠结一个问题:我把我的参数传过去了,A 的函数里面是否会把我的参数的内容给改了呢?# 如果使用元组作为参数,就可以避免这样的纠结,减少沟通成本# 元组不能修改 ==> 不可变对象# 不可变对象,是可以哈希的!--> 可以作为字典的键(之后介绍字典的时候会介绍关于“可不可哈希”)# 反过来,不可哈希 --> 不可以作为字典的键# 元组还有一些天然优势,比如不可变对象天然就是线程安全的# 列表和元组最大的区别就是一个可修改一个不可修改,列表和元组都是属于日常开发中的一些常用的类型

9 ~> 列表和元组部分小结

列表和元组都是日常开发最常用到的类型,最核心的操作就是根据 [ ] 来按下标操作。
在需要表示一个“序列”的场景下,就可以考虑使用列表和元组。
如果元素不需要改变,则优先考虑元组。
如果元素需要改变,则优先考虑列表。

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝再次感谢您的阅读!

结语:希望对学习Python相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾:

【Python基础:语法第三课】Python 函数详解:定义、参数、返回值与作用域

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡૮₍ ˶ ˊ ᴥ ˋ˶₎ა

Read more

2026年3月18日 AI 每日动态

2026年3月18日 AI 每日动态

1. 【AI Coding 工具】Claude Code 终于有了"长期记忆"——claude-mem 爆红 Claude Code 用起来顺手,但每次开新会话就像把同事的记忆清零——项目背景要重新交代,之前做过的决策一问三不知。现在有个叫 claude-mem 的开源插件彻底改变了这件事。 它的工作方式很直接:自动抓取每次会话里的工具调用记录(读了哪些文件、改了哪些代码、跑了什么命令),会话结束后用 AI 把这些信息压缩成结构化摘要,下次开工时自动注入进来。一万 Token 的操作记录,最终压缩到 500 Token 左右,同时还支持自然语言检索历史("上次那个 React 重复渲染是怎么解的?")。 目前已有超 3 万人收藏,宣称能节省 90% 的 Token

By Ne0inhk
人工智能:循环神经网络(RNN)与序列数据处理实战

人工智能:循环神经网络(RNN)与序列数据处理实战

循环神经网络(RNN)与序列数据处理实战 1.1 本章学习目标与重点 💡 学习目标:掌握循环神经网络的核心原理、经典变体结构,以及在文本序列任务中的实战开发流程。 💡 学习重点:理解 RNN 的循环计算机制,学会使用 TensorFlow/Keras 搭建基础 RNN 与 LSTM 模型,完成文本分类任务。 1.2 循环神经网络核心原理 1.2.1 为什么需要 RNN 💡 传统的前馈神经网络(如 CNN、全连接网络)的输入和输出是相互独立的。它们无法处理序列数据的上下文关联特性。 序列数据在现实中十分常见,比如自然语言文本、语音信号、时间序列数据等。这些数据的核心特点是,当前时刻的信息和之前时刻的信息紧密相关。 循环神经网络通过引入隐藏状态,可以存储历史信息,从而有效捕捉序列数据的上下文依赖关系。 1.2.2 RNN

By Ne0inhk
当人人都会用AI,你靠什么脱颖而出?

当人人都会用AI,你靠什么脱颖而出?

文章目录 * 一、引言:AI时代,你真的准备好了吗? * 二、脉向AI:连接AI与普通人的桥梁 * 2.1 什么是脉向AI? * 2.2 脉向AI的合作生态 * 2.3 为什么你需要关注脉向AI? * 三、本期重磅:《小Ni会客厅×AI熊厂长》深度对话 * 3.1 访谈背景 * 3.2 核心观点一:商业认知决定变现能力 * 3.3 核心观点二:个人标签决定商业价值 * 3.4 核心观点三:爆款策略决定起步速度 * 3.5 核心观点四:产品思维决定变现上限 * 四、从认知到行动:如何真正用AI赚到钱? * 4.1 建立正确的商业认知 * 4.2 找到你的70分领域

By Ne0inhk
Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos) 在高性能移动应用开发中,本地数据的持久化存储效率往往是决定用户感知流畅度的木桶短板。传统的 SQLite 虽然结构化程度高,但在处理大规模对象关系映射(ORM)时,复杂的 SQL 拼接和反射解析往往会成为性能瓶颈。 ObjectBox 作为一个专为移动设备打造的、跨平台的超高速 NoSQL 数据库,已经成为了许多追求极致体验开发者的首选。而在 Flutter for OpenHarmony 开发中,配合 objectbox_generator,我们可以通过注解驱动的自动化流程,掌握这套高性能数据库的核心用法。 ⚠️ 鸿蒙适配现状提示:截至本文撰写时,ObjectBox 的 Dart 插件尚未提供官方的 OpenHarmony

By Ne0inhk