人生苦短,我学python之列表(下)

个人主页:星纭-CSDN博客

系列文章专栏:Python

踏上取经路,比抵达灵山更重要!一起努力一起进步!

目录

1.列表的运算

2.in操作符

 3.成员函数

4.切片


1.列表的运算

a = ['C', 'C++']
b = ['Java', 'Python']
print(a + b)  # 输出['C', 'C++', 'Java', 'Python']

与字符串相加类似,列表 + 列表等于两个列表的拼接。

a = ['C', 'C++']
b = ['Java', 'Python']
print(a + b)  # 输出['C', 'C++', 'Java', 'Python']

print(a * 2)  # 输出['C', 'C++', 'C', 'C++']
print(b * 3)  # 输出['Java', 'Python', 'Java', 'Python', 'Java', 'Python']

乘法的本质也是加法,即多个相加,跟字符串类似,字符串*n,表示原字符串重复n次,列表*n所以也是原列表的多次拼接 .

2.in操作符

in操作符用于判断值是否存在于序列(字符串,列表......)中,并且返回一个bool类型的值,如果存在返回真,不存在返回假。

a = [1, 2, 3, 5]
b = 'hello world'
print(4 in a)  # 输出False
print('e' in b)  # 输出True

既然有in,当然有not in,用于返回一个bool类型的值,表明是否不存在序列中。如果不存在返回真,存在返回假。 

 3.成员函数

除了之前所介绍的函数,列表还有许多成员函数比如count() 、copy() 、index()

正如它们的英文一样作用显而易见。

count()函数

a = [1, 2, 3, 1, 1, 2, 5, 6, 7, 4, 6, 8, 10]
print(a.count(1))  # 输出3
print(a.count(2))  # 输出2

该函数会返回括号中参数在列表中出现的次数,如果参数并不在列表中该函数并不会报错,而是返回0.

index()函数 

a = list('hello world')
print(a.index('o'))  # 输出4

这个函数会返回括号中的参数第一次出现在列表中的下标,字符‘o’在列表中出现了两次,但只返回了第一次出现的下标。

如果括号中的参数并不在列表中,就会抛出异常 

意思是值错误:字符1并不在列表中。

copy()函数

这个函数的功能就是复制这个列表。有人肯定就要问了

复制列表不是很简单吗,为啥需要一个专门的函数。有这个想法的读者,肯定会写以下代码

a = [1, 2, 3, 4, 5]
b = a
print(b)  # 输出[1, 2, 3, 4, 5]

比如这样就很简单的将代码复制给了b,但这样的复制其实是不完整的。

a = [1, 2, 3, 4, 5]
b = a
b[0] = 0
print(a)  # 输出[0, 2, 3, 4, 5]
print(b)  # 输出[0, 2, 3, 4, 5]

我们观察以上的代码,我们会发现我们将b的列表第一个元素进行了更改,而a也发生了变化。

这是为什么呢?

我们知道,数据是会存储在内存中 ,而以上的列表就是这样的数据,它也存储在内存中,而我们并不知道它具体存在内存的那里,所以此时就有了变量名,它就是连接程序员和内存的一个桥梁,我们通过变量名就可以控制这些数据。假设a是一串数字,通过这串数字,我们可以打开存储这些数据的大门,并找到这些数据,而b=a这个代码仅仅是将这串数字,交给了b,b和a是同一串数字,那么很明显就只能找到同一个数据。

我们将这串数字称为内部id号

print(id(a), id(b)) # 输出1627578268032 1627578268032

 id()函数就可以获取变量/名字的内部id号,在Python中,id()是一个内置函数,用于获取对象的唯一标识符。它返回一个整数,该整数代表对象在内存中的地址。每个对象都有一个唯一的id,这个id在对象的生命周期中是不会改变的。如果两个变量或者名字的id号相同,那么这两个变量指向的数据是同一个数据,其中一个发生变化,另一个也会发生变化。

注:因为程序的运行受很多情况影响,读者得到的id号不一定与我相同。

在C/C++实现的python编译器中,某个对象的id号,即是该对象存储在计算机内存上的地址。

学到这里的小伙伴,可能又会有其他的疑惑了。

a = 10
b = a
b = 'hello world'
print(a, b)  # 输出1 hello world

观察以上代码,既然b和a的id号是一样的,为啥b改变了,a没有跟着变呢?

其实这里的a和b的id号以及不一样了。

print(id(a), id(b))  # 输出140726421836872 1345821046448

