文章目录
Python学习(二)
列表
列表由一系列按照特定顺序排列的元素组成,列表中可以存放字母,数字,字符串等几乎所有的元素,其中的元素之间没有任何关系,列表与一维数组有些类似。
在Python中,用方括号[]
来表示列表,并且用逗号来分割元素。下面给出具体的示例:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones) # ['苹果', '华为', '三星', '小米', 'oppo', 'vivo']
但是这种输出我们通常没法直接使用列表中的元素,在接下来主要学习对列表的一系列操作。
访问列表元素
列表是一个有序集合,如果想要访问列表中的元素,只要将列表中元素的索引告诉Python解释器即可,即指出列表的名称,再指出元素的索引,并将其放在方括号里。
需要注意的是,列表的索引是从0开始的,因此要访问列表的任何元素,只需要将其位置减一,将结果作为索引即可。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones[1]) #华为
上边我们可以看出输出结果不再包含方括号和引号,这时我们可以直接对输出结果进行操作,如下:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones[4].upper()) #OPPO
可以看出小写的oppo被转换为大写的OPPO。
特殊的,Python为最后一个列表元素提供了一个特殊语法,通过将索引值设定为-1,可以让Python返回最后一个元素的值,同样的基于此,我们可以递减索引,使用索引值-2返回倒数第二个元素的值。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones[-1]) #vivo
print(mobilephones[-2]) #oppo
print(mobilephones[4]) #oppo
从上边看出索引值-2和索引值4返回了同样的结果。
因此我们在使用索引调用列表中的元素时,既可以从左向右从0开始依次加1来使用索引,也可以从右向左从-1开始依次减一来使用索引。
修改列表元素
如果要修改列表中的元素,首先要指定列表名和要修改元素的索引,再使用新的值替换原来的值。
#如下mobliephones列表,可以使用下述方法将苹果转换为Apple
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
mobilephones[0] = "Apple"
print(mobilephones) #['Apple', '华为', '三星', '小米', 'oppo', 'vivo']
可以从打印结果看到,苹果已经成功被替换为Apple,可以采用这种办法修改列表中其他元素的值。
在列表中插入元素
在列表末尾插入元素
通常使用append()
方法在列表的末尾加入元素,具体如下:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
mobilephones.append("一加")
mobilephones.append("中兴")
print(mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo', '一加', '中兴']
在列表中插入元素
使用insert()
方法可以在列表的任何位置添加新的元素,为此需要设定新元素的索引和值。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
mobilephones.insert(2,"中兴")
print(mobilesphones) #['苹果', '华为', '中兴', '三星', '小米', 'oppo', 'vivo']
如上所示,成功在索引值为2的元素插入了新值,同样的,之前的索引值为2的元素及其之后的元素向右移动一位。
删除列表元素
使用del语句删除元素
如果知道要删除的元素在列表中的具体位置,可以使用del语句:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo']
del mobilephones[2]
print(mobilephones) #['苹果', '华为', '小米', 'oppo', 'vivo']
可以看到索引为2的三星在列表中被成功删除。
需要注意的时del是一个语句,而非方法,因此使用时没有括号。
使用pop()
删除元素
使用del语句从列表中删除元素后就没办法继续使用元素的值,但是我们有时候希望既能删除某个元素的值,又可以在删除后使用这个元素一次,这个时候我们可以使用pop()
方法。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo']
last_element = mobilephones.pop()
print(last_element) #vivo
print(mobilephones) #['苹果', '华为', '三星', '小米', 'oppo']
从上边我们可以看出使用pop后最后一个元素确实已经不在列表中了,同时我们可以使用被删除的元素进行新的操作。
使用pop()
方法也可以删除列表中任意位置的元素,只需要在括号中指定要删除的元素的索引即可。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo']
del_element = mobilephones.pop(3)
print(del_element) #小米
print(mobilephones) #['苹果', '华为', '三星', 'oppo', 'vivo']
可以看出索引值为3的小米被成功删除了,同时我们可以使用被删除的元素。
根据值删除元素
如果我们只知道要删除元素的值而不知道要删除的元素的具体位置,可以使用remove()
方法来删除列表中的元素。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
del_element = "华为"
mobilephones.remove(del_element)
print(mobilephones) #['苹果', '三星', '小米', 'oppo', 'vivo']
可以看出元素"华为"已经被成功删除,同时需要注意的是下属代码是:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
del_element = mobilephones.remove("华为")
print(del_element) #none
print(mobilephones) #['苹果', '三星', '小米', 'oppo', 'vivo']
可以看出由于我们一开始就知道被删除的是什么值,所以可以直接使用该值。如果remove这个元素,并不能把remove的元素的值赋值给其他变量,如上第二行和第三行显示,输出结果为none。
对列表进行排序
通常情况下,列表中元素的排序是无法预测的,但在对列表进行操作时我们会经常希望列表中的元素是有顺序的,因此,Python提供了sort()
方法和sorted()
函数对列表进行排序。
# sort()方法会永久改变列表中元素的顺序
name = ["yuntianhe","hanlingsha","murongziying","liumengli"]
name.sort()
print(name) #['hanlingsha', 'liumengli', 'murongziying', 'yuntianhe']
#我们也可以按照字母顺序从大到小进行排序,只需要向sort()方法传递reverse参数,并且使参数的值等于True
name = ["yuntianhe","hanlingsha","murongziying","liumengli"]
name.sort(reverse = True)
print(name) #['yuntianhe', 'murongziying', 'liumengli', 'hanlingsha']
#sorted()函数可以按照特定顺序显示元素,并且不会破坏他们在列表中的原始顺序
name = ["yuntianhe","hanlingsha","murongziying","liumengli"]
print(sorted(name)) #['hanlingsha', 'liumengli', 'murongziying', 'yuntianhe']
print(name) #['yuntianhe', 'hanlingsha', 'murongziying', 'liumengli']
#也可以向函数sorted()传递参数reverse = True,来按照字母从大到小的顺序进行排序。
方法和函数的区别:
大多数情况下方法需要具体的对象来调用,而函数需要向里边传入需要处理的对象。
逆序打印列表
如果想反转列表中元素的顺序,可以使用reverse()
方法。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
mobilephones.reverse()
print(mobilephones) #['vivo', 'oppo', '小米', '三星', '华为', '苹果']
#如果想恢复到原来的顺序,再对列表使用一次reverse方法即可。
获取列表的长度
使用函数len()
可以快速获得列表的长度,Python计算列表长度时从1开始进行计算的。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
len = len(mobilephones)
print(len) #6
列表索引错误
如果对于一个包括4个元素的列表,却希望获得第五个元素,就会出现以下错误:
name = ["yuntianhe","hanlingsha","murongziying","liumengli"]
print(name[4])
'''
IndexError: list index out of range
表明这个是索引错误,输入的索引值超过了列表的范围。
'''
for循环
for循环的基本格式
Python中的for循环与其他语言中不太相同,Python的for循环主要是为了顺序遍历对象中的每个值,对于Python中的for循环,不需要设置步进值,它会自动循环,直到处理的对象中的元素被全部读取。下边给出了for循环的一个示例:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
for mobilephone in mobilephones:
print(mobilephone) #语句1
print(1) #语句2
# 苹果1 华为1 三星1 小米1 oppo1 vivo1
'''
for循环的执行过程;
首先从列表mobilephones中读取第一个元素的值,存入变量mobilephone中,接下来执行循环体的部分,其中在Python中循环体部分并不是通过花括号表示,而是通过缩进,循环下边连续的缩进一个单位的语句都属于循环体的部分,会被依次执行,如上所示,语句1和语句2属于同一个循环体。在第一个元素的值执行完后,会将列表中第二个元素的值保存到mobilephone中,再执行,直到处理到列表的最后一个元素。
'''
在循环结束后执行操作
上一部分,我们提到过循环后边连续的缩进一个单位的语句均属于循环体的一部分,因此如果想在循环结束后执行某些操作,只需要将代码放在for循环后边,并且不进行缩进即可。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
for mobilephone in mobilephones:
print(mobilephone) #语句1
print("手机的品牌好多啊") #语句2
'''
苹果
华为
三星
小米
oppo
vivo
手机的品牌好多啊
'''
可以看到语句1被执行了6次,而语句2仅被执行一次。
for循环的常见错误
忘记缩进
对于for循环语句且后边属于循环组成部分的代码行,一定要进行缩进。
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
for mobilephone in mobilephones:
print(mobilephone)
'''
print(mobilephone)
^
IndentationError: expected an indented block
如上,系统会提示你缩进错误,没有找到期望的缩进的代码块。
'''
与下边循环后进行了不要的缩进类似,如果__忘记缩进循环体中额外的代码行__,往往不会使Python报错,只会使语句的输出出现逻辑错误,出现这种问题时要仔细查看代码之间的缩进,来进行解决。
进行了不必要的缩进
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones)
'''
print(mobilephones)
^
IndentationError: unexpected indent
可见提示第二行多了不必要的缩进
'''
#循环后如果进行了不必要的缩进,会出现以下情况:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
for mobilephone in mobilephones:
print(mobilephone)
print("手机的品牌好多啊")
'''
苹果
手机的品牌好多啊
华为
手机的品牌好多啊
三星
手机的品牌好多啊
小米
手机的品牌好多啊
oppo
手机的品牌好多啊
vivo
手机的品牌好多啊
这种问题编译器不会报错,但是不符合输出的逻辑,因此出现这种问题时需要仔细查看代码的缩进值。
'''
遗漏冒号
for语句末尾的冒号是为了告诉Python,下一行是循环的第一行,如果遗漏了冒号,会出现以下错误:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
for mobilephone in mobilephones
print(mobilephone)
'''
for mobilephone in mobilephones
^
SyntaxError: invalid syntax
这个会提示语法错误,我们需要仔细排查来解决这个问题。
'''
数值列表
使用range()
函数生成一系列数字
Python中的range()
函数可以生成一系列连续的数字:
for value in range(1,5):
print(value)
'''
1
2
3
4
'''
可以看出使用range()
函数生成的数,是从第一个指定的数开始,到最后一个指定的数-1结束。
在使用range()
函数创建列表时也可以指定步进值,如下:
for value in range(1,5,2):
print(value)
'''
1
3
'''
如上,可以看出我们创建了从1开始步进为2,直到到达4的数数值。
将range()
函数生成的数字转换为数字列表
可以使用list()
函数将range()
的结果直接转换为列表
numbers = list(range(1,5))
print(numbers) #[1, 2, 3, 4]
对数字列表简单的统计
使用max(),min(),sum()
函数,可以轻松的得到数字列表的最大值,最小值,总和。
numbers = list(range(1,5))
print(max(numbers)) #4
print(min(numbers)) #1
print(sum(numbers)) #10
列表解析
列表解析是指将for循环和创建新元素的代码合并成一行,并自动附加新元素:
numbers = [number**2 for number in range(1,5)]
print(numbers) #[1, 4, 9, 16]
#上述代码创建了一个1-4的数值,并计算数值的平方,将计算后的结果放到列表中,它与下边的代码是等价的
numbers = []
for number in range(1,5):
numbers.append(number**2)
print(numbers) #[1, 4, 9, 16]
可以看出列表解析可以减少有关的代码行数,要使用列表解析,首先需要指定一个列表名,如numbers,然后指定一个左括号,并定义一个表达式,用于生成要存储的值,接下来编写一个for循环用来给表达式提供值,最后再加上右括号即可。
切片
切片是指获取列表中的部分元素。要创建切片,就要指定要使用的第一个元素和最后一个元素的索引,与range()
函数相同的时,切片在到达指定的第二个索引前边的元素停止。如下,提取了列表第2~3个元素:
mobilephones = ["苹果","华为","三星","小米","oppo","vivo"]
print(mobilephones[1:3]) #['华为', '三星']
在进行切片时,也可以使用我们前边提到的负数索引的形式:
mobilephones = ["苹果", "华为", "三星", "小米", "oppo", "vivo"]
print(mobilephones[-3:-1]) #['小米', 'oppo']
可以看出上边我们使用负数索引的方式提取了第4~5个元素。
同时正数索引和负数索引能混合使用,但是要保证索引值小的在前。如果没有指定起始索引,Python将从头开始提取,如果没有指定结束索引,Python将会一直提取到列表末尾。
遍历切片
如果要遍历切片中的元素,可以使用for循环对切片进行遍历:
mobilephones = ["苹果", "华为", "三星", "小米", "oppo", "vivo"]
for mobile in mobilephones[1:5]:
print(mobile)
'''
华为
三星
小米
oppo
'''
复制列表
要复制列表,可以创建一个全新的包括整个列表的切片,方法是同时省略起始索引和终止索引,如下可以看出此时有两个列表。
mobilephones = ["苹果", "华为", "三星", "小米", "oppo", "vivo"]
new_mobilephones = mobilephones[:]
print(new_mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo']
new_mobilephones.append("魅族")
print(mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo']
print(new_mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo', '魅族']
需要注意的时,如果是为了创建一个新的列表,我们不能直接把一个列表赋值给另一个列表,而应该通过切片的形式来创建。如下:
mobilephones = ["苹果", "华为", "三星", "小米", "oppo", "vivo"]
new_mobilephones = mobilephones
print(new_mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo']
new_mobilephones.append("魅族")
print(mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo', '魅族']
print(new_mobilephones) #['苹果', '华为', '三星', '小米', 'oppo', 'vivo', '魅族']
从上边的对比可以看出如果采用赋值的方式创建列表,本质上并没有生成新的列表,而是把原始的列表共享给新列表,此时实际上还是只有一个列表。
元组
元组和列表类似,但是是使用圆括号来进行表示,与列表一样,元组也是使用索引来访问元素。元组的特点是,元组中的元素是不能被修改的。
#如下,定义了一个元组
numbers = (100,20)
#可以通过索引值获取元组中的元素,索引值格式和列表相同
print(numbers[0]) #100
print(numbers[1]) #20
#如果尝试修改元组的值,就会出现以下错误
numbers[0] = 20
'''
numbers[0] = 20
TypeError: 'tuple' object does not support item assignment
提示我们元组类型的数据不支持修改
'''
遍历元组的所有值
与列表类似,元组也使用for循环遍历所有元素:
numbers = (100,20)
for number in numbers:
print(number)
'''
100
20
'''
修改元组变量
虽然不能修改元组变量中的值,但是可以给元组变量重新赋值,如果想修改numbers元组中的值,可以重新定义:
numbers = (100,20)
print(numbers) #(100, 20)
numbers = (500,100)
print(numbers) #(500, 100)