python进阶—基础篇7(集合、字符串、字符串编码、字符串相关操作)

集合和字符串

集合

1.什么是集合(set)

集合是…容器型数据类型;将{}作为容器的标志,多个元素用逗号隔开:{元素1,元素2,元素3,}
集合是可变的;无序的;
元素:不可变的,唯一的

进行数据遍历的时候,效率比较高,高于有序
空集合

x = {}     # {}是空字典
print(type(x))

y = set()    # 空集合
print(type(y), len(y))

元素是不可变的

# set1={12,'abc',[10,20]}    #TypeError: unhashable type: 'list'
set2 = {12, 'abc', (10, 20)}

元素是唯一的(集合自带去重功能)

names = {'张三', '李四', '王五', '张三'}
print(names)     #{'王五', '张三', '李四'}

集合去重

names = ['张三', '李四', '王五', '张三']
names=set(names)
print(names)       #{'张三', '李四', '王五'}

集合是无序的
print({1, 2} == {2, 1}) # True

2.集合的增删改查

1)查 - 遍历

set4 = {10, 20, 78, 90}
for x in set4:
   print(x,end=' ')   #10 20 90 78
print()

2)增
set4 = {10, 20, 78, 90}
a:集合.add(元素) - 在集合中添加元素

set4.add(100)      #{100, 10, 78, 20, 90}
print(set4)

b:集合.update(序列) - 将序列中所有的元素添加到集合中

set4.update('abc')
print(set4)       #{'c', 100, 10, 'b', 'a', 78, 20, 90}

3)删
a.集合.remove(元素) - 删除指定元素(如果元素不存在,会报错)

set4 = {10, 20, 78, 90}
set4.remove(78)
print(set4)     #{10, 20, 90}
# set4.remove(200)    #KeyError: 200

b.集合.discard(元素)-删除指定元素(如果元素不存在,不会报错)

set4 = {10, 20, 78, 90}
set4.discard(78)   # {10, 20, 90}
print(set4)
set4.discard(200)    # 不会报错

4)改 - 无法修改元素

3.数学集合运算

python中的集合支持数学的集合运算:子集(>,<,>=,<=)、并集(|)、交集(&)
1)子集

print({200, 300, 400} > {1, 2})   #False  对于集合来说,此种方式不是比大小,而是判断子集

a.集合1>集合2 -判断集合2是否是集合1的真子集

print({10, 20, 30} > {10, 20})    #True
print({10, 20} > {10, 20})        #False

b.集合1>集合2 - 断集合2是否是集合1的子集

print({10, 20, 30} >= {10, 20})  # True
print({10, 20} >= {10, 20})    # True

2)并集

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 | set2)   #{1, 2, 3, 4, 5, 6, 7, 8}

3)交集

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 & set2)   #{4, 5, 6}

4)差集

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 - set2)    #{1, 2, 3}

5)对称差集

print(set1 ^ set2)    #{1, 2, 3, 7, 8}

题目实例:一共有三门学科可供学生选择,学生可选择一门,两门或者三门课程
a. 求选课学生总共有多少人
b. 求只选了第一个学科的人的数量和对应的名字
c. 求只选了一门学科的学生的数量和对应的名字
d. 求只选了两门学科的学生的数量和对应的名字
e. 求选了三门学生的学生的数量和对应的名字

python ={'stu1','stu2','stu5','stu8','stu10'}
java={'stu3','stu5','stu6','stu7','stu8','stu10'}
h5={'stu2','stu4','stu5','stu7','stu9','stu10'}
stu_all=python|java|h5
print("选课总人数为:",len(stu_all))
only_python=python-java-h5
only_java=java-python-h5
only_h5=h5-python-java
print("只选择了第一个学科的人共有:",
     len(only_python),'对应名字为:',only_python)
only_one_subject=only_h5|only_java|only_python
print("只选择了一门学科的人共有:",
     len(only_one_subject),'对应名字为:',only_one_subject)
only_three_subject=python&java&h5
print("选择了三门学科的人共有:",
     len(only_three_subject),'对应名字为:',only_three_subject)
only_two_subject=stu_all-only_three_subject-only_one_subject
print("选择了两门学科的人共有:",
     len(only_two_subject),'对应名字为:',only_two_subject)

字符串

1.什么是字符串

