python列表和字符串
在python中,有这样一些类型,它们的成员是有序排列的,并且可以通过下标访问成员,这些类型称之为序列,包括:列表、range、元组和字符串;其中列表的成员可修改,属于可变序列,字符串和元组,成员不可修改,属于不可变序列。序列有共同操作:
- 成员关系运算(in,not in)
- 连接操作(+)
- 重复操作(*)
- 切片操作([::])
一、列表
1 概述
引出:存储一个数据可以采用变量
问题:需要同时存储多个数据,该怎么做?
#需求:有5个人的年龄,求平均年龄 age1 = 10 age2 = 32 age3 = 43 age4 = 18 age5 = 90 average = (age1 + age2 + age3 + age4 + age5) / 5
解决:容器【Python提供了一种数据结构list,可以同时存储多个数据】
本质:一种有序的集合
2 创建列表
语法:列表名 = [列表选项一,列表选项二,列表选项三…]
说明:使用[]表示列表,列表名其实就是标识符
将列表中的列表选项被称为元素
列表中的元素分别被编了号,这些编号被称为索引【下标,角标】
列表索引:
从左向右开始编号:0,1,2…n-1
从右向左编号: -1,-2…
-7 -6 -5 -4 -3 -2 -1
[10 , 20 , 30 , 40, 50 ,90, 80]
0 1 2 3 4 5 6
list1 = [] #创建一个空列表
list2 = [10,9,True,'张三']
list3 = list() #创建一个空列表
list4 = list('hello world) # ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
3.列表中元素的访问
列表中元素不能整体访问,只能单个存取
3.1取值
语法:列表名[索引]
list1 = [1,2,4,3,8] num = list1[2] print(num) #下标越界,引发IndexError, 需要自己确定不要越界 print(list1[5])
3.2 修改
语法:列表名[索引] = 新的元素值
list1[2] = 888 print(list1)
4.序列的通用操作
#1.列表组合 将两个列表拼接为一个列表 #直接使用加号 list1 = [43,65,76,6] list2 = [45,77,90,11,2,4,66] print(list1 + list2) #[43,65,76,6,45,77,90,11,2,4,66] 产生一个新列表 #2.列表重复 #直接使用乘号 列表内容重复指定遍数,产生一个新列表 print(list1 * 2) # [43,65,76,6,43,65,76,6] #3.成员操作 #成员运算符:in not in #运算的结果为布尔值 list3 = ["hello",False,189,"good"] print(189 in list3) #True print(180 not in list3) #True #4.列表的截取【分片,切片】 #语法:列表名[开始下标:结束下标:步长],表示按指定步长获取从开始下标到结束下标之间的元素, # 结果为一个新的列表 #注意:包头不包尾【前闭后开区间】 [开始下标,结束下标) #步长:默认是1,正数表示从左向右取,负数表示从右向左取 list1 = [10,20,30,40,50,60] print(list1[0:3]) #[10,20,30] print(list1[:3]) #[10,20,30] print(list1[:]) #[10,20,30,40,50,60] 从头取到尾 print(list1[::2]) # [10,30,50] 隔一个取一个 print(list1[3::-1]) #[40, 30, 20, 10] 从右向左取 print(list1[-1:-3:-1]) #[60, 50] 从右向左取 print(list1[2:]) #[30, 40, 50, 60] 从下标为2的元素开始取到末尾 print(list1[-3::-1])#[40, 30, 20, 10] 从右向左取到第一个元素 #5.列表长度 print(len(list1)) #6.列表最大值和最小值、求和 print(max(list1)) print(min(list1)) print(sum(list1))
5. 列表的操作
l1 = [10,20,30]
5.1 增加元素
#1. list.append(obj) 在列表末尾添加新的元素
l1.append(40) #可以是普通元素
#l1[len(l1):len(l1)] = [40] #等价于l1.append(40)
print(l1) # [10,20,30,40]
l1.append([50,60]) #也可以是其它列表、元组、字典、集合等对象
print(l1) # [10,20,30,40,[50, 60]]
#2. list.extend(obj) 在列表的末尾一次性追加另一个列表中的元素
#obj不能是单个数值,可以是列表等可迭代对象
l1.extend([70,80]) #只是将元素添加到l1末尾
print(l1)
#3. list.insert(i,obj) 在指定下标i的位置插入一个新元素,原来的元素后移,不会覆盖
l1.insert(1,-20)
print(l1) #[10, -20, 20, 30, 70, 80]
l1.insert(0,[1,2,3])
print(l1) #[[1, 2, 3], 10, -20, 20, 30, 70, 80]
5.2 删除元素
#1. list.pop(i) 删除指定下标的元素,如果下标越界,会出现IndexError
value = l1.pop() #删除最后一个元素,并返回该元素的值
print(value)
print(l1)
l1.pop(0) #删除下标为0的元素
print(l1)
#2. list.remove(x) 删除列表中第一个值等于x的元素,删除的时候是从左向右找到第一个等于x的元素删除
l1.remove(-20)
print(l1)
# l1.remove(100) 如果列表中没有该值,会引起错误:ValueError
#3.按下标删除
del l1[0]
del l1[0:2] #删除第一个和第二个元素
#3 list.clear() 清空列表
l1.clear()
print(l1) #[]
5.3 查找元素
#1. list.index(x,start,end) 在[start end)范围内查找第一个等于x的元素的下标
#参数说明: x 要查找的元素; start,开始下标;end 结束下标,不包含结束下标
#返回值:如果有值等于x的元素,返回其下标,如果不存在值等于x的元素,会引发ValueError
print(l1.index(10)) #1
print(l1.index(330,2,5)) #4
#2 list.count(x) 查找列表中x出现的次数,如果没有x,返回0
print(l1.count(30)) #2
print(l1.count(99)) #0 不存在99
5.4 列表反转
#把列表元素逆序排列
l1.reverse()
print(l1)
5.5 列表排序
#1. list.sort(key=None,reverse=None) 列表方法,实现列表就地排序,不产生新列表
#参数:key参数指明用哪个函数进行排序,默认值是None,用<进行比较 可选参数
reserse:布尔值,默认值是None,也就是假,从小到大排序,如果设置为True,则从大到小排序,可选参数
l1 = [90,30,70,20,10,60]
print(l1) # [90, 30, 70, 20, 10, 60]
l1.sort()
print(l1) # [10, 20, 30, 60, 70, 90]
#2 内建函数sorted(key=None,reverse=None),可以对任何可迭代对象排序,不限于列表,返回排序后的新列表,参数同sort方法
l2 = sorted(l1,reverse=True)
print(l2) #[90, 70, 60, 30, 20, 10]
6 二维列表
就是列表的元素还是列表
list1 = [[1,2,3],[4,5,6]]
#获取元素
print(list1[0[0],list1[0[1],list1[0[2]]) #1 2 3
5.6 列表的复制
列表是一个元素的容器,列表的复制可分为浅复制和深复制。
- 浅复制:只复制容器,容器中的元素不产生副本,只是引用计数增加
- 深复制:不但复制容器,连容器中的元素也产生副本。
- 对于非容器类型,包括int、float、bool、complex不存在深复制一说,都是浅复制。
#浅复制
import copy
l1 = [[1,2],[3,4],[5,6]]
l2 = l1.copy()
l3 = copy.copy(l1)
print('---------l1------------')
print(id(l1))
print(id(l1[0]),id(l1[1]),id(l1[2]))
print('---------l2-----------')
print(id(l2))
print(id(l2[0]),id(l2[1]),id(l2[2]))
print('---------l3-----------')
print(id(l3))
print(id(l3[0]),id(l3[1]),id(l3[2]))
#经观察可以发现l1,l2,l3的地址不同,所以实现了容器赋值,但容器中元素的地址不变,说明没有实现元素的复制
#深复制
import copy #引入copy模块
l1 = [[1,2],[3,4],[5,6]]
l2 = copy.deepcopy(l1) #深拷贝
print('---------l1------------')
print(id(l1))
print(id(l1[0]),id(l1[1]),id(l1[2]))
print('---------l2-----------')
print(id(l2))
print(id(l2[0]),id(l2[1]),id(l2[2]))
print('---------l3-----------')
#经观察发现,l1和l2地址不同,并且容器中元素地址也不同说明,是深复制
7.for-in循环
语法:
for 变量名 in 列表:
语句A
else:
语句B
说明:主要用于遍历序列【遍历:依次访问序列中的每一个元素,获取元素值】
工作原理:按照顺序获取列表中的每个元素,赋值给变量,再执行语句A,以此类推,直到列表中的元素全部获取为止,循环终止后执行else语句块。
- 不要在for-in循环中添加或删除元素
#只能获取元素,不能得到元素的下标
for value in list1:
print(value,end=' ')
#index表示下标,num表示元素值
#enumerate将列表变成一个索引序列,同时包含下标和数据
for index,num in enumerate(list1):
print(index,num)
#二维列表的遍历,循环嵌套
l1 = [[1,2],[3,4],[5,6]]
for elem in l1:
for value in elem:
print(value, end=' ')
print('')
###8.列表生成式
8.1 range
系统提供内建函数range(start,end,[step=1]),生成一个等差序列[start, end),注意序列属于不可变序列,不支持元素修改,不支持+和*操作。range一般用于for-in循环遍历
#range(start,end,step=1)
#参数:start,开始值,默认是0;
# end 结束值(序列不包括该值),必须大于start
r1 = range(1,11) #[1,2,3...10]
r2 = range(10) #[1,2,3,...9]
r3 = range(1,11,2) #[1,3,5,7,9]
#求1+2+....+100的和
sum = 0
for i in range(1,101):
sum += i
print(sum)
#求100以内的偶数和
sum = 0
for i in range(0,100,2):
sum += i
print(sum)
#按下标列表遍历
l1 = [10,80,65,43,90]
i = 0
while i < len(l1):
print(i,l1[i])
#或者
for i in range(len(l1)):
print(i,l1[i])
8.2 列表生成式
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
#语法:
[exp for iter_var in iterable]
执行for-in循环时,通过iter_var遍历iterable每一项,exp表达式中可以直接使用iter_var,每遍历一项,产生一个新的列表元素。
#生成[0,1,4,9,16,25]
[x*x for x in range(6)]
#生成[0,4,16,36,64]
l2 = [x*x for x in range(9) if x % 2 ==0]
print(l2)
#可以使用双重循环
l3 = [(x,y) for x in range(1,5) for y in range(3)]
print(l3) #[(1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1), (4, 0), (4, 1)]
9.随机数
import random
函数名 | 函数说明 |
---|---|
choice(seq) | 返回一个序列(列表、元组,字符串)中返回一个随机元素 |
randrange(start,stop,step) | start 指定范围的起始值 包含本身 stop 指定范围的结束值 不包含本身 step 步长 |
randint() | 返回一个随机整数 |
shuffle(seq) | 将序列元素随机排列(打乱顺序) |
课后作业:
初级:
- 判断下面标识符是否合法并说明不合法的原因 abc.com 123ok _xiaoming 姓名 None sina163
- 从控制台输入圆的半径,计算周长和面积
- 一辆汽车以40km/h的速度行驶,行驶了45678.9km,求所用的时间
- 华氏温度转摄氏温度【提示:将华氏温度转换为摄氏温度 F = 1.8C + 32】
- 从控制台输入两个数,输出较大的值
- 模拟玩骰子游戏,根据骰子点数决定什么惩罚【例如:1.跳舞,2.唱歌…6】
中级:
- x 为 0-99 取一个数,y 为 0-199 取一个数,如果 x>y 则输出 x, 如果 x 等于 y 则输出 x+y,否则输出y
- 从控制台输入三个数,求这三个数的: 平均值、最大值、最小值、和(不允许使用max和min)
- 从控制台输入三个数,把这三个数按照从小到大的顺序输出
- 从控制台输入一个三位数,如果是水仙花数就打印“是水仙花数”,否则打印“不是水仙花数” 例如:153=13+53+3^3