第二周 Day 8 —— 元组和集合
一、元组
1.什么是元组
元组是容器(序列),将()
作为容器的标志,里面多个元组用逗号隔开:(元素1,元素2,元素3,…)。
- 不可变的(不支持增、删、改)
- 有序的(支持下标操作)
- 元素的要求和列表一样
元组就是不可变的列表
tuple1 = (10, 20, True, '123', [10, 20], {'a': 100})
print(tuple1, type(tuple1)) # (10, 20, True, '123', [10, 20], {'a': 100}) <class 'tuple'>
2. 查
列表获取元素的方法,元组都支持。
t1 = ('周一', '周二', '周三', '周四', '周五', '周六', '周日')
print(t1[0]) # 周一
print(t1[-1]) # 周日
print(t1[2:]) # ('周三', '周四', '周五', '周六', '周日')
print(t1[:4:-1]) # ('周日', '周六')
3. 元组特有或者常用的一些操作
-
只有一个元素的元组:必须在唯一的那个元素后加逗号
,
。t3 = (10) print(t3, type(t3)) # 10 <class 'int'> t3 = (10,) print(t3, type(t3)) # (10,) <class 'tuple'>
-
在没有歧义的情况下,元组的小括号可以省略。(直接将多个元素用逗号隔开,也是表示一个元素)
t4 = 10, 20, 30, 40 print(t4, type(t4)) # (10, 20, 30, 40) <class 'tuple'>
-
可以通过让变量的个数和元组中元素的个数保持一致,来获取元组中的每个元素。(列表也可以用)
point = (10, 20) x, y = point print(x, y) # 10 20
-
变量也可以比元组中的个数少,但是必须在其中一个变量前面加上
*
,取值的时候先让不带*
的按顺序先取,剩下的元素以列表的形式返回给带*
的变量。t5 = ('小明', 18, 59, 89, 98, 78, 100) x1, x2, *x3 = t5 print(x1, x2, x3) # 小明 18 [59, 89, 98, 78, 100]
二、集合set
集合是容器(序列),将{}
作为容器的标志,里面多个元素用逗号隔开:{元素1,元素2,元素3,…}
1. 集合的特点
- 可变的
- 无序
- 元素的要求:不可变的、唯一的
- 空集合
s1 = set()
print(type(s1), len(s1)) # <class 'set'> 0
- 元素不可变
s2 = {10, True, 'abc', (1, 2)}
print(s2) # {'abc', True, 10, (1, 2)}
s3 = {10, True, 'abc', [1, 2]} # 报错
- 集合无序
print({1, 2, 3} == {1, 3, 2}) # True
- 元素唯一
s3 = {1, 2, 3, 1, 1, 2, 2, 5, 6, 5}
print(s3) # {1, 2, 3, 5, 6}
scores = [89, 89, 48, 78, 91, 78, 89]
new_scores = list(set(scores))
print(new_scores) # [48, 89, 91, 78]
集合自带去重功能
2. 数学集合运算:交集、并集、差集、对称差集
-
交集
&
求两个集合的公共部分
s1 = {1, 2, 3, 4, 5, 6, 7} s2 = {5, 6, 7, 8, 9} result = s1 & s2 print(result) # {5, 6, 7}
-
并集
|
合并两个集合
s1 = {1, 2, 3, 4, 5, 6, 7} s2 = {5, 6, 7, 8, 9} result = s1 | s2 print(result) # {1, 2, 3, 4, 5, 6, 7, 8, 9}
-
差集
-
集合1-集合2 -> 集合1中除了包含在集合2中以外的部分
s1 = {1, 2, 3, 4, 5, 6, 7} s2 = {5, 6, 7, 8, 9} result = s1 - s2 print(result) # {1, 2, 3, 4} result = s2 - s1 print(result) # {8, 9}
-
对称差集
^
两个集合合并然后去掉公共部分
s1 = {1, 2, 3, 4, 5, 6, 7} s2 = {5, 6, 7, 8, 9} result = s1 ^ s2 print(result) # {1, 2, 3, 4, 8, 9}
练习:用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
a. 求选课学生总共有多少人
b. 求只选了第一个学科的人的数量和对应的名字
c. 求只选了一门学科的学生的数量和对应的名字
d. 求只选了两门学科的学生的数量和对应的名字
e. 求选了三门学生的学生的数量和对应的名字
#a.
human_sum = python | java | h5
print(len(human_sum)) # 11
#b.
first_subject = python - java - h5
print(len(first_subject), first_subject) # 2 {'stu5', 'stu6'}
#c.
one_subject = (python ^ java ^ h5) - (python & java & h5)
print(len(one_subject), one_subject) # 5 {'stu5', 'stu2', 'stu6', 'stu9', 'stu3'}
#d.
two_subjects = ((python & java) | (python & h5) | (java & h5)) - (python & java & h5)
print(len(two_subjects), two_subjects) # 4 {'stu4', 'stu7', 'stu1', 'stu11'}
#e.
three_subject = python & java & h5
print(len(three_subjects), three_subjects) # 2 {'stu10', 'stu8'}
三、字符串
1. 什么是字符串str
字符串是容器(序列),将''
、""
、''' '''
、""" """
作为容器的标志,在引号中的每一个符号都是字符串的元素(字符串的元素又叫字符)。
-
''
和""
没有区别str1 = 'abc' str2 = "abc" # str1和str2一样
-
''' '''
和""" """
没有区别str1 = '''abc''' str2 = """abc""" # str1和str2一样
注意:
''
和""
引起来的字符串内容不能通过回车换行,''' '''
和""" """
引起来的字符串内容可以直接通过回车换行。
2. 字符串的特点
- 不可变(所有字符串相关的可变操作,全部都是会产生一个新的字符串)
- 有序的
-
字符串的元素(字符)
通过任何手段可以放入引号中的符号都可以是字符串的元素。
3. 字符
分为普通字符和转义字符两种
-
普通字符
除了转义字符以外的字符都是普通字符。
-
转义字符
在一些特定符号前加
\
,在字符串中表示一些具有特殊功能或者特殊意义的符号。
转义字符 | 意义 |
---|---|
\n | 换行 |
\t | 水平制表符(相当于按一次tab键) |
\’ | 表示一个单引号 |
\" | 表示一个双引号 |
\\ | 表示一个反斜杠 |
\u+16位进制数的编码值 | 将编码值转换成对应的字符 |
str1 = 'abc\'123\"456\\n789'
print(str1) # abc'123"456\n789
str2 = '\u4e00123456'
print(str2) # 亀123456
四、字符编码
1. 字符在计算机中的存储问题
计算机只能存数字,所以为了能够保存字符,给每一个字符对应一个固定的数字。每次需要保存字符的时候直接保存字符对应的那个数字。
一个字符对应的那个固定的数字就是这个字符的编码值。
2. 编码表
记录字符和编码值之间一一对应关系的表,常见的编码表有两种:ASCII码表,Unicode编码表。
-
ASCII码表
- 总共有128个字符。
- 表中,数字字符在大写字母前面,大写字母在小写字母前面,大写字母和小写字母之间有其他字母。
-
Unicode编码表
- Unicode编码表是对ASCII码表的扩充,它记录了世界上所有的国家所有的民族所有的语言的所有符号。
- 中文的编码范围:4e00 ~ 9fa5
3. 编码值的使用
\u编码值
(4位16进制)
print('\u4e01') # 丁
print('\u9e01') # 鸁
-
chr(编码值)
获取编码值对应的字符
# 打印汉字
for x in range(0x4e00, 0x9fa5 + 1):
print(chr(x), end=" ")
-
ord(字符)
获取字符的编码值
print(ord('杨'), ord('凯')) # 26472 20975
print(hex(ord('杨')), hex(ord('凯'))) # 0x6768 0x51ef
-
字符串比较大小
比较第一对不相等的字符的编码值得大小。(两个字符串同位置上的字符是一对)
print('abc' > 'ABCDEF') # True
print('abc' > 'acABC') # False
print('你好' > 'hello') # True
数字字符:‘0’ <= char <= ‘9’
大写字母:‘A’ <= char <= ‘Z’
小写字母:‘a’ <= char <= ‘z’
中文:’\u4e00’ <= char <= ‘\u9fa5’
pw = input('请输入密码(字母和数字组成):')
for c in pw:
if not ('0' <= c <= '9' or 'A' <= c <= 'Z' or 'a' <= c <= 'z'):
print('密码不合法!')
break
else:
print('合法密码!')