Python学习笔记
列表、元组和字典
序列与列表与元组的关系和创建
-
序列:指的是一种包含多项数据的数据结构,序列包含的多个数据项(也叫成员)按顺序排列,可通过索引来访问成员。
-
Python中常见的序列包括字符串、元组和列表等,另外前面学到过的字节串(bytes)也是序列,以及后面介绍的
namedtuple
也是序列。 -
我们介绍的序列主要是列表和元组,他们非常相似,最主要的区别在于:列表是可变的、元组是不可变的。
-
元组一旦构建出来,程序不能修改元组所包含的元素,就像字符串也是不可变的,程序无法修改字符串所包含的字符序列,但是列表是可变的,程序可以修改列表所包含的元素。
-
如果只是固定的保存多个数据项,不需要修改他们,此时就应该使用元组;反之就应该使用列表。
-
列表和元组的关系就是可变不可变。
-
区分方法:在构建时就可以区分:
- 方括号是列表、圆括号是元组
- 列表用
list()
创建,元组用tuple()
创建
-
创建元组与列表方式一:
- 创建列表:
[ele1,ele2,ele3,...]
- 创建元组:
(ele1,ele2,ele3,...)
- 注意:由于圆括号在Python中是一个很普通的符号,因此如果创建了只包含一个元素的元组,不能进在圆括号中放一个元素,还必须在元素后放一个逗号,如果不这样,会创建一个普通的字符串、整形变量等。
- 创建只包含一个元素的元组:
(ele1,)
- 创建列表:
-
创建元组与列表方式二:
- 列表用
list()
创建,元组用tuple()
创建 - 本质:其实
list
和tuple
是Python的内置类型,因此list()
、tuple()
其实是他们的构造器。 - 使用
help(list)
来查找其作用,会发现它是一个类,使用list来创建列表的方式是:
- 列表用
_list = list(range(2,10))
print(_list)
- 这样的输出结果就是
[2, 3, 4, 5, 6, 7, 8, 9]
,需要注意的是10是不包括的。 range()
函数简单介绍:有两种用法,第一:写两个至三个元素,分别表示起始,终点,步长,如果写一个元素,就表示总共有几项,且从0开始加。例如:range(4)
的结果是0,1,2,3
,具体是列表还是元组和前面的其他函数有关。- 通过这样的方法,我们也可以实现元组、列表的相互转换:
list1 = list(my_tuple)
列表和元组的简单使用
-
通过索引来访问元素
- 正向访问0,1,2,…反向访问:-1是倒数第一个元素。
- 这里介绍
len()
函数,他返回的是列表包含的元素个数。print(len(my_tuple))
- 如果访问时索引越界,系统会自动帮我们识别并且报错
index out of range
,也就是说,访问时索引必须在-len() ~ len()-1
之间,这样的索引是有效的。
-
子序列:
- 前面介绍的字符串操作类似的是:列表和元组同样也可使用索引获取中间一段,这种用法被称为slice(分片或者切片)。
- 用法:
print(my_tuple[2:5])
这是从第三个元素取到了第五个元素 - 或者加上步长:
print(my_tuple[2:5:2])
- 注意中括号是索引固定用法。
-
序列的加法:
- 列表和元组支持加法运算,加法的和就是把两个“列表或元组”所包含的元素的总和(注意是前面加后面,后面的列表或元组给到前面的)。
- 列表只能和列表相加;元组只能和元组相加。如果想让列表和元组相加,可以使用
list\tuple
函数。
-
序列的乘法:
- 列表和元组可以和整数执行乘法,列表和元组乘法的意义就是把他们包含的元素重复N次,N就是被乘的倍数。
- 可以列表、元素同时进行加法、乘法运算。
-
in运算:
- 使用方法很简单,就是判定某个元素是否在元组、列表内
- 例如
print(20 in my_list)
输出结果就只有True
和False
,注意如果判断字符串,需要加上单、双引号。
-
最大值和最小值:
- python提供了内置的
max(),min()
全局函数来获取元组或列表的最大值,最小值 - 由于
max(),min()
要对元组、列表中的元素比较大小,因此程序要求传给该函数的元组、列表的元素必须是相同类型,且可比较大小。
- python提供了内置的
a_tuple = (20,10,-2,15.2,102,50)
b_list = ["crazy","fkit","python","Kotlin"]
print(max(a_tuple))
print(min(b_list))
- 这样的结果就分别是:`102`,`Kotlin`
序列封包和序列解包
- 序列封包:把多个值赋值给一个变量时,Python会自动将多个值封装成一个元组,这种功能被称为序列封包,注意是元组而不是列表,意味着数据不在能被修改
- 序列解包:序列(元组或列表等)可被直接赋值给多个变量,此时序列的各元素会被依次赋值给每个变量(要求序列的元素个数和变量个数相等),这种功能被称为序列解包。
- 所有的序列包括
range
都支持自动解包 - 例如:
a,b,c,d = range(30,34)
这样的语句都是合法的 - 如果只想解包某几个值,剩下的值可以用一个带前置
*
的变量来接收,但是要注意书写顺序。 - 由于字符串也是序列,所以字符串也支持解包:
a,b,*c = "fkjava.org
- python的一个特殊语法(多变量同时赋值):
a,b,c = val1,val2,val3
,这是一个封包和解包的一个比较复杂的过程,结果是a = val1,b = val2,c = val3
- 所有的序列包括
列表的用法以及操作列表元素
- 增加元素:
append()
方法把传入的参数追加到列表的最后面,链接:这也是c语言中文件操作关键字"a"
的由来,这个方法追加另一个列表(序列)时,列表被当成了一个元素,也就是说形成了嵌套。extend()
方法就是很普通的用于追加另一个列表(序列),它会将序列(列表)中的元素追加进来。insert()
方法将元素插入列表的指定位置,需要多一个参数
my_list = ["python", "swift"]
my_list.append(tuple(range(3,6)))
print(my_list)
- 输出结果是:
['python', 'swift', (3, 4, 5)]
my_list = ["python", "swift"]
my_list.extend(range(20,25))
print(my_list)
- 输出结果是:
['python', 'swift', 20, 21, 22, 23, 24]
my_list = ["python", "swift"]
my_list.extend("fkjava")
print(my_list)
- 输出结果是:
['python', 'swift', 'f', 'k', 'j', 'a', 'v', 'a']
,这说明extend方法甚至会拆分字符串
my_list = ["python", "swift",20,3.4,19,"lancibe"]
my_list.insert(3, "lus")
print(my_list)
-
输出结果是:
['python', 'swift', 20, 'lus', 3.4, 19, 'lancibe']
,第一个参数就是插入的位置,例如该程序,第一个参数时3,则在第四个位置插入"lus"
。注意如果第一个参数越界,会直接在最前/最后面插入。 -
删除元素:
- 删除列表元素使用del语句
- del语句是Python的一种特有的语句,专门用于执行删除操作,不仅可以用于删除列表中的元素,也可用于删除变量等。
- del语句即可删除列表中的单个元素,也可直接删除列表的中间某一段
- 使用方法:
del my_list [2]
,这样的语句意思是删除my_list变量中的第3个元素,当然,这也是索引的用法,所以也可以写两至三个变量。
- 列标提供了
remove()
方法来删除元素,remove()方法不根据索引删除元素,而是删除第一个找到的元素。
- 删除列表元素使用del语句
-
替换元素:
- 对列表中的元素赋值即可修改列表中的元素。
- 还可以通过slice语法对列表其中的一部分赋值,对列表的其中一部分赋值时,并不要求新赋值的元素个数与原元素个数相等。这种方式既可为列表增加元素,也可为列表删除元素。
- 对列表的slice语法赋值时,不能使用单个值;如果使用字符串赋值,Python会自动把字符串当成序列处理。
- 其实也就是说,去掉哪一部分、换成哪一部分,这就是slice语法的增删替换方法了。
- 但是一定要注意赋值时不要使用字符串,例如想把第三、四项替换成java,要写:`my_list[2:4] = [“java”]
-
列表的方法:
- 通过
dir(list)
可以查看列表支持的方法,除了以上方法,还可以使用的有以下方法: - count():统计列表中某个元素的出现次数
- index():判断列表中某个元素在列表中的出现位置
- pop():该方法用于将列表当成“栈”来使用,实现元素出栈的功能。
- reverse():该方法用于将列表中的元素反向存放
- sort():该方法用于对列表元素排序
- 通过
字典入门
字典的意义
- 字典是用于保存具有映射关系的数据,字典相当于保存了两组数据,其中一组数据时关键数据,被称为
key
;另一组数据可以通过key
来访问,被称为value
- 字典中的key和value的关联关系如下图所示,key不允许重复。他跟列表不一样。可以通俗理解:例如在一次考试中,语文80分,数学90分,英语70分,假设我们只看分数,80、90、70这三个数字没有任何意义,但是加上了语文、数学、英语这样的
key
,value
就有了意义。
创建字典
- 两种方式:
- 花括号法:花括号应包含多组
key-value
对,key与value之间用英文冒号隔开;多组key-value对之间用英文逗号隔开。
- 花括号法:花括号应包含多组
score = {"语文":85,"数学":92,"英语":78}
print(score)
- 这样就是创建了一个字典,打印结果是:
{'语文': 85, '数学': 92, '英语': 78}
- dict构造器:可以传入多个列表或元组参数作为key-value对;也可为dict指定关键字参数创建字典,此时字典的key不允许使用表达式
scores = dict([("语文",85),("数学",92),("英语",78)])
print(scores)
- 这样的方法也能构造一个字典,要注意在列表里面的每一个元组,都应只有两个元素,且第一个是key,第二个是value,这是默认的、不可改变的。
scores1 = dict(语文=85,数学=92,英语=78)
print(scores)
- 这是dict函数的另一种使用方法。这是用关键字参数创建dict,此时不能用表达式。
- 字典中的数据都是
key:value
成对出现。字典的key必须是不可变的,因此列表不能作为dict的key。
字典的访问
- 通过key来访问value,此时key就是中括号中的值,有点类似于序列的索引。例如:
print(score["语文"])
,这样的结果就是85。 - 对已有的key赋值,就会替换该key对应的value。如果对不存在的key赋值,就是添加了新
key-value
对。例如:score["生物"] = 91
,就是增加了一个key-value对。 - 删除key-value对:
- 使用del语句删除:
del score["数学"]
- 注意:将制定key赋值为None不能删除key-value对。
- 使用del语句删除:
- 使用
in/not in
可判断dict是否包含指定key - 列表和字典都可以进行增、删、改。
dict与列表
- 字典相当于索引是任意不可变类型的列表;而列表则相当于key只能是整数的字典。如果程序中想要使用的字典的key都是整数类型,则可考虑是不是能换成列表。
- 列表的索引总是从0开始,连续增大;但字典的索引即使是整数类型,也不需要从0开始,也不需要连续。因此列表不允许对不存在的索引辅助;但是字典则允许这样做——添加一组key-value对。
字典高级用法
- 字典的常用方法:
- 调用
dir(dict)
来查看字典的所有方法 clear()
用于清空字典中所有key-value对get()
方法其实就是根据key来获取valueupdate()
方法可使用一个字典所包含的key-value对来更新已有的字典items()、keys()、values()
分别用于获取字典中的所有key-value对,所有key,和所有value
- 调用
score = {"语文" : 86, "数学":95,"英语":92}
# 用一个字典(字典、序列、关键字参数)来更新原有的字典
# 对于已有的key,是更新value,对于不存在的key,是增加了key-value,注意如果某些元素,那就保持不变
score.update({"语文":89,"生物":91})
# 此时序列的每个元素都只能有两个元素
score.update((("语文",80),("物理",93)))
print(score)
# 使用关键字参数,不支持用表达式
score.update(语文=79, 化学=99)
print(score)
- 这三条详细的解释了update方法的使用方法。输出结果是
{'语文': 80, '数学': 95, '英语': 92, '生物': 91, '物理': 93}
{'语文': 79, '数学': 95, '英语': 92, '生物': 91, '物理': 93, '化学': 99}
# 遍历key
for key in score.keys():
print(key)
- 这是遍历了key,输出结果是
语文
数学
英语
生物
物理
化学
- 使用相似的方法也可以遍历value和key-value对。
# 遍历key,value(使用到了序列解包)
for key,value in score.items():
print(key,value)
- 这样的输出结果是:
语文 79
数学 95
英语 92
生物 91
物理 93
化学 99
pop()
方法用于获取、并删除指定key对应的valuepopitem()
方法用于随机的弹出字典中的一个key-value对。setdefauft()
方法也用于根据key来获取对应value的值,并为不存在的key设置默认值。print(score.setdefault("语文",50))
这样的输出结果是86,但是如果不存在"语文"
这一key,则将value的默认值赋为50.fromkeys()
方法使用给定的多个key创建字典,这些key的value默认都是None;也可以额外传入一个参数作为默认的value。
用字典格式化字符串
- 可在字符串模板中按key指定变量,然后通过字典为字符串模板中key设置值
- 正常情况下使用转换说明符是这样来写的:
s1 = "名字是:%s,年龄为:%d
再输出语句中写:print(s1 % ("lancibe", 18))
- 使用字典格式化字符串:
s2 = "名字是:%(name)s,年龄为:%(age)d"
print(s2 % {"age" : 18 , "name": "lancibe"})
- 结果是:
名字是:lancibe,年龄为:18
两者相同。