1.可变字符串
确实需要原地修改字符串:io.StringIO
>>> import io
>>> s='hello,sxt'
>>> sio=io.StringIO(s)
>>> sio
<_io.StringIO object at 0x0000017E672B0D30>
>>> sio.getvalue()
'hello,sxt'
>>> sid.seek(6)
>>> sio.write('g')
1
>>> sio.getvalue()
'hello,gxt'
2.列表简介
Python中一切皆对象
Python中列表大小可变,可以随时根据需要变大缩小
字符串和列表都是序列类型。字符串是一个字符序列,列表是任何元素的序列
3.列表的创建
a=[]
>>> a=[]
>>> a.append(20)
>>> a
[20]
>>> a=list()
>>> a=list('gaoqi')
>>> a
['g', 'a', 'o', 'q', 'i']
>>> a=range(15)
>>> a
range(0, 15)
>>> list(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
list可以把迭代的数据转化为列表
4.range()创建整数列表
>>> list(range(13,-3,-2))
[13, 11, 9, 7, 5, 3, 1, -1]
>>> list(range(2,15,3))
[2, 5, 8, 11, 14]
5.推导式生成列表
>>> 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]
6.列表元素的增加和删除
尽量在列表的尾部添加和删除
append()方法,真正在尾部添加,推荐
>>> a=[20,30,40]
>>> a
[20, 30, 40]
>>> a.append(111)
>>> a
[20, 30, 40, 111]
+运算符操作
不是真正在尾部添加,而是创建新对象
>>> a
[20, 30, 40]
>>> a.append(111)
>>> a
[20, 30, 40, 111]
>>> id(a)
1642408415040
>>> a.append(50)
>>> a
[20, 30, 40, 111, 50]
>>> id(a)
1642408415040
>>> a=a+[60]
>>> id(a)
1642367565632
会彻底产生一个新对象
extend()方法
>>> a=[20,30,40]
>>> id(a)
1642408591488
>>> a.extend([50,60])
>>> id(a)
1642408591488
>>> a
[20, 30, 40, 50, 60]
insert()方法
本质上是列表的COPY
后面的元素依次往后挪
>>> a=[20,30,40]
>>> id(a)
1642408414656
>>> a.insert(2,5)
>>> a
[20, 30, 5, 40]
>>> id(a)
1642408414656
>>> a.insert(2,'xyz')
>>> a
[20, 30, 'xyz', 5, 40]
乘法拓展
>>> a
[20, 30, 'xyz', 5, 40]
>>> b=a*3
>>> b
[20, 30, 'xyz', 5, 40, 20, 30, 'xyz', 5, 40, 20, 30, 'xyz', 5, 40]
列表元素的删除
本质上是列表的COPY
后面的元素依次往前挪
>>> a
[20, 30, 5, 40]
>>> id(a)
1642408414656
>>> del a[1]
>>> a
[20, 5, 40]
>>> id(a)
1642408414656
同insert()和del(),尽量不要在中间放入或删除
pop()方法
删除指定元素,并把该元素调出
默认弹出最后一个元素
>>> a=[10,20,30,40,50,60,70]
>>> a.pop()
70
>>> a
[10, 20, 30, 40, 50, 60]
>>> b=a.pop(2)
>>> b
30
>>> a
[10, 20, 40, 50, 60]
remove()方法
删除首次出现的指定元素,对元素进行操作
如没有这个元素,则报错
>>> a=[10,20,30,40,50,60,70,20,40,20]
>>> a=['aa','bb','cc','dd','aa','dd','ee','ff']
>>> a.remove('bb')
>>> a
['aa', 'cc', 'dd', 'aa', 'dd', 'ee', 'ff']
>>> a.remove('gg')
Traceback (most recent call last):
File "
a.remove('gg')
ValueError: list.remove(x): x not in list
7.列表元素访问和计数
通过索引直接访问元素
index()获得指定元素在列表中首次出现的索引
>>> a
['aa', 'cc', 'dd', 'aa', 'dd', 'ee', 'ff']
>>> a.index('cc')
1
>>> a.index('aa',3)
3
count()指定元素出现的次数
>>> a
['aa', 'cc', 'dd', 'aa', 'dd', 'ee', 'ff']
>>> a.count('dd')
2
len()返回列表的长度
>>> len(a)
7
成员资格的判断
判断列表中是否包含指定的元素
['aa', 'cc', 'dd', 'aa', 'dd', 'ee', 'ff']
>>> 'ff' in a
True
>>> 'gg' in a
False
8.slice切片操作
9.列表的遍历
>>> a=[10,20,30,40,50,60,70,20,40,20]
>>> a
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
>>> for x in a:
print(a)#对a打印,而对x打印则是所有元素竖着排
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
[10, 20, 30, 40, 50, 60, 70, 20, 40, 20]
>>>
10.复制所有列表元素到新对象
11.列表的排序
修改原列表,而不是生成新列表
>>> a.sort()
>>> a
[10, 20, 20, 20, 30, 40, 40, 50, 60, 70]
>>> a.sort(reversed=True)
Traceback (most recent call last):
File "
a.sort(reversed=True)
TypeError: 'reversed' is an invalid keyword argument for sort()
>>> a.sort(reverse=True)
>>> a
[70, 60, 50, 40, 40, 30, 20, 20, 20, 10]
注意参数时,reverse 和reversed是不一样的
随机
>>> a=[10,20,30,40,50,20,13]
>>> a.sort()
>>> a
[10, 13, 20, 20, 30, 40, 50]
>>> a.sort(reverse=True)
>>> a
[50, 40, 30, 20, 20, 13, 10]
>>> import random
>>> random.shuffle(a)
>>> a
[30, 10, 20, 50, 40, 13, 20]
建新列表的排序
>>> a
[30, 10, 20, 50, 40, 13, 20]
>>> id(a)
2308659343552
>>> a.sorted()
Traceback (most recent call last):
File "
a.sorted()
AttributeError: 'list' object has no attribute 'sorted'
>>> a=sorted(a)
>>> a
[10, 13, 20, 20, 30, 40, 50]
>>> id(a)
2308651178752
reversed()返回迭代器
>>> a[::-1]
[50, 40, 30, 20, 20, 13, 10]
>>> c=reversed(a)
>>> list(c)
[50, 40, 30, 20, 20, 13, 10]
>>> list(c)
[]
迭代器只能用一次
max 和min、sum
>>> max(a)
50
>>> min(a)
10
>>> sum(a)#会对非数值列表会报错
183
12.多维列表
二维列表
也就是列表套列表
TypeError: list indices must be integers or slices, not tuple
>>> a=[
['高小一',18,30000,'北京'],
['高小二',19,40000,'上海'],
['高小三',20,50000,'深圳']
]
>>> a
[['高小一', 18, 30000, '北京'], ['高小二', 19, 40000, '上海'], ['高小三', 20, 50000, '深圳']]
>>> a[0][3]
'北京'
>>>
嵌套循环
>>> a=[
['高小一',18,30000,'北京'],
['高小二',19,40000,'上海'],
['高小三',20,50000,'深圳']
]
>>> a
[['高小一', 18, 30000, '北京'], ['高小二', 19, 40000, '上海'], ['高小三', 20, 50000, '深圳']]
>>> a[0][3]
'北京'
>>> for m in range(3):
for n in range(4):
print(a[m][n],end='\t')
print()
高小一 18 30000 北京
高小二 19 40000 上海
高小三 20 50000 深圳
13.元组
同列表,但区别就是不可增删改(知新而温故)
14.元组的创建
tuple()~~~~~vs.~~~list()
tuple(可迭代对象)
>>> b=tuple('abcd')
>>> b
('a', 'b', 'c', 'd')
>>> b=tuple(range(4))
>>> b
(0, 1, 2, 3)
>>> a=(10,20,30)
>>> a
(10, 20, 30)
>>> type(a)
>>> a=10,20,30
>>> type(a)
元组对象排序时,只能用内置函数sorted(tupleObj),并生成新的对象
也就是说元组不能增删改,只能用函数,变成新对象
>>> a=1,20
>>> b=30,30,50
>>> a+b
(1, 20, 30, 30, 50)
>>> a
(1, 20)
>>> len(a)
2
>>> max(b)
50
15.zip
>>> a=[10.20,30]
>>> b=[40,50,60]
>>> c=[70,80,90]
>>> d=zip(a,b,c)
>>> d
>>> list(d)
[(10.2, 40, 70), (30, 50, 80)]
>>> a=[10,20,30]
>>> d1=zip(a,b,c)
>>> d1
>>> list(d1)
[(10, 40, 70), (20, 50, 80), (30, 60, 90)]#发现规律,以第一个列表的长度为标准
16.生成器推导式创建元组
生成器理解为指针,用完一次就没有了,或者是一次一次往下走
>>> s=(x*2 for x in range(5))
>>> s
>>> tuple(s)
(0, 2, 4, 6, 8)
>>> tuple(s)
()
>>> s=(x*2 for x in range(5))
>>> s._next_()
Traceback (most recent call last):
File "
s._next_()
AttributeError: 'generator' object has no attribute '_next_'
##是双下划线
>>> s=(x*2 for x in range(5))
>>> s.__next__()
0
>>> s.__next__()
2
>>> s.__next__()
4
17.元组的总结
18.字典
“键值对”的无序可变序列
成对存储;
通过键去操作值
类比:列表a[0]和a['name']
底层逻辑是一样的,字典也是数组
19.字典的创建
用{},dict()创建字典对象
>>> a={'name':'gaoqi','age':18,'dd':[2,3,4]}#用{}来创建
>>> a
{'name': 'gaoqi', 'age': 18, 'dd': [2, 3, 4]}
>>> b=dict(name='gaoqi',age=13)#用dict()函数来创建方式一
>>> b
{'name': 'gaoqi', 'age': 13}
>>> b=[('name','age'),('gaoqi',18)]#用dict()函数来创建方式二
>>> b
[('name', 'age'), ('gaoqi', 18)]
用zip()创建字典对象
>>> k=['name','age','c']
>>> v=['gaoqi',18,[333]]
>>> d=dict(zip(k,v))
>>> d
{'name': 'gaoqi', 'age': 18, 'c': [333]}
zip函数将数组变成zip 对象,封装在一起,并且一个一个对应
用fromkeys创建值为空的字典
None为值为空的意思
>>> a=dict.fromkeys(['name','age','job'])
>>> a
{'name': None, 'age': None, 'job': None}
20.字典元素访问
通过键获得值,键不存在,就抛出异常
>>> a={'name':'gaoqi','age':18,'dd':[2,3,4]}
>>> a['name']
'gaoqi'
>>> a['haha']
Traceback (most recent call last):
File "
a['haha']
KeyError: 'haha'
通过get() 方法,键不存在,返回的是None,推荐使用
>>> a
{'name': 'gaoqi', 'age': 18, 'dd': [2, 3, 4]}
>>> a.get('name')
'gaoqi'
>>> a.get('kakak')
>>> print(a.get('kakak'))
None
>>> a.get('dda','不存在')
'不存在'
遍历
>>> a.items()#遍历,列出所有键值对
dict_items([('name', 'gaoqi'), ('age', 18), ('dd', [2, 3, 4])])
>>> a.keys()#列出所有的键
dict_keys(['name', 'age', 'dd'])
>>> a.values()#列出所有的值
dict_values(['gaoqi', 18, [2, 3, 4]])
>>> len(a)
3
>>> 'name' in a#键值在字典键中
True
21.字典元素添加、修改和删除
看看键是否存在,存在就覆盖,不存在就添加
>>> a={'name':'gaoqi','age':18,'dd':[2,3,4]}
>>> a['address']='Beijing'
>>> a
{'name': 'gaoqi', 'age': 18, 'dd': [2, 3, 4], 'address': 'Beijing'}
>>> a['dd']='abc'
>>> a
{'name': 'gaoqi', 'age': 18, 'dd': 'abc', 'address': 'Beijing'}
用update()函数
>>> b={'name':'gaoxixi','age':20}
>>> a.update(b)
>>> a
{'name': 'gaoxixi', 'age': 20, 'dd': 'abc', 'address': 'Beijing'}
字典中元素的删除
del和pop(),一个是函数,一个是 对象方法
>>> a
{'name': 'gaoxixi', 'dd': 'abc', 'address': 'Beijing'}
>>> c=pop(a['age'])
Traceback (most recent call last):
File "
c=pop(a['age'])
NameError: name 'pop' is not defined
>>> c=a.pop(a['age'])
Traceback (most recent call last):
File "
c=a.pop(a['age'])
KeyError: 'age'
>>> c=a.pop(a['dd'])
Traceback (most recent call last):
File "
c=a.pop(a['dd'])
KeyError: 'abc'
>>> c=a.pop('dd')
>>> c
'abc'
>>> a.clear()
>>> a
{}
popitems()对象的方法,随机的移除,因为字典是没有顺序的
22.序列解包
>>> x,y,z=(10,20,30)
>>> x
10
>>> y
20
>>> x,y,z=[10,20,30]
>>> x
10
>>> y
20
对于字典的解包
>>> a={'name':'gaoqi','age':18,'dd':[2,3,4]}
>>> x,y,z=a
>>> x
'name'
>>> y
'age'
>>> z
'dd'
>>> x,y,z=a.values()
>>> x
'gaoqi'
>>> y
18
>>> x,y,z=a.items()
>>> x
('name', 'gaoqi')
>>> y
('age', 18)