零基础入门学习Python P11-P15 列表 、元组、字符串

85 阅读13分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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开始。

image.png

课后题

  1. 列表都可以存放一些什么东西? 任何对象都可以…… 任何数据类型

  2. 向列表增加元素有哪些方法?   L.append(元素) 末尾添加1个元素 L.extend(列表) 末尾添加列表中的所有元素 L.insert(位置,元素) 在特定位置添加1个元素

  3. append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别? 如1   

  4. member.append(['竹林小溪', 'Crazy迷恋']) 和 member.extend(['竹林小溪', 'Crazy迷恋']) 实现的效果一样吗?   不一样,append是把整个列表作为一个元素,添加到列表中 extend是分别把列表中的元素 一一添加到列表中

  5. 有列表 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)

方法二:重新创建一个同名字的列表覆盖。

  1. 利用 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)

image.png 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(下标) 可以删除某个位置的元素

image.png

列表分片 / 列表切片 一次性获取多个元素 L[开始下标:结束下标],结果不包含结束下标 列表切片不会改变原列表本身 如果从0开始,那可以不填开始下标 如果最后全保留,可以不填结束下标 L[:] 都不填,得到一个拷贝列表

image.png

课后题

  1. 下边的列表分片操作会打印什么内容?

list1 = [1, 3, 2, 9, 7, 8]

list1[2:5]

[2,9,7]

  1. 请问 list1[0] 和 list1[0:1] 一样吗?   list1[0] 结果是一个元素 list2[0,1] 结果是一个列表

  2. 如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做?   temp = l.pop() l.insert(0,temp)

  3. 有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢?   复数表示倒数?

image.png

正常索引是从左到右索引,负数索引是从右到左。

  1. 在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。

在普通的分片操作中,步长默认设置为1,表示逐个遍历元素。其实我们可以人为调整步长以达到不可告人的秘密。

list1[0:6:2]

[1, 2, 7]

那么依你推测,关于步长的知识点还有哪些(很多知识点都是通用的)?   步长可以是复数,会改变序列顺序

  1. 课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢?   list2 = list1,两个变量名指向的是同一个存储位置,相当于2个指针,其中一个修改以后,另一个也会被修改 list2 = list1[:] ,数据拷贝了一份,两个变量名指向了不同的位置,不会相互受影响

image.png

  1. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 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) 从大到小排序

image.png

课后作业

  1. 注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案。

old = [1, 2, 3, 4, 5] new = old old = [6] print(new)

如果不上机操作,你觉得会打印什么内容? [1,2,3,4,5] old 被重新赋值了,是新的数据模块

  1. 请问如何将下边这个列表的'小甲鱼'修改为'小鱿鱼'? list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18] list1[1][2][0] = '小鱿鱼'

  2. 要对一个列表进行顺序排序,请问使用什么方法? l.sort()

  3. 要对一个列表进行逆序排序,请问使用什么方法? l.sort(reverse=True) sort方法的reverse参数为真

  4. 列表还有两个内置方法没给大家介绍,不过聪明的你应该可以自己摸索使用的门道吧:copy() 和 clear() l.copy() 相当于 l[:] ,复制数据存储模块,新变量指向不同位置,对列表修改后不会互相影响 image.png clear 是清空列表,指向同一存储模块的列表变量也会被清空。clear != [],前者是在现列表数据模块做修改清空,后者是一个新的数据模块。 image.png

  5. 你有听说过列表推导式或列表解析吗?

