【千锋Python2205班9.29笔记-day09-字符串(一阶段)】

在这里插入图片描述

01-review

# 1. 元组(tuple)
"""
容器;(数据1, 数据2, 数据3,...)
不可变的;有序的

元素:没有要求
"""
t1 = (10,)
t2 = 10, 23, 45, 89, 3

# 和列表一样去获取元素
print(t2[3])
print(t2[1:-1])

t3 = 10, 20, 30
x, y, z = t3

t4 = (10, 20, 30, 40, 50, 60)
x, *y, z = t4

# 2.集合(set)
"""
容器;{10, 23, 90}
可变的;无序的;

元素:不可变的数据;唯一的
"""
s1 = set()

# 数学集合运算: 交集(&)、并集(|)、差集(-)、对称差集(^)、子集(>=、<=)、真子集(>、<)

02-homework

# 1.用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
python = {'stu1', 'stu3', 'stu4', 'stu5', 'stu9', 'stu10'}
java = {'stu2', 'stu4', 'stu5', 'stu6', 'stu9', 'stu10'}
h5 = {'stu1', 'stu5', 'stu6', 'stu7', 'stu8', 'stu10'}

# a. 求选课学生总共有多少人
s1 = python | java | h5
print('选课学生总人数:', len(s1))

# b. 求只选了第一个学科的人的数量和对应的名字
s2 = python - java - h5
print('只选了第一个学科的人的数量和对应的名字:', len(s2), s2)

# e. 求选了三门学生的学生的数量和对应的名字
s3 = python & java & h5
print('选了三门学生的学生的数量和对应的名字:', len(s3), s3)

# c. 求只选了一门学科的学生的数量和对应的名字
s4 = (python ^ java ^ h5) - (python & java & h5)
print('只选了一门学科的学生的数量和对应的名字:', len(s4), s4)

# d. 求只选了两门学科的学生的数量和对应的名字
s5 = s1 - s3 - s4
print('只选了两门学科的学生的数量和对应的名字:', len(s5), s5)

print('------------------------------------------华丽的分割线------------------------------------------------')
# 2.获取列表中出现次数最多的元素
nums = [1, 2, 3, 1, 4, 2, 1, 3, 7, 3, 3, 1]
new_nums = set(nums)        # {1, 2, 3, 4, 7}
# 方法1:
max_times = 0
for x in new_nums:
    count = nums.count(x)
    if count > max_times:
        max_times = count

result = []
for x in new_nums:
    if nums.count(x) == max_times:
        result.append(x)
print(result)

# 方法2:
max_times = 0
result = []
for x in new_nums:
    count = nums.count(x)
    if count > max_times:
        max_times = count
        result.clear()
        result.append(x)
    elif count == max_times:
        result.append(x)
print(max_times, result)

# 3.实现给定一个日期,判断这个日期是今年第几天的程序(尝试)
# import time
# date = '2022/2/25'
# s_date = time.strptime(date, '%Y/%m/%d')
# print(s_date.tm_yday)

# 方法1:
year = int(input("年份:"))
month = int(input("月份:"))
day = int(input("日期:"))

month_day = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
    month_day[2] = 29

total_day = day
for m in range(1, month):
    total_day += month_day[m]
print(total_day)


# 方法2
month_day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
    month_day[1] = 29
total_day = day + sum(month_day[:month-1])
print(total_day)

03-字符

# 1.什么是字符串(str)
"""
容器型数据类型; 将''、""、''''''、""""""作为容器的标志里面的每个符号就是字符串中元素。
不可变的(不支持增删改);有序的(支持下标操作)

元素(字符):可以是任何文字符号, 包括:数字、字母、汉字、日文、韩语、表情符号、标点等
"""
# 任何文字符号都可以是字符串的元素
str1 = '10,20,30'
str2 = '12,=)*mksJkH胡上课😁❀'

# 三个引号开头三个引号结束的字符串,在字符串中可以直接按回车换行
str3 = "abc\n123"
print(str3)

str4 = '''abc
123'''
print(str4, type(str4))

