Python基础:操作list以及tuple的引入

遍历整个列表

在C语言中,我们如何实现“遍历”这一操作呢?答案显而易见,使用循环。在Python中同理,我们要对列表中的每一个元素进行操作,那么就需要遍历整个list,而要遍历整个list,循环语句是不可缺少的。

1. 循环

还是以那些我买不起的自行车品牌为例,假如现在我需要把列表bicycles中的所有元素一一打印出来,需要怎么操作呢?

bicycles = ['trek','specialized','giant','santa cruz']

for bicycle in bicycles:
    print(bicycle)
  • 首先定义一个列表bicycles
  • 紧接着定义一个for语句,这行代码让Python从列表bicycles中取出一个元素(这里是自行车品牌),并将其存储在变量bicycle
  • 最后,让python打印前面储存在变量bicycle中的变量即可

输出结果:

trek
specialized
giant
santa cruz

可以看出来,我们达到了一一打印整个list中的元素的目的,for语句循环地执行,直到列表中的元素全部被执行过为止。
但这里有一个细节令人注意:为什么第四行代码print语句前会有一个缩进?

2. 缩进

用过Word系列办公工具的同学可能知道缩进,在电脑上敲出缩进的方法通常为:在编辑过程中按下键盘上的tab键。那么缩进在Python中是做什么的,有什么意义呢?
Python是根据缩进来判断代码行与前一个代码行的关系的,如果一行代码前有缩进,那么意味着这行代码被包含于上一个没有缩进的代码行中。看起来有点不好理解,下面来演示一下这到底是什么意思。

a. 在for循环中执行更多操作

有的时候,我们不仅想要打印出列表中的内容,还想在此基础上增加一句别的内容,如何处理呢?

bicycles = ['trek','specialized','giant','santa cruz']

for bicycle in bicycles:
    print('The ' + bicycle.title() + ' bicycle is so great!')
    print("I can't wait to buy a " + bicycle.title() +' bike')

输出效果:

The Trek bicycle is so great!
I can't wait to buy a Trek bike
The Specialized bicycle is so great!
I can't wait to buy a Specialized bike
The Giant bicycle is so great!
I can't wait to buy a Giant bike
The Santa Cruz bicycle is so great!
I can't wait to buy a Santa Cruz bike

可见,for语句后的两个print前都使用了相同的缩进,意味着这两个print语句都被包含于同一个for语句下

b. 在for循环后执行更多操作

如果我并不想在每一次循环中都输出,而只想在最后一次循环后输出怎么办呢?

bicycles = ['trek','specialized','giant','santa cruz']

for bicycle in bicycles:
	print('The ' + bicycle.title() + ' bicycle is so great!')
print("I can't wait to buy a " + bicycle.title() +' bike')

可以看到,现在的代码中,第二个print语句前并没有缩进,因而不会被包含在循环语句中,所以,只有当循环语句执行完毕之后才会进入第二个print语句中。
输出结果:

The Trek bicycle is so great!
The Specialized bicycle is so great!
The Giant bicycle is so great!
The Santa Cruz bicycle is so great!
I can't wait to buy a Santa Cruz bike

数字列表

有的时候,我们仅仅想处理数字内容,但又不想如此麻烦的初始化列表,这时该如何做呢?

range()函数的用法