没听过?!没关系,我们现场来学习一下吧,看表达式: [ 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的奇偶数的组合

image.png

  1. 活学活用:请使用列表推导式补充被小甲鱼不小心涂掉的部分

image.png

l3 = [name + ':' + slogan[2:] for slogan in l1 for name in l2 if name[0] == slogan[0]]

image.png

  1. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 列表推导式,一次性按规律生成列表。 列表可以使用比较符,逻辑同字符串 reverse 倒序排序 列表复制,和变量名赋值,不相同,一个是复制数据模块,一个是类似指针指向同一个数据模块

P14 元组 tuple

元组是一旦生成就不可改变的,使用上跟列表很相似 创建元组:逗号是创建元组的标志,括号可有可无

image.png 访问元组元素:用下标

8*(8,) (8, 8, 8, 8, 8, 8, 8, 8)

修改元组:对元组进行切片,再进行加减操作,生成一个新元组。 删除元素:切片 链接,实现删除

删除元组:del t

课后题

  1. 请用一句话描述什么是列表?再用一句话描述什么是元组? 列表是元素集合,可以是任意元素,可以灵活修改。 元组又多个元素组成,一旦生成,不能修改,只能查询 用[,]的是列表 用(,)的是元组

  2. 什么情况下你需要使用元组而不是列表? 需要防止元素被修改时

  3. 当元组和列表掉下水,你会救谁? ?

  4. 请将下图左边列表的内置方法与右边的注释连线,并圈出元组可以使用的方法。

image.png

  1. 创建一个元组,什么情况下逗号和小括号必须同时存在,缺一不可? ~~ 元组中的元素超过1个时,必须用逗号隔开元素,两边小括号~~

在拼接只有一个元素的元组的时候,例如我们课上举的例题: temp = (‘小甲鱼’, ‘黑夜’, ‘迷途’, ‘小布丁’) 如果我想在“黑夜”和“迷途”之间插入“怡静”,我们应该: temp = temp[:2] + (‘怡静’,) + temp[2:]

  1. x, y, z = 1, 2, 3 请问x, y, z是元组吗? 不是,没有小括号,上面是一次性对3个变量赋值

image.png

  1. 请写出以下情景中应该使用列表还是元组来保存数据:
  1. 游戏中角色的属性: 列表,属性会修改

  2. 你的身份证信息: 元组

  3. 论坛的会员: 列表

  4. 团队合作开发程序,传递给一个你并不了解具体实现的函数的参数: 元组

  5. 航天火箭各个组件的具体配置参数: 元组,不可修改

  6. NASA系统中记录已经发现的行星数据: 列表

  1. 上节课我们通过课后作业的形式学习到了“列表推导式”,那请问如果我把中括号改为小括号,会不会得到“元组推导式”呢? 没有,列表推导式已经够了

  2. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 元组的标志是逗号,元组不能修改,只能查询

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. 还记得如何定义一个跨越多行的字符串吗(请至少写出两种实现的方法)? ''' 三引号对,可以定义跨行字符串

image.png

方法二:

str2 = '待卿长发及腰,我必凯旋回朝。
昔日纵马任逍遥,俱是少年英豪。
东都霞色好,西湖烟波渺。
执枪血战八方,誓守山河多娇。
应有得胜归来日,与卿共度良宵。
盼携手终老,愿与子同袍。'

方法三:

str3 = ('待卿长发及腰,我必凯旋回朝。' '昔日纵马任逍遥,俱是少年英豪。' '东都霞色好,西湖烟波渺。' '执枪血战八方,誓守山河多娇。' '应有得胜归来日,与卿共度良宵。' '盼携手终老,愿与子同袍。')

  1. 三引号字符串通常我们用于做什么使用? 注释

  2. 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') 原始字符串操作符

  3. 有字符串:str1 = '鱼C资源打包',请问如何提取出子字符串:'www.fishc.com' str1[str1.index('www'):str1.index('com')+3]

image.png 4. 如果使用负数作为索引值进行分片操作,按照第三题的要求你能够正确目测出结果吗?

  1. 还是第三题那个字符串,请问下边语句会显示什么内容? str1[20:-36]

  2. 据说只有智商高于150的鱼油才能解开这个字符串(还原为有意义的字符串):str1 = 'i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99' str1[::3]

image.png

编程作业

  1. 请写一个密码安全性检查的代码代码:check.py

密码安全性检查代码

低级密码要求:

  1. 密码由单纯的数字或字母组成
  2. 密码长度小于等于8位

中级密码要求:

  1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
  2. 密码长度不能低于8位

高级密码要求:# 1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合 2. 密码只能由字母开头 3. 密码长度不能低于16位

程序演示:

image.png

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('中,请修改')

image.png

  1. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!