# 2. 转义字符
"""
字符  -  字符串中的元素(字符串每一个独立的符号)
字符串中的字符可以分为两种:普通字符、转义字符

1)普通字符: 在字符串中表示符号本身的字符
2)转义字符: \和指定的一些符号组合在一起表示特殊功能或者特殊意义的字符。
转义字符是C语言创建的,但是很多都已经没有存在的价值的,目前常用的转义字符:
\n      -       换行
\t      -       水平制表符(相当于按一次tab键)
\'      -       表示一个普通的单引号
\"      -       表示一个普通的双引号
\\      -       表示一个普通的反斜杠
"""
# \u四位的十六进制数        -       编码字符

str5 = 'abcKH1234,😁'
print(str5)

# 并不是\和所有符号组合都可以变成转义字符
str6 = '\m\k\l'
print(str6)     # \m\k\l

# 有一些C语言中的转义字符,在其他编程语言中无效
str7 = '=\a=\f='
print(str7)

print('------------------------------------------华丽的分割线------------------------------------------------')
str8 = '\tabc\n123'
print(str8)

str9 = 'it\'s me'
str10 = "it's me"

str11 = "i say: \"you see see, one day day!\""
print(str11)

str12 = 'i say: \"you see see, one day day!\"'

str13 = '\\name\yuting\论文.txt'
print(str13)

# 编码字符
str14 = '\u4e01abc'
print(str14)

print('------------------------------------------华丽的分割线------------------------------------------------')
# 3.r-string(r字符串)
"""
在字符串的最前面加r或者R,可以让字符串中所有的转义字符功能消失(让字符串中的所有字符自动变成普通字符)
"""
str1 = r'\tabc\n123\''
print(str1)

print('------------------------------------------华丽的分割线------------------------------------------------')
path = R'C:\ser\test\name\yuting\demo\t.txt'
print(path)

04-字符编码

# 1. 编码值
"""
计算机存储数据的时候只能存数字(存的是数字对应的二进制的补码);
为了能够让计算机存储字符,给每个字符对应一个固定的数字,每次需要存储这个字符的时候就去存这个数字;
每个字符对应的那个数字就是这个字符的编码值。
"""

# 2.编码表  - 保存不同字符对应的编码值的表
"""
1)ASCII码表  - 有128个字符对应的编码值(只要包含英文符号和其他西欧语言对应的符号)
数字字符0~9从48开始连续递增
大写字母A~Z从65开始连续递增
小写字母a~z从97开始连续递增

2)Unicode编码表(Python)  -  是ASCII码表的扩展(包含了ASCII码表),包含了世界上所有国家所有民族所有语言的对应的符号(统一码、万国码)
中文范围:4e00 ~ 9fa5
"""

# 3.Python程序对编码值的应用
# 1)chr(编码值)    -   获取指定编码值对应的字符
print(chr(97), chr(65))

# 打印所有的大写字母
for x in range(65, 65+26):
    print(chr(x))

print('------------------------------------------华丽的分割线------------------------------------------------')
print(chr(0x4e00), chr(0x9fa5))

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

# 2)ord(字符)  -  获取指定字符对应的编码
# 注意:字符指是长度为1的字符串
print('------------------------------------------华丽的分割线------------------------------------------------')
print(ord('余'), ord('婷'))
print(hex(20313), hex(23159))

print(ord('a'))

# 3)编码字符: \u四位的十六进制数
# 程序中给字符串提供字符的时候有两种方式:a.直接提供符号本身  b.通过字符对应的编码字符来提供(\u字符的16进制编码值)
str1 = 'a余'
str2 = '\u0061\u4f59'
print(str1, str2)

# 编码字符的使用场景:知道字符编码值,但是不知道字符的情况下,想要在字符串中提供这样一个字符
print('在Unicode编码表中最后一个中文是:', '\u9fa5')

05-字符串基本操作

# 1.查 - 获取字符串中的字符
# 字符串获取字符的语法和列表获取元素的语法一样。
# 1)获取单个字符
str1 = 'good good study! day day up!'
print(str1[3], str1[-2])

