遍历列表
所谓遍历列表就是访问一下每一个元素,并且对这个元素做点什么,比如我们想把列表中的每一个元素都打印出来:
animals = ['cat', 'dog', 'pig']
print(animals[0])
print(animals[1])
print(animals[2])
# cat
# dog
# pig
for 循环
如果列表中有一千个元素呢,按照上面这么干的你是不是就哭了,所以我们可以用循环来做,比如 for 循环:
animals = ['cat', 'dog', 'pig']
for animal in animals:
print(animal) #注意这行开头缩进了,代表是循环的一部分
# cat
# dog
# pig
for 循环的格式是:
for 自定义的变量名,用来储存每一项元素 in 列表名: # 别忘记了结尾的冒号,它告诉 Python 下一行是循环的第一行
for 循环是这样工作的:Python 从列表 animals 中取出第一个元素,然后把它赋值给变量 animal,(animal 只是个变量名,你起什么名字都可以)然后执行 print(animal) 就打印出来了第一个元素。以此类推就打印出来所有元素。
当然,除了简单的打印元素本身,你还可以更复杂的操作,比如:
animals = ['cat', 'dog', 'pig']
for animal in animals:
word = animal.title()[0]
print(f'{word}stands for{animal}')
# C stands for cat
# D stands for dog
# P stands for pig
使用 range() 函数
假如你需要打印10以内的所有偶数,该怎么做呢?可以用 for 循环配合 range 函数
range 可以方便的生成一系列数字:
for num in range(2,5):
print(num)
# 2
# 3
# 4
上例通过 range(2,5) 可以拿到2、3、4这三个数,包含开头,不包含结尾。
range(start, stop, step) 接收3个参数,最后一个是间隔,如果不填,默认就是间隔1。那么10以内所有偶数就是:
for num in range(2,11,2):
print(num)
# 2
# 4
# 6
# 8
# 10
range 与 list有很多相似的地方,但其实不一样。
for num in range(0,5):
print(num)
for num in [0, 1, 2, 3, 4]:
print(num)
以上两个 for 循环结果是一样的,但是在 Python3中 range 函数返回的值并不是list:
a = range(0,3)
print(a[1])
# 1
print(a)
# range(0, 3)
我 google 了一通,range 返回的值是“an immutable sequence object of integers depending upon the definitions used”,我的翻译是:根据我们的指令生成的不可修改的整数序列对象。
这个对象像list一样拥有长度、可以用 index 取其中的值,能 slice 等等等,但它就不是list。它的大小是永远一样的,不管你是 range(0,1) 还是 range(0,99),因为它在根据你的要求计算之前,是不会在内存中写一个实际的list的。比如你执行了上例第三行代码a[1],这个时候 a 才计算一下index 为1的那项是什么,然后返回给你,你不提要求,就什么都没有,这样设计的初衷是节省内存。
以上是我查资料后的理解,可能有误。而且鉴于这就是小白的基础入门课呢,我就不深究了,我手上的书上都没讲这么深(⊙﹏⊙)b
但是 range 是可以转化为list的,使用 list() 函数:
a = list(range(0,3))
print(a)
# [0, 1, 2]
列表解析
列表解析是什么,我们先看一个例子,如果要新建一个装1,2,3三个数的list,很简单,直接写:
a = [1, 2, 3]
如果要装1到100之间,每一个数的2次方呢?直接写肯定不行,可以用循环:
a = []
for num in range(1, 101):
a.append(num**2)
列表解析是一种更简洁的生成复杂列表的方式,比如依然是解决上述问题,可以这样:
a = [ num**2 for num in range(1, 101) ]
这一行代码,就实现了和上面循环一样的效果。num**2 是一个表达式,它就是会填到这个list中的值,而后面的 for 循环就是定义这个值到底是什么的。
用 index 拿列表中的一部分
跟字符串类似
a = [1,2,3,4,5]
print(a[1:3])
# [2, 3] 拿到第二第三个元素
如果省略开始索引,那就从头拿;省略结束索引,那就一直拿到最后一个元素:
a = [1,2,3,4,5]
print(a[:3])
# [1, 2, 3]
print(a[2:])
# [3, 4, 5]
负数索引代表从后往前数:
a = [1,2,3,4,5]
print(a[:-3])
# [1,2]
print(a[-2:])
# [4, 5]
如果前后索引都省略呢?
那就是从第一个拿到最后一个,全拿,就相当于完整复制一份:
a = [1,2,3,4,5]
print(a[:])
# [1,2,3,4,5]
什么时候需要复制?
看个案例,假如 a 喜欢 cat 和 dog,b 也喜欢 cat 和 dog,所以直接等于 a,后来 b 又喜欢了 pig 所以加上 pig,但问题来了,a 也被加上 pig 了,因为 a 和 b 指向的是同一个 list:
a = ['cat', 'dog']
b = a
b.append('pig')
print(a, b)
#['cat', 'dog', 'pig'] ['cat', 'dog', 'pig']
使用复制就不会有这个问题:
a = ['cat', 'dog']
b = a[:]
b.append('pig')
print(a, b)
# ['cat', 'dog'] ['cat', 'dog', 'pig']
元组(tuple)
tuple 是什么东西?
先看一个简单的 tuple:
tuple1 = (1, 2, 3)
元组和列表非常像,元组使用括号,而列表使用方括号。当然,最重要的区别是:列表中的元素可以改变,而元组中的元素一旦确定了,就不能改变了。以下是行不通的:
tuple1 = ('a', 'b', 'c')
tuple1[1] = 'w'
# Traceback (most recent call last): 报错喽
# File "test.py", line 2, in 错在第二行
# tuple1[1] = 'w' 这就这句出错啦
# TypeError: 'tuple' object does not support item assignment 错在元组的元素不能修改
元组的好处是什么?
1、有些数据注定是不该被改变的,比如你的生日,把不该变的数据放在元组中更安全。
2、元组应该放那些客观该被改变的东西,用这些东西来表示数据结构,而列表则是表示顺序的。比如你站在街上,想把你的位置坐标存起来,就用一个元组:
point = (42, 33) # 表示由x, y坐标构成结构
如果你想把你走路经过的所有点都存起来,应该用 list:
line = [(42, 17), (43,18), (44, 19)] # 表示数据数量和顺序
3、因为元组不可修改,所以可以作为字典的 key,而列表则不行(如果不懂的话,等后面学字典是什么东西就知道了)
创建元组
注意,元组并不是由括号定义的,而是逗号,除了空元组,其他情况都必须加逗号,哪怕元组中只有一个元素。我们可以用函数 type 来验证,函数 type 能返回对象的类型:
a = ()
print(type(a)) # 是 tuple
b = (1)
print(type(b)) # 不是 tuple 而是数字
c = (1,)
print(type(c)) # 是 tuple
d = (1, 2)
print(type(d)) # 是 tuple
为什么上例中的 b 不是元组,因为括号被当做了算数表达式的运算符来处理。
用 index 拿元组中的一部分
a = (1, 2, 3, 4, 5)
print(a[2]) # 3
print(a[-1]) # 5
print(a[2:4]) # (3, 4)
print(a[-4:3]) # (2, 3)
改变元组
虽然说了不能改元组内的元素,但如果该元素是 mutable 的,则可以改这个元素内部的元素,比如 list:
a = (8,9,[1, 2])
a[2][1] = 4
print(a)
# (8, 9, [1, 4]) 没有报错
这是因为你保存到元组中的是一个列表的引用 , 相当于一个指针,它指向存放这个列表的实际位置。所以当你修改列表内部元素的时候,修改的是那个实际的列表,而这个“指针”不变,所以元组认为它的这个元素也没变。
还可以用加号把两个元组相加,生成一个新元组:
a = (1, 2)
b = (3, 4)
print(a + b)
# (1,2,3,4)
用乘号重复元组:
a = (1, 2)
print(a * 2)
# (1, 2, 1, 2)
你也可以通过重新赋值的方法,改变整个元组:
a = (1, 2)
a = (3, 4)
print(a)
# (3, 4)
删掉元组
虽然不能删掉元组中的元素,但我们可以删掉整个元组:
a = (1, 2)
del a
顺便说一下del,以下这段如果你是纯小白可能不懂,没关系:
del 后面没跟(), 显然不是函数,我查了文档,del 是语句(statement)类似 break、return,但百度出来的好多国内资料都说“del函数”真是坑爹。
遍历元组
依然可以用 for 循环遍历元组:
a = (1, 2, 3)
for item in a:
print(item)
# 1
# 2
# 3
其他元组相关方法和函数
count 方法,查某元素在元组或者列表中出现的次数:
a = (1, 1, 2, 3)
num = a.count(1)
print(num)
# 2
index 方法,查某元素在元组或者列表中,第一次出现的index:
a = (1, 1, 2, 3)
num = a.index(1)
print(num)
# 0
tuple 函数,把列表、字符串等转换成元组:
list1 = [1, 1, 2, 3]
str1 = 'a string'
tuple1 = tuple(list1)
tuple2 = tuple(str1)
print(tuple1, tuple2)
# (1, 1, 2, 3) ('a', ' ', 's', 't', 'r', 'i', 'n', 'g')
max 函数,返回最大元素
tuple1 = (1, 1, 2, 3)
print(max(tuple1))
# 3
还可以指定 key,比如找出长度最长的字符串:
tuple1 = ('b', 'abc', 'dd')
print(max(tuple1, key=len))
# abc
sorted 函数,返回一个排序后列表:
tuple1 = ('e', 'a', 'u', 'o', 'i')
tuple2 = sorted(tuple1)
print(tuple2)
# ['a', 'e', 'i', 'o', 'u']
sum 函数,返回元组或列表中元素的和:
tuple1 = (1, 2, 3)
print(sum(tuple1))
# 6
list1 = [2, 3, -6]
print(sum(list1))
# -1
all 函数,看元组或者列表中元素是否全部为 True
tuple1 = (1, 2, 3)
print(all(tuple1))
# True
tuple2 = (1, 2, False)
print(all(tuple2))
# False
any 函数,看元组或者列表中元素是否至少有一个为 True
tuple2 = (1, 2, False)
print(any(tuple2))
# True
上篇回顾:ZackGuo510:列表简介—Python 学习笔记zhuanlan.zhihu.com
初学笔记难免有谬误,欢迎您指出,感谢。
欢迎关注我的微信号“我想会编程”,微信号“ZackGuo510”。