python基础 Day3

文章目录

  • 序列
    • 列表
      • 创建列表
      • 列表元素的增加与删除
        • 列表元素的添加
        • 列表元素的删除
      • 列表元素的访问和计数
      • 列表的切片操作
      • 列表的遍历
      • 列表排序
      • 多维列表
    • 元组
      • 创建
      • 索引
      • 切片:同列表
      • 生成器推导式创建元组

可变字符串

#可变字符串:对于字符串直接修改,而不会生成一个新的对象,修改比较频繁的时候可以使用这个
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

遗留问题:

  1. sio是一个类,这个类是什么
  2. seek函数的了解:跳转取值,参数为0(开头),1(当前位置),2(结尾),从哪开始取,取多少位
  3. getvalue的意义:学了类以后再来解决。

运算符
按位或,按位异或,按位与

d = 0b110101
e = 0b101010
print("按位或,取大:",bin(d|e),"按位与,取小:",bin(d&e),"按位异或,相异取1:",bin(d^e))
#运行结果
按位或,取大: 0b111111 按位与,取小: 0b100000 按位异或,相异取10b11111

左移&右移

a = 2
print(a<<2)#左移两位,相当于乘以4
print(a<<1)#左移一位,相当于乘以2
print(a>>1)#右移一位,相当于除以2
print(a>>2)#右移两位,相当于除以4
8
4
1
0

涉及到右移,也就是除法的时候,取整数位,不管余数。复习:divmod()可以同时获得整数和余数

运算符优先级:
位运算和算术运算>比较运算符>赋值运算符,平常练习的时候用小括号组织

序列

  1. 包括字符串、列表、元组、字典、集合
  2. 序列中存储的是对象的地址,而不是对象的值

列表

创建列表

#列表的创建
#方法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

列表排序

以下所有函数只对数值型有作用,包括字符串是不行的

  1. sort只能对数字排序,而且直接对原列表进行修改,默认是升序排列
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]
  1. 建立新列表的排序:利用sorted或者reversed建立一个新的对象
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
上海

元组

  1. 元组是不可变序列,没有增加元素、修改元元素和删除元素的相关方法
  2. 元组的访问处理速度比列表快
  3. 元组可以作为字典的键,列表不能做为字典的键,只有不可变的才能作为字典的键,所以整数和字符串也可以作为字典的键

创建

元组的创建
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)

索引

  1. 元素无法修改
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)]

生成器推导式创建元组

  1. 生成器产生一个生成器对象,可以转化为列表或者元组
  2. 生成器只能使用一次,第二次使用的时候,tuple为空值,因为指针已经遍历完了。
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))

你可能感兴趣的:(python基础)