列表和元组
列表
list
可下标类型(subscriptable) 可迭代类型(Iterable) 可变类型(mutable) 有序类型
使用方括号来创建列表
pythonli = ["a", "b", "c", "d"]
索引和切片
>>> li[0]
'a'
>>> li[1:2]
['b']
与字符串切片功能不同之处:
- 进行获取、切片、赋值给其他变量等 (getitem)得到的是其浅拷贝
- 进行直接赋值(setitem)则会改变原列表
getitem 操作
a = [1, 2]
a[:1][0] = 5
print(a)
# 打印结果[1,2]
setitem 操作
a = [1, 2]
a[:1] = [5]
print(a)
# 打印结果[5,2]
关于切片
可以在学习面向对象的魔术方法后再深入研究
操作符
[] + [] # 拼合
[] * int # 重复
item in [] # 判断成员是否存在 返回布尔值
常用内置函数
len(list)
获取长度list()
转化为列表类型max()
/min()
求最值,可选参数 key 进行操作reversed(list)
临时翻转,不限于列表sorted(iterable)
临时排序,不限于列表 ,可选 key 和倒序。sum
所有成员是数字的时候可用,求和,不限于列表
常用方法
''.join(list)
将列表转为字符串.count(value)
计次.copy()
浅拷贝,和切片[:]
等效
增删改查
.append(p)
追加.extend(iterable)
迭代追加.insert(index,obj)
插入.pop(index=-1)
删除默认最后一个 并返回它的值.remove(value)
删除del
删除 索引/切片.clear()
清空.index(value)
查询是否存在,不存在会报错
排序
.sort(key=..., reverse=...)
永久排序.reverse()
倒序,相当于li[:] = li[::-1]
的效果
.sort()即 list.sort(self)方法,和全局函数 sorted(iterable)
它们本质是快排算法两两比较大小
它们的参数完全一致(但 sorted 不限于列表)。不同的是:
列表的 sort 方法无返回值,直接修改 self
内置函数 sorted,返回临时排序后的列表
成员赋值
逐个赋值
arr = [1, 2, 3]
a, b, c = arr
# 其实是元组省略了括号 相当于(a, b, c) = arr
a
# 1
b
# 2
c
# 3
for 循环中
arr = [[1, 2], [2, 3], [3, 4]]
for a, b in arr:
print(a, b)
# 其实还是元组省略了括号 相当于for (a, b) in arr
"""
1 2
2 3
3 4
"""
解构赋值
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
c, *d, e = arr1
# 此处 * 是聚合
# 同上,其实是元组(c, *d, e,)省略了括号
c
# 1
d
# [2, 3, 4, 5, 6, 7, 8]
e
# 9
arr2 = [e, *d]
# 此处 * 是打散
arr2
# [9, 2, 3, 4, 5, 6, 7, 8]
此方法不限于列表,字典需要使用**map
,在函数参数声明以及传递中多见
元组
tuple
可下标类型(subscriptable) 可迭代类型(Iterable) 不可变类型(immutable)
元组中只包含一个元素时,必须在末尾元素后面添加逗号 (推荐所有情况都加逗号)
创建元组使用小括号(没有歧义时也可以省略小括号)pythontup = ( 1, 2, 3, 4, 5, )
索引和切片
>>> tup[1]
2
>>> tup[:1]
(1,)
和字符串的索引和切片操作几乎一样。
元组的切片和索引只读(只有 getitem 操作)。
内置函数tuple()
可以将对象转化为元组
常用方法
.count()
.index()
对象方法是返回新的对象还是修改对象本身
一般来说,对于可变类型 对象方法如list.sort()
会影响到 self 本身
而对于不可变类型,对象方法如str.replace()
会返回一个预期的新对象
内置函数 enumerate()
for i in 列表
只能遍历出列表成员,如果需要同时遍历出索引可以使用:enumerate(sequence, [start=0])
意为枚举,将一个可迭代的对象,同时列出数据和数据下标
可以用 list()函数把 enumerate()返回的枚举对象转为一个列表
li = ["a", "b", "c"]
list(enumerate(li))
# [(0, 'a'), (1, 'b'), (2, 'c')]
一般直接在 for 循环中使用
namelist = ["夏色祭", "赤井心", "湊阿夸"]
for i, name in enumerate(namelist):
print(i, name)
"""打印内容
0 夏色祭
1 赤井心
2 湊阿夸
"""
内置函数 slice()
意为切片slice(stop)
slice(start, stop[, step])
实例化一个切片对象,用来代替切片中的中括号内的内容
- start -- 起始位置
- stop -- 结束位置
- step -- 间距
切片对象用索引的写法[slice(1,2)]
可以达到切片的效果[1:2]
>>> a = slice(10)
>>> print(a)
slice(None, 10, None)
>>> a = slice(1,10,2)
>>> print(a)
slice(1, 10, 2)
>>> print(a.start)
1
>>> print(a.stop)
10
>>> print(a.step)
2
>>> li = [1,2,3,4,5,6,7,8,9,0]
>>> li[slice(2,6)]
[3, 4, 5, 6]
如果 step 为负数,则 stop 也应小于 start
内置函数 range()
range(stop)
range(start, stop[, step])
参数类似切片,可创建一个整数列表,可以很方便的用在 for 循环中,
一般用来固定循环 for 次数,与其他语言中的for(i=0; i<length; i++)
效果相似
"""
Python3.x 中 range() 函数返回的结果是一个整数序列的可迭代对象,而不是列表
可以用list()函数把range()返回的可迭代对象转为一个列表
"""
list(range(5))
# [0, 1, 2, 3, 4]
打印一个九九乘法表,来试试吧,例如:
a = ""
for i in range(1, 10):
for j in range(1, i + 1):
a += str(j) + "×" + str(i) + "=" + str(j * i) + " "
a += "\n"
print(a)
字节数组
bytearray 类型 可变(mutable)的字节序列,相当于字节串bytes
的可变版本。
创建
- bytearray()
- bytearray(短整型)
- bytearray(可迭代对象[短整型])
- bytearray(bytes 字面量即 b'字符串')
- bytearray(字符串, encoding='utf-8')
常用方法
与 list 的方法类似 也与 bytes 的方法类似
- .decode 转字符串
- .append 追加
- .reverse 倒序