本文已参与「新人创作礼」活动,一起开启掘金创作之路。
P11 列表
可以把一切Python中有的东西放到列表里,非常强大。
创建普通列表 L = ['a','b','c'] 数据直接用逗号隔开 L = [1,2,3,4,5]
创建混合列表 L = ['a,1,3.14,[1,2,3]]
创建空列表 L = []
向列表添加元素 L.append(元素) 元素会被添加到列表最后 一个append中只能放一个元素
列表中的元素可以重复
属于对象的函数叫方法,append就是list的方法
向列表中添加多个元素 L.extend(B列表) 用一个列表拓展另一个列表,2个列表元素合并 B列表的元素会被添加到L列表最后
向列表指定位置添加元素 L.insert(位置,元素)
列表位置下表从0开始。
课后题
-
列表都可以存放一些什么东西? 任何对象都可以…… 任何数据类型
-
向列表增加元素有哪些方法? L.append(元素) 末尾添加1个元素 L.extend(列表) 末尾添加列表中的所有元素 L.insert(位置,元素) 在特定位置添加1个元素
-
append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别? 如1
-
member.append(['竹林小溪', 'Crazy迷恋']) 和 member.extend(['竹林小溪', 'Crazy迷恋']) 实现的效果一样吗? 不一样,append是把整个列表作为一个元素,添加到列表中 extend是分别把列表中的元素 一一添加到列表中
-
有列表 name = ['F', 'i', 'h', 'C'],如果小甲鱼想要在元素 'i' 和 'h' 之间插入元素 's',应该使用什么方法来插入? insert()
编程作业
0. 自己动手试试看,并分析在这种情况下,向列表添加数据应当采用哪种方法比较好? 假设给定以下列表: member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳'] 要求将列表修改为: member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88] 方法一:使用 insert() 和 append() 方法修改列表。
print('--------Fred-2022-7-23-----------')
member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']
number = [88,90,85,90,88]
n = len(number)
for i in range(0,n):
member.insert(n-i,number[n-1-i])
print(member)
方法二:重新创建一个同名字的列表覆盖。
- 利用 for 循环打印上边 member 列表中的每个内容,如图:
print('--------Fred-2022-7-23-----------')
member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']
number = [88,90,85,90,88]
n = len(number)
for i in range(0,n):
member.insert(n-i,number[n-1-i])
print(member)
print('直接输出')
for i in member:
print(i)
print('比较好看的格式,str int 一行输出')
for i in member:
if isinstance(i,str):
print(i, end = ' ')
else:
print(i)
2. 上一题打印的样式不是很好,能不能修改一下代码打印成下图的样式呢?【请至少使用两种方法实现】
同上方
3. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!
列表的 extend 和 insert 方法
P12 列表
列表索引从0开始,到len(L)-1 为止 列表元素可以通过索引被修改,L[1] = 'new'
从列表删除元素 L.remove(元素) 方法,删除第一个元素,不需要知道位置。如果元素不在列表里,会报错,元素 not in L del L[下标] 删除某个位置的元素 del L 删除整个列表 L.pop() 方法,弹出列表中的最后一个元素 L.pop(下标) 可以删除某个位置的元素
列表分片 / 列表切片 一次性获取多个元素 L[开始下标:结束下标],结果不包含结束下标 列表切片不会改变原列表本身 如果从0开始,那可以不填开始下标 如果最后全保留,可以不填结束下标 L[:] 都不填,得到一个拷贝列表
课后题
- 下边的列表分片操作会打印什么内容?
list1 = [1, 3, 2, 9, 7, 8]
list1[2:5]
[2,9,7]
-
请问 list1[0] 和 list1[0:1] 一样吗? list1[0] 结果是一个元素 list2[0,1] 结果是一个列表
-
如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做? temp = l.pop() l.insert(0,temp)
-
有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢? 复数表示倒数?
正常索引是从左到右索引,负数索引是从右到左。
- 在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。
在普通的分片操作中,步长默认设置为1,表示逐个遍历元素。其实我们可以人为调整步长以达到不可告人的秘密。
list1[0:6:2]
[1, 2, 7]
那么依你推测,关于步长的知识点还有哪些(很多知识点都是通用的)? 步长可以是复数,会改变序列顺序
- 课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢? list2 = list1,两个变量名指向的是同一个存储位置,相当于2个指针,其中一个修改以后,另一个也会被修改 list2 = list1[:] ,数据拷贝了一份,两个变量名指向了不同的位置,不会相互受影响
- 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! pop del 切片复制 != 变量名复制
P13 列表常用操作符
比较 跟字符串比较同理,从第0个元素开始比较,有TF则输出TF
逻辑
连接 l1 + l2, 两个字符串拼接到一起 不能用 l1 + 元素,加号两边的数据类型需一致
重复 l2 * 重复次数,可以把列表内元素重复打印,生成一个新列表
成员关系 in not in 返回布尔值 元素 in l 对列表中的列表2,也可以使用成员关系操作符,但要带列表2下标
计算元素在列表中出现的次数 l.count(元素)
返回元素在列表中第一次出现的位置 l.index(元素,起始位置,结束位置)
将列表原地翻转 l.reverse()
列表排序 l.sort() 从小到大排序 l.sort(reverse=True) 从大到小排序
课后作业
- 注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案。
old = [1, 2, 3, 4, 5] new = old old = [6] print(new)
如果不上机操作,你觉得会打印什么内容? [1,2,3,4,5] old 被重新赋值了,是新的数据模块
-
请问如何将下边这个列表的'小甲鱼'修改为'小鱿鱼'? list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18] list1[1][2][0] = '小鱿鱼'
-
要对一个列表进行顺序排序,请问使用什么方法? l.sort()
-
要对一个列表进行逆序排序,请问使用什么方法? l.sort(reverse=True) sort方法的reverse参数为真
-
列表还有两个内置方法没给大家介绍,不过聪明的你应该可以自己摸索使用的门道吧:copy() 和 clear() l.copy() 相当于 l[:] ,复制数据存储模块,新变量指向不同位置,对列表修改后不会互相影响
clear 是清空列表,指向同一存储模块的列表变量也会被清空。clear != [],前者是在现列表数据模块做修改清空,后者是一个新的数据模块。
-
你有听说过列表推导式或列表解析吗?
没听过?!没关系,我们现场来学习一下吧,看表达式: [ i*i for i in range(10) ]
你觉得会打印什么内容?
[i*i for i in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
居然分别打印了0到9各个数的平方,然后还放在列表里边了有木有?!
列表推导式(List comprehensions)也叫列表解析,灵感取自函数式编程语言 Haskell。Ta 是一个非常有用和灵活的工具,可以用来动态的创建列表,语法如:
[有关A的表达式 for A in B]
例如 list1 = [x**2 for x in range(10)] list1 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
相当于 list1 = [] for x in range(10): list1.append(x**2)
问题:请先在 IDLE 中获得下边列表的结果,并按照上方例子把列表推导式还原出来。 list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
list2 = []
for x in range(10):
for y in range(10):
if x%2 == 0 and y%2 != 0:
list2.append((x,y))
所有 1-9的奇偶数的组合
- 活学活用:请使用列表推导式补充被小甲鱼不小心涂掉的部分
l3 = [name + ':' + slogan[2:] for slogan in l1 for name in l2 if name[0] == slogan[0]]
-
请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 列表推导式,一次性按规律生成列表。 列表可以使用比较符,逻辑同字符串 reverse 倒序排序 列表复制,和变量名赋值,不相同,一个是复制数据模块,一个是类似指针指向同一个数据模块
P14 元组 tuple
元组是一旦生成就不可改变的,使用上跟列表很相似 创建元组:逗号是创建元组的标志,括号可有可无
访问元组元素:用下标
8*(8,) (8, 8, 8, 8, 8, 8, 8, 8)
修改元组:对元组进行切片,再进行加减操作,生成一个新元组。 删除元素:切片 链接,实现删除
删除元组:del t
课后题
-
请用一句话描述什么是列表?再用一句话描述什么是元组? 列表是元素集合,可以是任意元素,可以灵活修改。 元组又多个元素组成,一旦生成,不能修改,只能查询 用[,]的是列表 用(,)的是元组
-
什么情况下你需要使用元组而不是列表? 需要防止元素被修改时
-
当元组和列表掉下水,你会救谁? ?
-
请将下图左边列表的内置方法与右边的注释连线,并圈出元组可以使用的方法。
- 创建一个元组,什么情况下逗号和小括号必须同时存在,缺一不可? ~~ 元组中的元素超过1个时,必须用逗号隔开元素,两边小括号~~
在拼接只有一个元素的元组的时候,例如我们课上举的例题: temp = (‘小甲鱼’, ‘黑夜’, ‘迷途’, ‘小布丁’) 如果我想在“黑夜”和“迷途”之间插入“怡静”,我们应该: temp = temp[:2] + (‘怡静’,) + temp[2:]
- x, y, z = 1, 2, 3 请问x, y, z是元组吗? 不是,没有小括号,上面是一次性对3个变量赋值
- 请写出以下情景中应该使用列表还是元组来保存数据:
-
游戏中角色的属性: 列表,属性会修改
-
你的身份证信息: 元组
-
论坛的会员: 列表
-
团队合作开发程序,传递给一个你并不了解具体实现的函数的参数: 元组
-
航天火箭各个组件的具体配置参数: 元组,不可修改
-
NASA系统中记录已经发现的行星数据: 列表
-
上节课我们通过课后作业的形式学习到了“列表推导式”,那请问如果我把中括号改为小括号,会不会得到“元组推导式”呢? 没有,列表推导式已经够了
-
请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 元组的标志是逗号,元组不能修改,只能查询
P15 字符串
切片,也可以用在字符串中。 str[star:end] Python没有字符类型,用下标可以索引字符串中的字符。
字符串与元组一样,本身不能修改,但是可以通过拼接旧字符串生成新字符串,再赋值给原变量。
可以比较,可以使用逻辑操作符、关系操作符
字符串方法 s.capitalize() 把字符串首字符变成大写,返回新字符串 s.casefold() 把所有字符变成小写,返回新字符 s.lstrip() 去掉字符串左边的空格 s.rstrip() 去掉字符串右边的空格 s.strip(字符) 去掉前后的所有指定的字符,默认为空格,中间的空格不删 s.translate(table) 转换字符串中的字符,返回新字符串 a.translate(str.maketrans('a','b'))
课后题
测试题: 0. 还记得如何定义一个跨越多行的字符串吗(请至少写出两种实现的方法)? ''' 三引号对,可以定义跨行字符串
方法二:
str2 = '待卿长发及腰,我必凯旋回朝。
昔日纵马任逍遥,俱是少年英豪。
东都霞色好,西湖烟波渺。
执枪血战八方,誓守山河多娇。
应有得胜归来日,与卿共度良宵。
盼携手终老,愿与子同袍。'
方法三:
str3 = ('待卿长发及腰,我必凯旋回朝。' '昔日纵马任逍遥,俱是少年英豪。' '东都霞色好,西湖烟波渺。' '执枪血战八方,誓守山河多娇。' '应有得胜归来日,与卿共度良宵。' '盼携手终老,愿与子同袍。')
-
三引号字符串通常我们用于做什么使用? 注释
-
file1 = open('C:\windows\temp\readme.txt', 'r') 表示以只读方式打开“C:\windows\temp\readme.txt”这个文本文件,但事实上这个语句会报错,知道为什么吗?你会如何修改? \t 会被转译成tab符,可以改成左斜杠,或者转译每一个右斜杠 file1 = open('C:/windows/temp/readme.txt', 'r') file1 = open('C:\windows\temp\readme.txt', 'r') file1 = open(r'C:\windows\temp\readme.txt', 'r') 原始字符串操作符
-
有字符串:str1 = '鱼C资源打包',请问如何提取出子字符串:'www.fishc.com' str1[str1.index('www'):str1.index('com')+3]
4. 如果使用负数作为索引值进行分片操作,按照第三题的要求你能够正确目测出结果吗?
-
还是第三题那个字符串,请问下边语句会显示什么内容? str1[20:-36]
-
据说只有智商高于150的鱼油才能解开这个字符串(还原为有意义的字符串):str1 = 'i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99' str1[::3]
编程作业
- 请写一个密码安全性检查的代码代码:check.py
密码安全性检查代码
低级密码要求:
- 密码由单纯的数字或字母组成
- 密码长度小于等于8位
中级密码要求:
- 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
- 密码长度不能低于8位
高级密码要求:# 1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合 2. 密码只能由字母开头 3. 密码长度不能低于16位
程序演示:
print('--------Fred-2022-7-23-----------')
number = '1234567890'
fuhao = "~!@#$%^&*()_=-/,.?<>;:[]{}|"
word = 'qwertyuiopasdfghjklzxcvbnm'
while True:
password = input("请输入需要检查的密码(输入end结束验证):")
if password == 'end':
print('验证结束')
break
flag_num = flag_fh = flag_wo = False
for each in password:
if each in number:
flag_num = True
elif each in fuhao:
flag_fh = True
else:
flag_wo = True
if not password[0] in word or len(word) <=8 or flag_num+flag_fh+flag_wo == 1:
print('低,请修改')
elif password[0] in word and flag_num+flag_fh+flag_wo == 3 and len(word)>=16:
print('高,请保持')
else:
print('中,请修改')
-
请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!