11列表2
一、从列表中获取元素
>>> member = ['筛子','披萨']
>>> member[0]
'筛子'
>>> member[1]
'披萨'
>>> member[0],member[1] = member[1],member[0]
>>> member[0]
'披萨'
>>> member[1]
'筛子'
二、从列表删除元素
1. list1.remove(删除的元素的名字)
>>> member = ['筛子','披萨','左手','阿水','预言家','球皇']
>>> member.remove('阿水')
>>> member
'筛子','披萨','左手','预言家','球皇'
2. del + 列表 或者 列表中的元素
>>> member = ['筛子','披萨','左手','阿水','预言家','球皇']
>>> del member[3]
>>> member
'筛子','披萨','左手','预言家','球皇'
>>> del member #列表被删除
3. list1.pop() 从列表中取出最后一个元素并返回给你 或者 加位置参数取出指定元素
>>> member = ['筛子','披萨','左手','阿水','预言家','球皇']
>>> member.pop()
'球皇'
>>> member
['筛子','披萨','左手','阿水','预言家']
>>> name = member.pop()
>>>> name
'预言家'
>>> member
['筛子','披萨','左手','阿水']
>>> name2 = member.pop(1)
>>> name2
'披萨'
>>> member
['筛子','左手','阿水']
三、列表分片
>>> member = ['筛子','披萨','左手','阿水','预言家','球皇']
>>> member[1:3]
['披萨','左手']
>>> member[:3]
['筛子','披萨','左手']
>>> member[3:]
['阿水','预言家','球皇']
>>> member[:]
['筛子','披萨','左手','阿水','预言家','球皇']
>>> member2 = member[:]
>>> member2
['筛子','披萨','左手','阿水','预言家','球皇']
四、课后题
1.请问 list1[0] 和 list1[0:1] 一样吗?
不一样,list1[0]返回第0个元素的值,list1[0:1]返回一个只含有第0个元素的列表。
2.如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做?
list1.insert(0,list1.pop())
3、有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢?
Python 的列表很聪明,竟然支持负数索引,如图:
正序: 0 1 2 3 4 5
列表元素: 1 3 2 9 7 8
负序 : -6 -5 -4 -3 -2 -1
正常索引从左到右索引,负数索引是从右到左
4、在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。
list1[0:6:2]
[1,2,7]
1)简洁分片操作:
list1[::2]
[1,2,7]
2)步长不能为0,会报错
list1 = [1, 3, 2, 9, 7, 8]
list1 = [ : : 0 ]
SyntaxError: invalid syntax
3) 步长可以是负数,改变方向(从尾部开始向左走)
list1[::-2]
[8, 9, 3]
5.课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢?
不能。
list1 = [1, 3, 2, 9, 7, 8]
list2 = list1[:]
list2
[1, 3, 2, 9, 7, 8]
list3 = list1
list3
[1, 3, 2, 9, 7, 8]
list1.sort()
list1
[1, 2, 3, 7, 8, 9]
list2
[1, 3, 2, 9, 7, 8]
list3
[1, 2, 3, 7, 8, 9]
PS:改变列表的赋值不会一起改变,而函数操作会一起改变
>>> old = [1, 2, 3, 4, 5]
>>> new = old
>>> old = [6]
>>> print(new)
[1,2,3,4,5]
>>> print(old)
[6]
12列表3
一、运算符
1.单独一个元素可比较
>>> list1 = [123]
>>> list2 = [234]
>>> list1 > list2
False
2.多个元素按第一个比较
>>> list1 = [123,456]
>>> list2 = [234,123]
>>> list1 > list2
False
3.比较运算符与逻辑运算符
>>> list3 = [123,456]
>>> list1 < list2 and list1 == list3
True
4.连接操作符
>>> list4 = list1 + list2
>>> list4
[123,456,234,123]
5.重复操作符
>>> list3 = [123,456]
>>> list3 *3
[123,456,123,456,123,456]
>>> list3
[123,456]
>>> list3 *= 3
>>> list3
[123,456,123,456,123,456]
6.成员关系操作符
>>> 123 in list3
True
>>> 123 not in list3
False
>>> list5 = [123,'TES',['阿水','左手'],456]
>>> '阿水' in list5
False
>>> '阿水' in list5[2]
True
>>> list5[2][1]
'左手'
请问如何将下边这个列表的’小甲鱼’修改为’小鱿鱼’?
>>> list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
>>> list1[1][2][0] = '小鱿鱼'
二、列表内置函数
1. list1.count(列表中的元素) 计算元素个数
>>> list1 = [123,456,123,456,123,456]
>>> list1.count(123)
3
2. list1.index(列表中的元素[,范围起始,范围结束]) 计算元素第一次出现的位置
>>> list1.index(123)
0
>>> list1.index(123,1,3)
2
3. list1.reverse() 原地翻转,改变列表
>>> list1.reverse()
>>> list1
[456, 123, 456, 123, 456, 123]
4. list2.sort() 正序排序
>>> list2 = [1,2,3,5,6,7,9,4,8]
>>> list2.sort()
>>> list2
[1,2,3,4,5,6,7,8,9]
5. 倒序 两种放法
>>> list2.sort(reverse = True) #倒序
>>> list2
[9,8,7,6,5,4,3,2,1]
>>> list2.sort()
>>> list2.reverse()
6. list2.copy() 复制
>>> list3 = list2.copy()
>>> list3
[9,8,7,6,5,4,3,2,1]
7. list2,clear() 清除
>>> list2.clear()
>>> list2
[]
三、列表推导式或列表解析
1. >>> [ i*i for i in range(10) ]
#你觉得会打印什么内容?
1. >>> [i*i for i in range(10)]
2. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#例如
1. >>> list1 = [x**2 for x in range(10)]
2. >>> list1
3. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#相当于
1. list1 = []
2. for x in range(10):
3. list1.append(x**2)
#例如
0. >>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
#相当于
1. list1 = []
2. for x in ragne(10):
3. for y in range(10):
4. if x%2 == 0:
5. if y%2 != 0:
6. list1.append((x, y))
四、例题
list1 = ['1.just do it','2.一切皆有可能','3.让编程改变世界','4.Impossible is Nothing']
list2 = ['4.阿迪达斯','2.李宁','3.鱼c工作室','1.耐克']
#题目答案:
list3 = [name + ‘:’ + slogan[2:] for slogan in list1 for name in list2 if slogan[0] = = name[0]]
#相同作用:
list3 = []
for slogan in list1:
for name in list2:
if slogan[0] = = name[0]:
list3.append((name + ':'+ slogan[2:]))#为了分割出1.2.3.4.
for each in list3:
print(each)
13元组
一、创建和访问一个元组,元组的元素是不能修改的
>>> tuple1 = (1,2,3,4,5,6)
>>> tuple1[1]
2
>>> tuple1[3:5]
(4,5)
>>> tuple2 = tuple1[:] #复制
二、更新和删除
更新、删除时采用拼接的方式改变元组
tuple1 = ('筛子','披萨','阿水','预言家','球皇')
tuple1 = tuple1[:2] + ('左手',) + tuple1[2:]
tuple1
('筛子','披萨','左手','阿水','预言家','球皇')
三、操作符与列表相同
四、课后题
0、请用一句话描述什么是列表?再用一句话描述什么是元组?
列表:一个大仓库,你可以随时往里边添加和删除任何东西。
元组:封闭的列表,一旦定义,就不可改变(不能添加、删除或修改)。
1、元组的内置函数,仅有两个方法count() and index()可以使用,其他方法都不行。
2、 x, y, z = 1, 2, 3
请问x, y, z是元组吗?
所有的多对象的、逗号分隔的、没有明确用符号定义的这些集合默认的类型都是元组,自己在IDLE中键入以下代码,并体会一下:
>>> x, y, z = 1, 2, 3
>>> type(x)
<class 'int'>
>>> h = x, y, z
>>> type(h)
<class 'tuple'>
3、上节课我们通过课后作业的形式学习到了“列表推导式”,那请问如果我把中括号改为小括号,会不会得到“元组推导式”呢?
Python3 没有“元组推导式”,为嘛?没必要丫,有了“列表推导式”已经足够了。
那为什么“>>> tuple1 = (x**2 for x in range(10))”不会报错?
因为你误打误撞得到了一个生成器:
1. >>> type(tuple1)
2. <class 'generator'>
#注意,Python3 开始 next() 方法改为 __next__() 哦~
1. >>> tuple1.__next__()
2. 0
3. >>> tuple1.__next__()
4. 1
5. >>> tuple1.__next__()
6. 4
7. >>> tuple1.__next__()
8. 9
9. >>> tuple1.__next__()
10. 16
11. >>> tuple1.__next__()
12. 25
13. >>> tuple1.__next__()
14. 36
14字符串:内置方法
一、字符串切片
字符串定义之后,与元组类似,不能轻易修改。
例:
二、各类方法
详细见网址:
https://fishc.com.cn/forum.php?mod=viewthread&tid=38992&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403
例如: 本身字符串没改变,返回新的字符串
>>> str1 = 'xiaoxie'
>>> str1.capitalize()
'Xiaoxie'
>>> str1
'xiaoxie'
三、课后题
程序演示:
1. symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
2. chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
3. nums = '0123456789'
4.
5. passwd = input('请输入需要检查的密码组合:')
6.
7. # 判断长度
8. length = len(passwd)
9.
10. while (passwd.isspace() or length == 0) :
11. passwd = input("您输入的密码为空(或空格),请重新输入:")
12.
13. if length <= 8:
14. flag_len = 1
15. elif 8 < length < 16:
16. flag_len = 2
17. else:
18. flag_len = 3
19.
20. flag_con = 0
21.
22. # 判断是否包含特殊字符
23. for each in passwd:
24. if each in symbols:
25. flag_con += 1
26. break
27.
28. # 判断是否包含字母
29. for each in passwd:
30. if each in chars:
31. flag_con += 1
32. break
33.
34. # 判断是否包含数字
35. for each in passwd:
36. if each in nums:
37. flag_con += 1
38. break
39.
40. # 打印结果
41. while 1 :
42. print("您的密码安全级别评定为:", end='')
43. if flag_len == 1 or flag_con == 1 :
44. print("低")
45. elif flag_len == 2 or flag_con == 2 :
46. print("中")
47. else :
48. print("高")
49. print("请继续保持")
50. break
51.
52. print("请按以下方式提升您的密码安全级别:\n\
53. \t1. 密码必须由数字、字母及特殊字符三种组合\n\
54. \t2. 密码只能由字母开头\n\
55. \t3. 密码长度不能低于16位'")
56. break
自己的代码:
print('----------14作业0密码安全性检查代码----------')
password = input('请输入您的密码:')
length = len(password)
string = '~!@#$%^&*()_=-/,.?<>;:[]{}|\\'
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
flag = 0
alphabet = 0
if password.isalnum() and length <= 8:
#字符串至少有一个字符并且所有字符都是数字或字母的返回True
print('您的密码满足低级密码要求!')
else :
for i in password :
if i in string :
flag += 1
break
for i in password :
if i in chars :
flag += 1
break
for i in password :
if i in nums :
flag += 1
break
for i in chars :
if password[0] == i :
alphabet = 1
break
if flag == 2 and length >= 8 :
print('您的密码满足中级密码要求!')
elif flag == 3 and length >= 16 and alphabet == 1 :
print('您的密码满足高级密码要求!')
else :
print('您的密码不满足密码的设计要求,请按照下方规定重新设计密码!')
print('低级密码要求:密码由单纯的数字或字母组成;密码长度小于等于8位')
print('中级密码要求:密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\);任意两种组合密码长度不能低于8位')
print('高级密码要求:密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合;密码只能由字母开头;密码长度不能低于16位')
15字符串格式化
一、 str1.format()
二、字符串格式化符号含义及转义字符含义
详情见网址:
https://fishc.com.cn/forum.php?mod=viewthread&tid=92997&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403
例子:
三、课后题
0、编写一个进制转换程序,程序演示如下(提示,十进制转换二进制可以用bin()这个BIF):
程序演示:
q = True
while q:
num = input('请输入一个整数(输入Q结束程序):')
if num != 'Q':
num = int(num)
print('十进制 -> 十六进制 : %d -> 0x%x' % (num, num))
print('十进制 -> 八进制 : %d -> 0o%o' % (num, num))
print('十进制 -> 二进制 : %d -> ' % num, bin(num))
else:
q = False
bin() #返回一个整数 int 或者长整数 long int 的二进制表示。
自己的代码:
print('----------15作业0进制转换----------')
temp1 = input('请输入您要转换的进制:(二进制写2;八进制写8;十六进制写16)')
while True :
while not temp1.isdigit() :
temp1 = input('请输入正确的进制:')
Hex = int(temp1)
if Hex != 2 and Hex != 8 and Hex != 16 :
temp1 = input('请输入正确的进制:')
continue #每次输入进制都必须为数字
break
temp2 = input('请输入您要转换的数:')
while not temp2.isdigit() :
temp2 = input('请输入正确的数字:')
num = int(temp2)
if Hex == 2 :
print('转换后的二进制数为:',bin(num))
elif Hex == 8 :
print('转换后的八进制数为:{0}'.format('%#o' % num))
else :
print('转换后的十六进制数为:{0}'.format('%#x' % num))
print('进制转换结束!')