Python的自带函数`range()可以轻松的生成一段数字列表,它的语法如下:

#range(start, stop[, step])
#单参数时:
for value in range(5):
	print(value)

输出结果:

0
1
2
3
4

单参数时,默认的起点start0,传入的参数为结束点,步进值默认为1

#range(start, stop[, step])
#双参数时:
for value in range(1,5):
	print(value)

输出结果:

1
2
3
4

双参数时,传入的参数分别为起点start和终点stop,步进值同样默认为1

#range(start, stop[, step])
#三参数时:
for value in range(1,5,2):
	print(value)

输出结果

1
3

这个时候,三个参数都将被自定义,分别为起点start、终点stop和步进值step

创建数字列表

明白了range()的用法后,创建数字列表的方法好像呼之欲出了,但还是少了点什么。在Python中,有一类函数地作用是将数据类型转换,比如int()是将传入的参数转换为int型数据。那么是不是可以用同样形式的list()来生成列表型数据呢?当然可以:

numbers = list(range(1,6))
print(numbers)

输出结果:

[1, 2, 3, 4, 5]

可见,我们的想法是正确的,确实可以这样生成数字型list,下面是我们常用的定义一个数字型list的方法:

squares = []
for square in range(1,11):
    squares.append(square**2)
print(squares)

这里我们想创建一个包含1~10的平方数的数字型list,其中**指的是平方运算,这几行代码的输出结果为:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

数字列表的简单统计计算

有的时候我们需要找到一个数字型list中的最大值、最小值和均值==总和,如果是在C语言中,我们可能会用循环语句来做,但是在Python中,我们可以使用现有函数来完成它:

statistics = [1,2,4,9,12,435,1,23,34,123,45645,2312,35,123,675,345,23434,45]
print('最大值为' + str(max(statistics)))
print('最小值为' + str(min(statistics)))
print('总和为' + str(sum(statistics)))

输出结果:

最大值为45645
最小值为1
总和为73258

列表的切片

有的时候我们并不想处理整个列表,而是想处理列表中的部分内容,这该怎么做呢?这时候就应该使用我们的切片工具。

1. 切片

下面,我只想打印出从第一个到第三个我买不起的自行车品牌:

bicycles = ['giant','trek','specialized','santa cruz','cannondale']
print(bicycles[0:3])

输出结果:

['giant', 'trek', 'specialized']

值得注意的是,切片时传入的第一个参数和索引号是一一对应的,而第二个参数为索引号+1。
也就是说,如果想从第1个元素开始,那么第一个参数应该是0而非1;如果想终止于第4个元素,那么第二个参数就是4 如果参数不填的话,索引的第一个参数默认为0,第二个值默认为列表中元素的个数
同样,与列表的索引方式相同,也可以用负索引号来完成切片:

bicycles = ['giant','trek','specialized','santa cruz','cannondale']
print(bicycles[:3])
print(bicycles[2:])
print(bicycles[-3:3])

输出结果:

['giant', 'trek', 'specialized']
['specialized', 'santa cruz', 'cannondale']
['specialized']

2. 遍历切片

如果要遍历列表中的部分元素,可以在for循环中使用切片:

bicycles = ['giant','trek','specialized','santa cruz','cannondale']
for bicycle in bicycles[1:4]:
    print(bicycle.title())

输出结果:

Trek
Specialized
Santa Cruz

这样就可以实现在整个列表中进行部分操作,而非整个列表一起操作

列表的复制

有的时候需要根据现有的list创建新的list,就需要用到列表的复制。
要复制list,可以创建一个包含整个list的切片,方法是:同时省略起始索引和终止索引[:]。这样就可以创建一个始于第一个元素,终于最后一个元素的列表。

bicycles = ['giant','trek','specialized','santa cruz','cannondale']
my_bicycles = bicycles[:]

print(my_bicycles)

输出结果:

['giant', 'trek', 'specialized', 'santa cruz', 'cannondale']

可能有的人会疑惑了,为什么要这样花里胡哨的复制列表呢?直接list1 = list2不好嘛?
确实,这样确实可以得到相同的列表,但是这步操作并不是我们想要的"复制",而仅仅是更换了列表的变量名,什么意思呢?看下面的操作就明白了:

bicycles = ['giant','trek','specialized','santa cruz','cannondale']
my_bicycles = bicycles

bicycles.append('specialized')
my_bicycles.append('polygon')

print(bicycles)
print(my_bicycles)

输出结果:

['giant', 'trek', 'specialized', 'santa cruz', 'cannondale', 'specialized', 'polygon']
['giant', 'trek', 'specialized', 'santa cruz', 'cannondale', 'specialized', 'polygon']

可以看到,我明明是对两个list进行不同的操作,一个增加了specialized,另一个增加了polygon,但是输出的结果却是一样的,这是因为直接粗暴地list1 = list2只是更换了变量名,无论如何操作都只操作同一个list。而用切片的方法才能在真正意义上新建一个相同列表:

bicycles = ['giant','trek','specialized','santa cruz','cannondale']
my_bicycles = bicycles[:]

bicycles.append('specialized')
my_bicycles.append('polygon')

print(bicycles)
print(my_bicycles)

输出结果:

['giant', 'trek', 'specialized', 'santa cruz', 'cannondale', 'specialized']
['giant', 'trek', 'specialized', 'santa cruz', 'cannondale', 'polygon']

实践才是检验真理的唯一标准!!!

元组

元组型数据结构tuple与列表型list最大的不同就在于,列表中的元素是可以被修改的,如增加、删除、替换等,而元组中的任何一个元素在被定义后就不可被修改
列表是用中括号[]来定义的,而元组是用小括号()来定义的
但是这不意味着元组本身是不可修改的,元组是可以被删除的,只不过元组中的元素是不可删除的。元组也可以进行类似列表的拼接、索引、求最大/最小值等等。
由于tuple型和list型的操作大同小异,因此在这里只描述一下如何定义元组,不再进行深入拓展:

bicycles = ('giant','trek','specialized','santa cruz','cannondale')

print(bicycles)

输出结果:

('giant', 'trek', 'specialized', 'santa cruz', 'cannondale')