#可变字符串:对于字符串直接修改,而不会生成一个新的对象,修改比较频繁的时候可以使用这个
import io
a = "hello world"
sio = io.StringIO(a)
print(sio)
print(type(sio))
print(sio.getvalue())
#直接跳转到第七位(第八个字母)
sio.seek(7)
#写入g
sio.write("g")
print(sio)
print(sio.getvalue())
#运行结果
<_io.StringIO object at 0x000001C63073F558>
<class '_io.StringIO'>
hello world
<_io.StringIO object at 0x000001C63073F558>
hello wgrld
遗留问题:
运算符
按位或,按位异或,按位与
d = 0b110101
e = 0b101010
print("按位或,取大:",bin(d|e),"按位与,取小:",bin(d&e),"按位异或,相异取1:",bin(d^e))
#运行结果
按位或,取大: 0b111111 按位与,取小: 0b100000 按位异或,相异取1: 0b11111
左移&右移
a = 2
print(a<<2)#左移两位,相当于乘以4
print(a<<1)#左移一位,相当于乘以2
print(a>>1)#右移一位,相当于除以2
print(a>>2)#右移两位,相当于除以4
8
4
1
0
涉及到右移,也就是除法的时候,取整数位,不管余数。复习:divmod()可以同时获得整数和余数
运算符优先级:
位运算和算术运算>比较运算符>赋值运算符,平常练习的时候用小括号组织
#列表的创建
#方法1:直接创建
a = [1,2,3]
a
Out[8]: [1, 2, 3]
#方法2:list转化
b = list("love")
b
Out[12]: ['l', 'o', 'v', 'e']
#方法三:利用range函数
#range([starts,]end[,step])
a = range(0,10)#同样前闭后开
type(a)
#range生成的是一个range对象,不是列表,需要用list转换一下
list(a)
Out[13]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#循环创建多个元素
a = [x*2 for x in range(5)]
a
Out[14]: [0, 2, 4, 6, 8]
#通过if过滤元素
a = [x*2 for x in range(100) if x%9==0]
a
Out[9]: [0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]
#列表的添加与删除
#append:原地修改列表对象,id不改变,value改变了
a = [1,2,"love"]
a.append(100)
a
Out[17]: [1, 2, 'love', 100]
Out[18]: [1, 2, 5, 90, 'love', 50]
# +运算符操作:拼接操作,产生新的列表对象
a = [1,2,5,90,"love"]
id(a)
Out[19]: 2896785587272
a += [50]
a
Out[3]: [1, 2, 5, 90, 'love', 50]
id(a)
Out[4]: 2316829864008
#前后id值不一样,对象发生了改变,产生了新对象,赋值给a,速度慢,不推荐使用
#extend:不改变对象,直接在原值改变
a = [1,2]
print(id(a))
a.extend([3])
print(id(a))
#运行结果
2513309883912
2513309883912
Insert(XX,XXX)在第XX的位置插入XXX,涉及元素的拷贝,很慢
a = [1,2,"love",2,50,90]
print(a.insert(3,"i"))
print(a)
#运行结果
None
[1, 2, 'love', 'i', 2, 50, 90]
del :本质上也是拷贝,把中间的删除掉,把后面的元素拷贝到前面去
a = [1,2,"love",50,90]
del a[2]
print(a)
a = [1,2,"love",50,90]
print(a.pop())#默认删除最后一个元素,并返回最后一个元素的值
print(a.pop(1))#删除第一个一个元素,并返回元素的值
print(a.append("abc"))
#输出结果
90
2
None
看到底会不会生成新的对象,就是看能不能返回值,像append就是直接进行修改,那么这样打印不会有任何值,pop生成新的对象,那么就可以打印出来
a = [1,2,"love",2,50,90]
print(a.remove(2))
print(a)#remove删除首个出现的元素
a = [1,2,"love",2,50,90]
#通过索引访问
print(a[2])
#index:获得指定元素在列表中首次出现的索引
print(a.index(2))
print(a.index(2,2) )#从列表的第二个元素开始索引
print(a.index(2,2,4))#从列表的第2-4区间访问搜索
print(a.count(2))
print(len(a))
print(20 in a)
print(20 not in a)
#结果
love
1
3
3
2
6
False
True
a = [1,2,"love",2,50,90,"shde",True,False]
print(a[2:5])
print(a[::-1])
print(a[9:4:-1])
a = [1,2,"love",2,50,90,"shde",True,False]
for x in a:
print(x)
#运行结果
1
2
love
2
50
90
shde
True
False
以下所有函数只对数值型有作用,包括字符串是不行的
a = [1,2,"love",2,50,90,"shde",True,False]
print(a.sort())
#结果
TypeError: '<' not supported between instances of 'str' and 'int'
b = [1,4,5,2,4,6,1,20]
print(b.sort())
print(b)
#结果
None
[1, 1, 2, 4, 4, 5, 6, 20]
b = [1,4,5,2,4,6,1,20]
print(b.sort(reverse = True))#按照降序排列
print(b)
#结果
None
[20, 6, 5, 4, 4, 2, 1, 1]
#打乱排序
import random
random.shuffle(b)
print(b)
#结果
[2, 4, 4, 6, 1, 20, 5, 1]
b = [1,4,5,2,4,6,1,20]
print(sorted(b))
print(b)
print(list(reversed(b)))#reversed返回的是一个迭代器对象
print(b)
#结果
[1, 1, 2, 4, 4, 5, 6, 20]
[1, 4, 5, 2, 4, 6, 1, 20]
[20, 1, 6, 4, 2, 5, 4, 1]
[1, 4, 5, 2, 4, 6, 1, 20]
是一个表格形式,里面的一行写成一个列表形式就可以了
a = []
a = [
["DI",18,3000,"北京"],
["HD",20,5000,"成都"],
["FRY",40,7000,"上海"]
]
#遍历元素列表
for m in range(3):
for n in range(4):
print(a[m][n])
#运行结果:
DI
18
3000
北京
HD
20
5000
成都
FRY
40
7000
上海
元组的创建
a = (1,2,3)
print(tuple(a))
b = (3)#元组中只有一个整数的时候,类型默认为整数
print(type(b))
c = "abc"
print(tuple(c))
d = [1,2,3]
print(tuple(d))
del d #元组对象的删除
#运行结果
(1, 2, 3)
<class 'int'>
('a', 'b', 'c')
(1, 2, 3)
a = (1,2,3)
a[2] = 1
# 运行结果
TypeError: 'tuple' object does not support item assignment
对元组进行sorted函数进行排序,生成的是一个列表
a = (2.3,6,10,4,56)
print(sorted(a))
#运行结果
[2.3, 4, 6, 10, 56]
关于zip是将列表打包为元组,返回的是一个zip对象:就是打包列表的意思
a = [1,2,3]
b = [5,8,9]
c = [4,6,1]
d = zip(a,b,c)
print(list(d))
#结果
[(1, 5, 4), (2, 8, 6), (3, 9, 1)]
s = (x^2 for x in range(10))
print(s)
print(tuple(s))
print(tuple(s))
#结果
<generator object <genexpr> at 0x0000023308BEFD58>
(2, 3, 0, 1, 6, 7, 4, 5, 10, 11)
()
这样就可以很好的理解指针的问题了,指针只能遍历一次
s = (x^2 for x in range(10))
print(s.__next__())#访问第一个元素
print(s.__next__())#访问第二个元素
print(s.__next__())
print(tuple(s))
print(tuple(s))