# 注意:不管转义字符的功能是什么,在计算字符串长度的时候一个转义字符的长度是1
str2 = '\tabc\n123\u4e00m'
print(str2[1], str2[-3])

# 2)切片
message = '小明的电话号码是:13678192303'
print(message[-11:])            # '13678192303'
print(message[3:-2:-2])         # ''
print(message[1:-1:2])          # '明电号是16893'

# 3)遍历
str3 = 'hello python!'
for x in str3:
    print(x)

print('------------------------------------------华丽的分割线------------------------------------------------')
for x in range(len(str3)):
    print(x, str3[x])

print('------------------------------------------华丽的分割线------------------------------------------------')
for index, item in enumerate(str3):
    print(index, item)


# 2. 数学运算:+、*
# 1) 字符串1 + 字符串2       -       将两个字符串合并产生一个新的字符串(字符串拼接)
str1 = 'hello'
str2 = 'world!'
str3 = str1 + ' ' + str2
print(str3)

# 2) 字符串 * N        -       将字符串重复N次产生一个新的字符串
str4 = str1 * 3
print(str4)

# 案例:提取字符串中所有数字字符
# 'abc12MK89你好9'   ->  '12899'
str1 = 'abc12MK89你好9'
new_str = ''
for x in str1:
    if '0' <= x <= '9':
        new_str += x
print(new_str)      # '12899'

# ''+'1' -> '1' + '2' ->'12' + '8'  -> '128' ...

# 案例:在字符串中两个字符之前插入*
# 'abc12'  ->  'a*b*c*1*2'
str1 = 'abc12'
new_str = ''
for x in str1:
    new_str += x + '*'

print(new_str[0:-1])

# 练习:将字符串中所有的数字字符都替换成*
# 'ab2Mk89你好8'  ->  'ab*Mk**你好*'
str1 = 'ab2Mk89你好8'
new_str = ''
for x in str1:
    if '0' <= x <= '9':
        new_str += '*'
    else:
        new_str += x
print(new_str)      # 'ab*Mk**你好*'


# 3.比较运算:>、<、>=、<=、==、!=
# 1)判断相等:两个一模一样的字符串才相等
print('abc' == 'acb')       # False

# 2)比较大小: 两个字符串比较大小,比较的是第一对不相等的字符的编码值的大小
"""
已知字符x:
判断x是否是数字字符:  '0' <= x <= '9'
判断x是否是小写字母:  'a' <= x <= 'z'
判断x是否是大写字母:  'A' <= x <= 'Z'
判断x是否是字母:      'a' <= x <= 'z' or 'A' <= x <= 'Z'
判断x是否是中文:      '\u4e00' <= x <= '\u9fa5'
"""
print('MKAHDJSS' > 'abc')       # False

# 练习:分别统计字符串中中文和大写字母的数量
str1 = 'shfa换手机223--=2MjshUj行HSJSA'
count1 = count2 = 0
for x in str1:
    if '\u4e00' <= x <= '\u9fa5':
        count1 += 1
    elif 'A' <= x <= 'Z':
        count2 += 1
print(count1, count2)


# 4. in 和 not in
# 字符串1 in 字符串2   -  判断字符串1是否是字符串2的子串(判断字符串2中是否包含字符串1)

print(10 in [10, 20, 30])           # True
print([10, 20] in [10, 20, 30])     # False

print('a' in 'abc123')          # True
print('abc' in 'abc123')        # True
print('ab1' in 'abc123')        # False

# 5. str(数据)  -  将指定数据转换成字符串
# 所有类型的数据都可以转换成字符串,转换的时候是在数据的打印值外面加引号
print(100)
str(100)        # '100'

list1 = [10,20,30]
print(list1)        # [10, 20, 30]
str(list1)     # '[10, 20, 30]'

list2 = ["abc", 100]
print(list2)
str(list2)      # "['abc', 100]"

dict1 = {"a":10,'b':20, 'c':"abc"}
print(dict1)
str(dict1)      # "{'a': 10, 'b': 20, 'c': 'abc'}"

06-字符串相关方法

# 字符串.xxx()

