可变字符串
可以使用io.StringIO对象或array模块
定义可变字符串
>>> import io
>>> s = "wyj"
>>> sio = io.StringIO(s)
>>> sio
<_io.StringIO object at 0x000001DF6CB661F8>
获得可变字符串的值以及修改
>>> sio.getvalue() #显示可变字符串
'wyj'
>>> sio.seek(2) #使指针指向第2位
2
>>> sio.write('jj') #修改其中的值
2
>>> sio.getvalue()
'wyjj'
位操作
1、| :按位或
2、^ :按位异或
3、& :按位与
4、<< :左移;左移1位相当于乘2
5、>> :右移;右移1位相当于除以2
PS:做乘2、除以2操作更快
运算符优先级问题
1、乘除优先加减
2、位运算和算术运算 > 比较运算符 > 赋值运算符 > 逻辑运算符
PS:复杂表达式一定要由小括号组成
序列
1、序列是一块存放多个值的连续的内存空间
2、序列存储的是地址,而不是对象的值,是通过存储的地址去找到对象
3、Python中常用的序列结构
字符串、列表、元组、字典、集合
列表
1、用于存储任意数目、任意类型的数据集合
2、Python的列表大小可变,可以随时增大或减小
3、列表与字符串的用法几乎一模一样
列表的创建
1、基本语法[]创建
>>> a = [10,20,'wyj']
>>> a = []
>>> a.append(20)
>>> a
[20]
2、list()创建
使用list可以将任何可迭代的数据转化成列表
>>> a = list()
>>> a
[]
>>> a = list("wyj")
>>> a
['w', 'y', 'j']
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3、range()创建整数列表
语法格式: range([start,]end[,step])
PS:[]代表“可选的”,start默认为0、步长默认为1
>>> list(range(15,1,-2))
[15, 13, 11, 9, 7, 5, 3]
PS:只能创建到end-1
4、推导式生成列表
>>> a = [x*2 for x in range(5)] #循环创建多个元素
>>> a
[0, 2, 4, 6, 8]
>>> a = [x*2 for x in range(100) if x % 9 == 0] #通过if过滤元素
>>> a
[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]
列表元素的增加
PS:尽量减少中间的列表的增加或删除,否则会导致列表元素的大量移动,效率较低
1、append()
原地修改列表对象,尾部添加新的元素,速度最快
>>> a = [1,2,3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
2、+运算符
并不是真正地在尾部添加元素,而是创建新的列表,将原列表的元素和新列表的元素一次赋值到新的列表对象中。这样会涉及大量的赋值操作,对于操作大量元素不建议使用
3、entend()方法
将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象
>>> a = [1,2,3]
>>> a.extend([4,5,6])
>>> a
[1, 2, 3, 4, 5, 6]
4、insert()插入元素
可以将指定元素插入到列表对象的任意指定位置,会让后面的所有元素进行移动,影响处理速度;涉及大量元素时应避免使用
>>> a = [1,2,3]
>>> a.insert(2,100)
>>> a
[1, 2, 100, 3]
5、乘法扩展
生成新列表,使原列表的元素多次重复
>>> a = [1,2,3]
>>> b = a * 3
>>> b
[1, 2, 3, 1, 2, 3, 1, 2, 3]
列表元素的删除
1、del
删除列表指定位置元素,本质是数组元素的拷贝
>>> a = [1,2,3]
>>> del a[1]
>>> a
[1, 3]
2、pop()方法
删除并返回指定位置元素,如果未指定位置,则默认删除并返回最后一位
>>> a = [1,2,3,4]
>>> b = a.pop()
>>> a
[1, 2, 3]
>>> b
4
3、remove()
删除首次出现的指定元素,如果元素不存在则抛出异常
>>> a = ["a","b","c","a"]
>>> a.remove("a")
>>> a
['b', 'c', 'a']
列表元素的访问和计数
1、通过索引访问 即[]
2、index()
获取指定元素首次出现的索引位置,语法是:index(value,[start,[end]])
3、count()
返回指定元素出现次数
成员资格判断
判断是否存在指定的元素
1、count()
2、用in判断是否存在(推荐)
>>> a = [1,2,3,4,5]
>>> 6 in a
False
切片操作(与字符串操作一样,见第二节)
标准格式:[start:end[:step]]
列表排序
1、sort():默认为升序排列
列表地址不变
>>> a = [1,3,4,2,5,6,3,5] #升序排列
>>> a.sort()
>>> a
[1, 2, 3, 3, 4, 5, 5, 6]
>>> a.sort(reverse = True) #降序排列
>>> a
[6, 5, 5, 4, 3, 3, 2, 1]
>>> import random #乱序排列
>>> random.shuffle(a)
>>> a
[1, 6, 3, 3, 5, 5, 4, 2]
PS:sort()无返回值,只是改变x的排序
2、新建列表的排序
sorted():用法与.sort()有差异
x = [1,3,2]
print(sorted(x))
运行结果为:
[1, 2, 3]
PS:sorted()有返回值,返回值就是排好序的
3、reversed() 返回迭代器
reversed()不对原列表做修改,只返回一个逆序排列的迭代器对象
>>> a = [1,3,5,2,4,6]
>>> c = reversed(a)
>>> c
<list_reverseiterator object at 0x000001DF6CBF93C8>
>>> list(c)
[6, 4, 2, 5, 3, 1]
PS:迭代器是指针走的过程,只能用一次
关于列表的其他函数
max()
min()
sum():对数值型列表求和,对非数值型列表报错
多维列表
一维列表存储一维、线性的数据
二维列表存储二维、表格的数据
二维列表
>> a = [
... ['老大','19','2000'],
... ['老二','20','3000'],
... ['老三','21','3000'],
... ]
>>> a[0][2]
2000
二维列表的遍历
a = [
['老大','19','2000'],
['老二','20','3000'],
['老三','21','3000'],
]
for m in range(3):
for n in range(3):
print(a[m][n],end="\t")
print()
'''
a = [
['老大','19','2000'],
['老二','20','3000'],
['老三','21','3000'],
]
for m in range(3):
for n in range(3):
print(a[m][n],end="\t")
print()
元组tuple
列表是可变序列;元组是不可变序列,不能修改元组中的元素。因此元组没有增加、修改删除元素相关的方法
元组的创建
1、通过()创建元组,()可以省略
例:a = (1,2,3) 或 a = 1,2,3
PS:如果元组只有一个元素,则必须加逗号,否则解释器会解释成一个数
2、通过tuple()函数
语法:tuple(可迭代的对象)
例:
b = tuple()
b = tuple(“abc”)
b = tuple(range(3))
b = tuple([2,3,4])
总结
tuple()可以接受列表、字符串、其他序列类型、迭代器等生成元组
list()可以接受元组、字符串、其他序列类型、迭代器等生成元组
元组的访问
和列表完全一样
元组的排序
元组不能修改对象,所以只能通过sorted(tupleObj)生成新的列表对象
>>> a = (1,2,5,3,6,5)
>>> sorted(a)
[1, 2, 3, 5, 5, 6]
zip()
zip(列表1,列表2,列表3,…)将多个列表对应位置的元素组合成元组,并返回这个“zip对象”
>>> a = [1,2,3]
>>> b = [3,4,5]
>>> c = [6,5,4]
>>> d = zip(a,b,c)
>>> d
<zip object at 0x000001DF6CC46608>
>>> list(d)
[(1, 3, 6), (2, 4, 5), (3, 5, 4)]
生成器推导式创建元组
与列表推导式类似,只不过使用的是小括号
>>> s = (x*2 for x in range(4))
>>> s
<generator object <genexpr> at 0x000001DF6CC50048>
>>> tuple(s)
(0, 2, 4, 6)
>>> list(s) #只能访问一次元素,第二次就为空了,需要再生成一次
[]
生成器可以通过__next__()进行遍历
>>> s = (x*2 for x in range(4))
>>> s.__next__()
0
>>> s.__next__()
2
>>> s.__next__()
4
>>> s.__next__()
6