今日学习目标:
- 理解运用字符串的其他内置方法
- 理解运用列表内置方法
- 理解补充知识点
今日学习内容:
内容简要:
- 字符串的其他内置方法(剩余部分)
- 列表内置方法
- 补充知识点
内容详细:
字符串的其他内置方法(剩余部分)
前一部分请见我上一篇
[博客]
-
1.移除字符串首尾的指定字符 可以选择方向
用法举例
str1 = '**jason***' print(str1.strip('*')) # 移除左右两边的指定字符 print(str1.lstrip('*')) # 只移除左边的指定字符 print(str1.rstrip('*')) # 只移除右边的指定字符
运行结果
-
2.大小写相关操作
用法举例
str2 = 'My nAme is tonY!' print(str2.lower()) # 将英文字符串全部变小写 print(str2.upper()) # 将英文字符串全部变大写
运行结果
扩展补充
-
判断字符串中所有的英文字母是否是纯小写或纯大写
用法举例
str2 = 'My nAme is tonY!' print(str2.islower()) # 判断字符串中所有的英文字母是否是纯小写 结果是布尔值 print(str2.isupper()) # 判断字符串中所有的英文字母是否是纯大写 结果是布尔值
运行结果
为什么以前的认证码需要一模一样 大小写不能忽略 现在的验证码却可以 如何实现
*************************** code = 'JaSOn6' print('这是返回给用户的图片验证码:%s' % code) user_code = input('请输入验证码>>>:').strip() if code.lower() == user_code.lower(): # 验证码忽略大小写 只需要统一转大写或者小写即可 print('验证码正确') ***************************
-
-
3.判断字符串的开头或者结尾是否是指定的字符
用法举例
str3 = 'tony jam' # startswith()判断字符串是否以括号内指定的字符开头,结果为布尔值True或False print(str3.startswith('t')) print(str3.startswith('j')) # endswith()判断字符串是否以括号内指定的字符结尾,结果为布尔值True或False print(str3.endswith('jam')) print(str3.endswith('tony'))
运行结果
-
4.格式化输出
1.方式1 占位符:%s %d
详细用法见我之前【博客】
方式2 format方法>>>:四种用法
用法 举例 占位符一致 使用的{}占位 print(‘my name is {} my age is {}’.format(‘jason’, 18)) 据索引取值 可以反复使用 print(‘my name is {0} {0} {0} my age is {0} {1}’.format(‘jason’, 18)) 据指名道姓的方式取值 print(‘my name is {name} {name} my age is {age} {pwd}’.format(name=‘jason’, age=18, pwd=123)) 接使用已经出现过的变量 name = ‘jason’ age = 18 print(f’my name is {name} my age is {age} {name} {age}’) 用法举例
# 玩法1:跟占位符一致 使用的{}占位 print('my name is {} my age is {}'.format('jason', 18)) # 玩法2:根据索引取值 可以反复使用 print('my name is {0} {0} {0} my age is {0} {1}'.format('jason', 18)) # 玩法3:根据指名道姓的方式取值 print('my name is {name} {name} my age is {age} {pwd}'.format(name='jason', age=18, pwd=123)) # 玩法4:直接使用已经出现过的变量 name = 'jason' age = 18 print(f'my name is {name} my age is {age} {name} {age}')
运行结果
python官网很久以前就说推荐使用format做格式化输出 甚至说%s要被砍掉
-
5.拼接字符串
方式 举例 s1 + s2(如果字符串很大 加号效率较低) $1600 s1 * 10()重复次数 $12 ‘拼接的字符’.join(被拼接的字符串) $1 用法举例
s1 = '三月不努力 四月变垃圾' s2 = '年少不努力 妄为少年人' s3 = '2' print(s1 + s2) print(s3 * 10) print('|'.join(s1)) print('$'.join(['jason', 'kevin', 'justin', 'tony']))
运行结果
join方法相当于是将括号内的元素进行for循环,所以 join的元素必须都是字符串才可以 否则报错
-
6.替换字符串中指定的字符
用法举例
str7 = 'my name is tony, my age is 18!' # 将tony的年龄由18岁改成73岁 str7 = str7.replace('18', '73') # 语法:replace('旧内容', '新内容') print(str7) # 可以指定修改的个数 str7 = 'my name is tony, my age is 18!' str7 = str7.replace('my', 'MY', 1) # 只把一个my改为MY print(str7)
运行结果
-
7.判断字符串中是否是纯数字
用法举例
# 判断字符串是否是纯数字组成,返回结果为True或False str8 = '5201314' print(str8.isdigit()) str8 = '123g123' print(str8.isdigit())
运行结果
下面方法使用频率低,只做了解
-
1.查找指定字符对应的索引值
方式 区别 要查找的字符串.find(‘查找的字符’) #从左往右查找 查找一个就结束 print(s1.find(‘k’, 1, 9)) # -1 意思是没有 找不到 要查找的字符串.index(‘查找的字符’) print(s1.index(‘k’, 1, 9)) # 找不到直接报错 不推荐使用 用法举例
s1 = 'jason justin kevin tony' print(s1.find('s')) print(s1.find('k', 1, 9)) print(s1.index('s')) print(s1.index('k', 1, 9))
运行结果
-
2.文本位置改变
语法 举例 改变的字符串.center(添加的字符个数,添加的字符) name = ‘tony’ print(name.center(30, ‘-’)) 改变的字符串.ljust(添加的字符个数,添加的字符) name = ‘tony’ print(name.ljust(30, ‘*’)) 改变的字符串.rjust(添加的字符个数,添加的字符) name = ‘tony’ print(name.rjust(30, ‘$’)) 改变的字符串.zfill(添加的字符个数,添加的字符) name = ‘tony’ print(name.zfill(50)) 用法举例
name = 'tony' print(name.center(30, '-')) print(name.ljust(30, '*')) print(name.rjust(30, '$')) print(name.zfill(50))
运行结果
-
3.特殊符号:斜杠与一些英文字母的组合会产生特殊的含义
样式 含义 \n 表示换行符,换到下一行的开头。 \a 特殊符号,占位符 \t 表示制表符,将光标移到下一个制表符的位置,就像在文档中用tab键一样 用法举例
print('ja\tson\nke\avin') ''' 结果 ja son kevin '''
-
4 captalize:首字母大写
用法举例
message = 'hello everyone nice to meet you!' message.capitalize() # Hello everyone nice to meet you!
运行结果
-
5.swapcase:大小写翻转
用法举例
message1 = 'Hi girl, I want make friends with you!' message1.swapcase() # hI GIRL, i WANT MAKE FRIENDS WITH YOU!
运行结果
-
6 title:每个单词的首字母大写
用法举例
msg = 'dear my friend i miss you very much' msg.title() # Dear My Friend I Miss You Very Much
列表内置方法
-
1.类型转换
用法举例
print(list(11)) # 不行 print(list(11.11)) # 不行 print(list('jason')) # ['j', 'a', 's', 'o', 'n'] print(list({'name': 'jason', 'pwd': 123})) # ['name', 'pwd'] print(list((11,22,33,44,55))) # [11, 22, 33, 44, 55] print(list({1, 2, 3, 4, 5})) # [1, 2, 3, 4, 5] print(list(True)) # 不行
list可以转换支持for循环的数据类型
-
2.索引取值
用法举例
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry'] print(name_list[0]) # jason print(name_list[-1]) # jerry
-
3.切片操作
用法举例
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry'] print(name_list[1:4]) # ['kevin', 'tony', 'tom'] print(name_list[-4:-1]) # ['kevin', 'tony', 'tom']
-
4.步长
用法举例
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry'] print(name_list[0:4:1]) # ['jason', 'kevin', 'tony', 'tom'] print(name_list[0:4:2]) # ['jason', 'tony'] print(name_list[-1:-4:-1]) # ['jerry', 'tom', 'tony']
-
5.统计列表中元素的个数
用法举例
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry'] print(len(name_list)) # 5
-
6.成员运算 最小判断单位是元素不是元素里面的单个字符
用法举例
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry'] print('j' in name_list) # False print('jason' in name_list) # True
-
7.列表添加元素的方式
方式 例子 添加的列表.append(‘元素’) # 尾部追加’单个’元素 name_list.append(‘小李’) 被添加的列表.insert(位置, 元素) # 指定位置插入’单个’元素 name_list.insert(0, 123) 列表1.extend(列表2) # 合并列表 name_list.extend([11, 22, 33, 44, 55]) 用法举例
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry'] # 尾部追加'单个'元素 name_list.append('小李') print(name_list) name_list.append([11, 22, 33, 44]) print(name_list) # 指定位置插入'单个'元素 name_list.insert(0, 123) name_list.insert(2, '可不可以插个队') name_list.insert(1, [11, 22, 33]) print(name_list) # 合并列表 name_list.extend([11, 22, 33, 44, 55]) print(name_list)
运行结果
extend其实可以看成是for循环+append
-
8.删除元素
方式 语法 通用的删除方式 del 列表[位置] 就地删除 指名道姓的直接删除某个元素 列表.remove(要删除的元素) 延迟删除 列表.pop(指定索引值) 默认删除尾部 用法举例
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry'] # 通用的删除方式 del name_list[0] print(name_list) # 就地删除 print(name_list.remove('jerry')) print(name_list) # 延迟删除 print(name_list.pop()) print(name_list)
运行结果
-
9.修改列表元素
用法举例
name_list = ['jason', 'kevin', 'tony', 'jerry'] print(id(name_list[0])) name_list[0] = 'tom' print(id(name_list[0])) print(name_list)
运行结果
-
10.排序
用法举例
ss = [44, 77, 99, 11, 22, 33, 88, 66] ss.sort() # 默认是升序 print(ss) # [11, 22, 33, 44, 66, 77, 88, 99] ss.sort(reverse=True) # 可以修改尾降序 print(ss) # [99, 88, 77, 66, 44, 33, 22, 11]
运行结果
-
11.翻转
用法举例
ss = [44, 77, 99, 11, 22, 33, 88, 66] ss.reverse() # 前后颠倒 print(ss)
运行结果
-
12.比较运算
用法举例
s1 = [11, 22, 33] s2 = [1, 2, 3, 4, 5, 6, 7, 8] print(s1 > s2) # True s1 = ['A', 'B', 'C'] # A>>>65 s2 = ['a'] # a>>>97 print(s1 > s2) # False
运行结果
列表在做比较的时候 其实比的是对应索引位置上的元素
-
13.统计列表中某个元素出现的次数
用法举例
l1 = [11, 22, 22, 11, 22, 11, 22, 33, 44, 55, 44, 33] print(l1.count(11)) # 统计元素11出现的次数
运行结果
- 14.清空列表
用法举例
l1 = [11, 22, 22, 11, 22, 11, 22, 33, 44, 55, 44, 33] l1.clear() # 清空列表 print(l1)
运行结果
可变类型与不可变类型
初学python的时候,可能会有很多疑惑,尤其是最先接触的所谓的“可变数据类型”和“不可变数据类型”。python与C/C++不一样,它的变量使用有自己的特点。 首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。
- 不可变数据类型分析
>>> x = 1
>>> id(x)
31106520
>>> y = 1
>>> id(y)
31106520
>>> x = 2
>>> id(x)
31106508
>>> y = 2
>>> id(y)
31106508
>>> z = y
>>> id(z)
31106508
>>> x += 2
>>> id(x)
31106484
上面这段程序都是对不可变数据类型中的int类型的操作,id()查看的是当前变量的地址值。我们先来看x = 1和y = 1两个操作的结果,从上面的输出可以看到x和y在此时的地址值是一样的,也就是说x和y其实是引用了同一个对象,即1,也就是说内存中对于1只占用了一个地址,而不管有多少个引用指向了它,都只有一个地址值,只是有一个引用计数会记录指向这个地址的引用到底有几个而已。当我们进行x = 2赋值时,发现x的地址值变了,虽然还是x这个引用,但是其地址值却变化了,后面的y = 2以及z = y,使得x、y和z都引用了同一个对象,即2,所以地址值都是一样的。当x和y都被赋值2后,1这个对象已经没有引用指向它了,所以1这个对象占用的内存,即31106520地址要被“垃圾回收”,即1这个对象在内存中已经不存在了。最后,x进行了加2的操作,所以创建了新的对象4,x引用了这个新的对象,而不再引用2这个对象。
- 可变数据类型分析
>>> a = [1, 2, 3]
>>> id(a)
41568816
>>> a = [1, 2, 3]
>>> id(a)
41575088
>>> a.append(4)
>>> id(a)
41575088
>>> a += [2]
>>> id(a)
41575088
>>> a
[1, 2, 3, 4, 2]
从上面的程序中可以看出,进行两次a = [1, 2, 3]操作,两次a引用的地址值是不同的,也就是说其实创建了两个不同的对象,这一点明显不同于不可变数据类型,所以对于可变数据类型来说,具有同样值的对象是不同的对象,即在内存中保存了多个同样值的对象,地址值不同。接着来看后面的操作,我们对列表进行添加操作,分别a.append(4)和a += [2],发现这两个操作使得a引用的对象值变成了上面的最终结果,但是a引用的地址依旧是41575088,也就是说对a进行的操作不会改变a引用的地址值,只是在地址后面又扩充了新的地址,改变了地址里面存放的值,所以可变数据类型的意思就是说对一个变量进行操作时,其值是可变的,值的变化并不会引起新建对象,即地址是不会变的,只是地址中的内容变化了或者地址得到了扩充。
总结
可变类型与不可变类型:
可变类型 列表
值改变 内存地址不变 修改的是本身
不可变类型 字符串
值改变 内存地址肯定遍 修改过程产生了新的值
队列与堆栈
队列
先进先出
eg:超市排队结账 符合队列的特征
堆栈
先进后出
eg:叠衣服 符合堆栈的特征
# 使用列表模拟出队列与堆栈的特征
# 队列
new_list = []
# 先进
new_list.append(111)
new_list.append(222)
new_list.append(333)
# 先出
for i in new_list:
print(i)
print(new_list.pop(0))
print(new_list.pop(0))
print(new_list.pop(0))
# 堆栈
new_list = []
# 先进
new_list.append(111)
new_list.append(222)
new_list.append(333)
# 后出
print(new_list.pop())
print(new_list.pop())
print(new_list.pop())
队列运行结果
堆栈运行结果
今日学习时间:
这里统计计划学习的时间
1、 上午8:30~12:30
2、 下午2:30~5:30
3、 晚上6:30~9:30
今日学习产出:
这里统计学习计划的总量
- 1、 技术笔记 1遍
- 2、CSDN 技术博客 1篇
- 3、每日录音
- 4、课后作业
1.将登录功能编写成多用户模式
2.利用列表编写一个用户注册、登录程序
提示:循环
要求:成功一次即可 无需考虑用户冲突等情况
3.不使用count统计列表中指定元素出现的次数
data = ‘jason|123’
is_tag = True
count = 1
source_data = ['jason|123', 'tony|123', 'kevin|321', 'jerry|222']
while is_tag:
# 三次错误后提示,以及询问是否需要重新注册
if count == 4:
ask = input('您已经尝试了三次 是否继续(y/n) 或者您是否需要重新注册一个账号(z)>>>:')
if ask == 'y':
count = 1
# 注册功能实现
elif ask == 'z':
username01 = input('请输入您的用户名>>>:').strip()
# 判断用户输入是否为空
if len(username01) == 0:
print('用户名不能为空')
continue
password01 = input('请输入您的密码>>>:').strip()
# 判断用户输入是否为空
if len(password01) == 0:
print('密码不能为空')
continue
print(f'您的用户名:{username01},密码:{password01}')
# 格式化用户输入的用户名和密码,并存入列表‘source_data’
count02 = username01 + '|' + password01
source_data.append(count02)
count = 1
else:
print('拜拜了您嘞!!')
break
# 提示用户输入,以及询问是否需要注册
username = input('请输入您的用户名[您是否需要注册用户名和密码(y)]>>>').strip()
# 判断用户输入是否为空
if len(username) == 0:
print('用户名不能为空')
continue
# 注册功能实现
if username == 'y':
username = input('请输入您的用户名>>>:').strip()
# 判断用户输入是否为空
if len(username) == 0:
print('用户名不能为空')
continue
password = input('请输入您的密码>>>:').strip()
# 判断用户输入是否为空
if len(password) == 0:
print('密码不能为空')
continue
# 格式化用户输入的用户名和密码,并存入列表‘source_data’
print(f'您的用户名:{username},密码:{password}')
count02 = username + '|' + password
source_data.append(count02)
continue
password = input('请输入您的密码>>>:').strip()
# 判断用户输入是否为空
if len(password) == 0:
print('密码不能为空')
continue
# 格式化用户输入的用户名和密码,用成员运算判断该用户名和密码是否正确
count01 = username + '|' + password
if count01 in source_data:
print('登录成功')
# 用户指令功能实现
while is_tag:
cmd = input('输入您的指令>>>:').strip()
print(f'正在执行您输入的命令({cmd})....')
if cmd == 'byb':
print('下次再见!')
is_tag = False
else:
print('用户名或密码错误!')
count += 1