字符串是容器型数据类型;
以’‘或者"“或者”"""""或者’’’’’‘作为容器的标志,里面多个字符(任意符号)
不可变(不支持增删改);有序的(支持下标操作)
字符串的元素:字符串的每个基本单元,字符(任何符号都可以)
字符串
‘’’’’'和""""""引起来的字符串可以直接敲回车换行

str1='ab' \
     'c'
str2='''hcl
fya
fy
dm
'''

2.字符

python没有字符对应的类型,只有字符的概念
1) 普通字符: 包含所有的符号,:数字,字母,中文、各种图形,符号等
2)转义字符: 和\结合后具有特殊功能和特殊意义的字符,就是转义字符(转义字符不是python中的概念)
\n - 换行(表示为1个符号)
\t - 一个水平制表符(相当于按一次tab键)
’ - 一个单引号
" - 一个双引号
\ - 一个反斜杠字符
注意:任意一个转义字符的长度是1
“”"
\u 加上4位的16进制数 - 编码字符
普通字符

str1= '123'
str2='ahsj'
str3='你好世界'
str4='+=#'
str5='🐻❄❀🐕🕊🐟🌳'
print(str5)

转义字符

print("=====================")
str1 = '123\nabc'
print(str1)
print(len(str1))
poem = "鹅鹅鹅\n曲项向天歌\n白毛浮绿水\n红掌拨清波"
print(poem)
str2= '123\'abc'   #不加\会产生歧义
str3= "123\"abc"   #不加\会产生歧义
str4= '123\\nabc'  #123\nabc
print(str4)
str5= '\t123abc'
print(str5)

str6 = '123\u4effc'
print(str6,len(str6))   #123仿c 5

3.阻止转义

python中在字符串的最前面加r/R,可以让这个字符串中所有的转义字符的功能消失

str7 = '\t123\nabc\\aaa\u4e00'
print(str7,len(str7))       #abc\aaa一 13

str8 = R'\t123\nabc\\aaa\u4e00'
print(str8,len(str8))  #\t123\nabc\\aaa\u4e00 21

字符编码

1.计算机数据存储

计算机在存储数据的时候,只能直接存储数字数据,而且以二进制的形式存储的数字。
内存的硬件只有二极管,通过二极管的导通或关闭来存贮数据
数据单位:
位(bit)
1字节(byte)==8位
1kb=1024byte
1mb=1024kb
1Gb=1024mb
1T=1024Gb

2.字符编码

1)字符编码
为了能够让计算机存贮字符,我们给每个字符关联一个具体的数字,在需要存贮字符的时候就存储字符对应的数字。
每个字符对应的数字就是字符的编码子
2)编码表
保存字符和数字的一一对应关系的表就是字符编码表,常用的字符编码表有两中:ASICC码表、Unicode编码表
a.ASICC: 使用一个字节对128个字符进行编码(最高位是符号位,所以一共有128个),其中包括常用的英文符号、数字和字母。
数字编码在字母的前面,大写字母的编码在小写字母的前面,大写字母和小写字母不连续
b.Unicode编码表: 叫万国码,包含了世界上所有国家所有名族的所有语言符号。前128个字符就是ASICC码表中的字符,
其中中文的编码范围是:4e00~9f55
编码字符:\u四位的16进制数(这儿的4位的16进制就是字母的编码值)

str1 = 'a\u0061' #0061是97的16进制数
print(str1)     #aa

3.chr函数

chr(编码值) - 获取编码值对应的字符

print(chr(97))    #a
print(chr(0x4e00))   #一

4.ord(字符) - 获取字符的编码值

print(ord('胡'),ord('朝'),ord('林'))
print(hex(ord('胡')),hex(ord('朝')),hex(ord('林')))

练习:打印所有的汉字

for x in range(0x4e00,0x9f55+1):
    print(chr(x),end=' ')

字符串的相关操作

1.获取字符串

字符串获取字符和列表获取元素的方法一样
1)获取单个字符

str1 = '人生苦短,我用python!'
print(str1[3])

str2 = 'how are\n you'
print(str2[9], str2[-3])

2)切片

message = '我对你的敬仰犹如滔滔江水,连绵不绝'
print(message[1:])
print(message[2:10:3])
print(message[-10:-2:-1])  # ''

3)遍历

message = '假和尚吃肉,真和尚喝酒'
for x in message:
    print(x)
message3 = 'you jump, i jump!'
for x, y in enumerate(message3):
    print(x, y)

练习1:打印每个字符的编码值

message3 = 'you jump, i jump!'
for x in message3:
    print(ord(x))

练习2:统计中文个数

message3 = '人生苦短,我用python!'
count = 0
for x in message3:
    if 0x4e00 <= ord(x) <= 0x9f55:  # 使用hex转换成16进制后为字符串,不是数字
        count += 1
print(count)

2.加法和乘法运算

字符串1+字符串2–将两个字符串合并产生一个新的字符串

str1 = 'abc' + '123'
print(str1)

字符串N/N字符串 - 字符串重复N次产生一个新的字符串

str2 = 'abc' * 3
print(str2)  # abcabcabc

3.比较运算:>,<,>=,<=

两个字符串比较大小比较的是第一对不相等的字符的编码值大小
判断一个字符是否是小写字母:‘a’<=x<=‘z’
判断一个字符是否是小写字母:‘A’<=x<=‘Z’
判断一个字符是否是字母:‘A’<=x<=‘Z’ or ‘a’<=x<=‘z’
判断一个字符是否是数字字符:‘0’<=x<=‘9’
判断一个字符是否是中文字符:’\u4e00’<=x<=’\u9f55’

print('abc' > 'zdfsdfsd')  # False

练习:取出字符串中所有的小写字母

str3 = 'jhdjfdk,我喜欢jhg美女MP'
str4 = ''
str5 = ''
for i in str3:
    if 'a' <= i <= 'z':
        str4 += i
    if '\u4e00' <= i <= '\u9f55':
        str5 += i
print(str4)      #jhdjfdkjhg
print(str5)      #我喜欢美女

练习:小写字母变成大写

str3 = 'jhdjfdk,我喜欢jhg美女MP'
str4 = ''
for value in str3:
    if 'a' <= value <= 'z':
        str4 += chr(ord(value) - 32)
    else:
        str4 += value
print(str4) # J HDJFDK,我喜欢JHG美女MP

4.in 和 not in

字符 in 字符串 – 判断 字符串中是否有指定的字符
字符串1 in 字符串2 --判断 字符串2中是否包含字符串1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值