为啥这里又不一样了呢?

在python的变量是具有动态类型的,而每一种类型所占据的内存空间是不一定相同的。

比如上述代码,整形编程了字符串,b发生改变了后,实际上是:计算机因为10和这个字符串内存不同,这个空间存不下这个字符串,所以将这个字符串重新在内存上找了一个空间存放起来,并且让b保存这个空间的id号。所以a和b的id号不相同。

即使是相同的类型的数据其实也会不同:

a = 1
b = a
b = 2
print(a, b)
print(id(a), id(b))  # 输出140726421836584 140726421836616

需要注意的是,同一个值的多个变量,它们的id可能会相同,这是因为Python中有个叫做"整数缓存"的机制,在一定范围内的整数被重用。但对于不可变对象(如布尔值、整数、浮点数、元组、字符串等),即使它们的值相同,它们的id也会不同。

其他关于这方面的细节,我们后续还会继续学习。

通过上面的学习,我们知道使用a=b这样的操作是无法复制列表的,那么如果我们真的遇到了需要使用两个元素一样,但是是不同列表的情况该怎么办呢?

这时候我们就需要借助列表的成员函数copy函数了

a = [1, 2, 3, 4, 5]
b = a.copy()
print(id(a), id(b))  # 输出3133370497408 3133371326400

此时a和b的id值不一样,所以这二者是不一样的。

4.切片

切片可以获取序列(字符串,列表.....)的子序列,这里先观察一个小例子

a = [x for x in range(10)]
print(a)  # 输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = a[1:5]
print(b)  # 输出[1, 2, 3, 4]

不难发现通过[1 : 5]我们得到a列表中的第二个元素到第5个元素。说明这里也是前闭后开区间。

从下标1开始复制元素一直到下标4(5 -1).注意:这里是复制列表,得到新列表与原列表不同,二者不会同时改变。

切片的功能十分强大!!!接下来,我们深入了解列表的切片功能。

a = [x for x in range(10)]
# print(a)  # 输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = a[1:5]
print(b)  # 输出[1, 2, 3, 4]
b = a[:5]
print(b)  # 输出[0, 1, 2, 3, 4]
b = a[1:]
print(b)  # 输出[1, 2, 3, 4, 5, 6, 7, 8, 9]
b = a[-6:-1]
print(b)  # 输出[4, 5, 6, 7, 8]
b = a[-6:]
print(b)  # 输出[4, 5, 6, 7, 8, 9]
b = a[:-2]
print(b)  # 输出[0, 1, 2, 3, 4, 5, 6, 7]

a[x:y]当其中y不存在的时候 ,x>0,y默认值就是len(a),也就是这个切片会到列表末尾。

x<0时,y默认值就是0,切片还是会到列表末尾,负数表示倒数第几个元素,这里其实与range函数十分类似。几乎一模一样

所以其实还有第三个参数步长a【x : y : z 】

z默认情况下是1,x是起始下标,y是终止下标,z是步长,可正可负。这里与range函数一样就不过多解释了。

如果读者学过C/C++编程,其实非常容易,就是以下代码,因为python解释器就是使用C/C++进行编写的。

for(int i = x;i < y;i+=z){   
    ;
}

所以利用切片也可以复制列表 

a = [x for x in range(10)]
b = a[:]
print(id(a), id(b))  # 输出1746737854848 1746738945984

因为id号不一样,所以a和b其实也是不一样的 

反转列表,我们知道reverse函数是会直接改变列表的,而如果我们不想改变链表,而得到一个反转过的列表,就可以使用切片操作。

a = [x for x in range(10)]
b = a[::-1]
print(b)  # 输出[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(id(a), id(b))  # 输出2463038011776 2463039365056

除了列表可以切片之外,字符串也是可以切片的,读者可以自行按照上述的代码进行操作。

a = [x for x in range(10)]  # 输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = a[-4::-2]
print(b)  # 输出[6, 4, 2, 0]
# 注意此时的y的默认值不是0而是-1,如果是0,不会打印0了。

 观察以下代码为啥输出空列表呢?

a = [x for x in range(10)]  # 输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = a[-4:-1:-2]
print(b)

因为-4到-1其实是下标6到9,而步长是负数,因为切片不能逆行的所以会直接打印空列表。

除此之外,切片还可以批量的改变元素。

a = [x for x in range(10)]  # 输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a[1: 3] = 0, 0
print(a)  # 输出[0, 0, 2, 3, 4, 5, 6, 7, 8, 9]

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值