# 1. 必须掌握的字符串相关方法(一级)
# 1) 字符串.join(序列)       -      用指定字符串将序列中元素拼接成一个字符串(序列中的元素必须是字符串)
result = '+'.join(['name', 'age', 'gender'])
print(result)       # name+age+gender

result = '=='.join('abc')
print(result)       # a==b==c

nums = [10, 20, 30, 40]
# '10+20+30+40'
result = '+'.join([str(x) for x in nums])
print(result)       # '10+20+30+40'


list1 = [10, 'abc', '你好', 1.23, True, '手机壳']
# 'abc你好手机壳'
result = ''.join([x for x in list1 if type(x) == str])
print(result)       # 'abc你好手机壳'

# 练习:将列表中每个元素的第一个字符提取出来形成一个新的字符串:
# ['name', 'age', 'gender']  -> 'nag'
list1 = ['name', 'age', 'gender']
result = ''.join([x[0] for x in list1])
print(result)

# 2) split
# 字符串1.split(字符串2)      -      将字符串1中所有的字符串2作为切割点对字符串1进行切割
# 字符串1.split(字符串2, N)   -      将字符串1中前N个字符串2作为切割点对字符串1进行切割
str1 = '123abc你好abc===abc+++'
result = str1.split('abc')
print(result)       # ['123', '你好', '===', '+++']

result = str1.split('a')
print(result)       # ['123', 'bc你好', 'bc===', 'bc+++']

result = str1.split('abc', 2)
print(result)       # ['123', '你好', '===abc+++']


# 注意:如果切割点连续出现或者切割点在字符串的开头或者结果,切割的结果中会出现空串
str1 = 'abc123abcabc你好abc===abc+++abc'
result = str1.split('abc')
print(result)       # ['', '123', '', '你好', '===', '+++', '']


# 3)
# 字符串1.replace(字符串2, 字符串3)    -   将字符串1中所有的字符串2都替换成字符串3
# 字符串1.replace(字符串2, 字符串3, N)    -   将字符串1中前N个字符串2都替换成字符串3

message = 'how are you? i am fine! thank you! and you?'
result = message.replace('you', 'me')
print(result)       # how are me? i am fine! thank me! and me?

result = message.replace('you', 'me', 1)
print(result)       # how are me? i am fine! thank you! and you?

# 案例:删除字符串message中所有的空格符号
result = message.replace(' ', '')
print(result)       # howareyou?iamfine!thankyou!andyou?


# 4)
# 字符串.strip()  -  删除字符串前后两端的空白字符
# 字符串.strip(字符集)  - 删除字符串前后两端的指定所有字符
str1 = '''
     你 好,世 界                     
     
    '''

result = str1.strip()
print(result)
print('====')

str2 = '/+//u/重/庆a++///++//'
result = str2.strip('/+')
print(result)


# 5)
# 字符串1.find(字符串2)       -       获取字符串2第一次出现在字符串1中的位置,如果字符串2不存在返回-1
# 字符串1.index(字符串2)       -       获取字符串2第一次出现在字符串1中的位置,如果字符串2不存报错
message = 'how are you? i am fine! thank you! and you?'
print(message.find('you'), message.index('you'))

print(message.find('abc'))      # -1
# print(message.index('abc'))   # 报错

# 字符串1.find(字符串2, 开始下标, 结束下标)       -       在字符串1中指定范围内查找字符串2第一次出现的位置, 如果找不到返回-1
# 字符串1.index(字符串2, 开始下标, 结束下标)       -       在字符串1中指定范围内查找字符串2第一次出现的位置, 如果找不到报错
message = 'how are you? i am fine! thank you! and you?'
print(message.find('you', 0, 8))        # -1
print(message.find('you', 11))          # 30

# 字符串1.rfind(字符串2)       -       (从后往前找)
# 字符串1.rindex(字符串2)       -       (从后往前找)
message = 'how are you? i am fine! thank you! and you?'
print(message.rfind('you'))     # 39

# 2.尽可能记住的字符串相关方法
# 1) count
# 2) isdigit()
# 3) islower()、isupper()
# 4)lower()、upper()
# 5)maketrans()、translate()
# 6)rjust()、ljust、center、zfill
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值