目录:
1、了解字符串
2、字符串切片
3、字符串中的查找方法
4、字符串的修改方法
5、字符串的判断方法
6、初识列表
7、列表的相关操作
8、列表的循环与嵌套
本期内容信息量很大,小伙伴们可以先收藏,方便随时回看哦~
字符串是 Python 中最常用的数据类型。我们一般使用引号来创建字符串。创建字符串很简单,只要为变量分配一个值即可。
str1 = 'abcdefg'str2 = 'hello world'print(type(str1))print(type(str2))
a = """hihellohello worl"""b = '''hihellohello world'''print(a)print('-' * 20)print(b)
使用单引号情况
str1 = 'I'm Tom'print(str1)
出现以上问题的主要原因在于,以上字符串的定义代码出现了(syntax)语法错误。单引号在字符串定义中必须成对出现,而且Python解析器在解析代码时,会自动认为第一个单引号和最近的一个单引号是一对!
如果一定要在单引号中再放入一个单引号,必须使用反斜杠(\)进行转义。
代码修改:
str1 = 'I\'m Tom'print(str1)
使用双引号情况
在Python代码中,我们可以使用 input()方法来接收用户的输入信息。
记住:在Python中,input()方法返回的结果是一个字符串类型 的数据。
name = input('请输入您的名字:')age = input('请输入您的年龄:')address = input('请输入您的地址:')print(type(age))print(name, age, address)
print(变量名称)print(变量名称1, 变量名称2, 变量名称3)
① 百分号(Python2和Python3)
name = input('请输入您的姓名:')age = input('请输入您的年龄:')address = input('请输入您的住址:')print('我的名字是%s, 今年%d岁了, 家里住在%s...' % (name, int(age), address))
③ f形式(Python3)
name = input('请输入您的姓名:')age = input('请输入您的年龄:')address = input('请输入您的住址:')print(f'我的名字是{name},今年{age}岁了,家里住在{address}...')
延伸:
name = input('请输入您购买的商品的名称:')price = float(input('请输入您购买的商品的价格:'))price(f'购买的商品名称:{name},商品价格:{price:.2f}') # {price:.2f}是保留两位小数
在计算机中,Python中的字符串属于序列结构。所以其底层存储占用一段连续的内存空间。
结构原理图
索引下标 ,就是编号。比如火车座位号,座位号的作用:按照编号快速找到对应的座位。
同理,下标的作用即是通过下标快速找到对应的数据。
举个例子:
name = 'abcdef'# 快速获取字母aprint(name[0]) # a# 快速获取字母aprint(name[3]) # d# 获取索引下标最大值print(name[5])
所谓的切片是指对操作的对象截取其中一部分的操作。
字符串、列表、元组都支持切片操作。
顾头不顾尾:
① 不包含结束位置下标对应的数据, 正负整数均可;
② 步长是选取间隔,正负整数均可,正数从左向右,负数从右向左。默认步长为1。
如果想对numstr字符串进行切片,如下图所示:
记口诀:切片其实很简单,只顾头来尾不管,步长为正正向移,步长为负则逆向移
如果还是有点不太清楚这个原理,建议大家对字符串进行画图。
str1 = '0123456789'# 1、从2到5开始切片,步长为1print(str1[2:5:1]) # 234print(str1[2:5]) # 234# 2、只有结尾的字符串切片:代表从索引为0开始,截取到结尾字符的位置print(str1[:5]) # 01234# 3、只有开头的字符串切片:代表从起始位置开始,已知截取到字符串的结尾print(str1[1:]) # 123456789# 4、获取或拷贝整个字符串print(str1[:]) # 0123456789# 5、调整步阶:类似求偶数print(str1[::2]) # 02468# 6、把步阶设置为负整数:类似字符串翻转print(str1[::-1]) # 9876543210# 7、起始位置与结束位置都是负数(遵循一个原则:必须是从左向右截取)print(str1[-4:-1]) # 678# 8、结束字符为负数,如截取012345678print(str1[:-1]) # 012345678
name = "abcdefq"print(name[2:5:1]) # cdeprint(name[2:5]) # cdeprint(name[:5]) # abcdeprint(name[1:]) # bcdefgprint(name[:]) # abcdefgprint(name[::2]) # acegprint(name[:-1]) #abcdef,负1表示倒数第一个数据print(name[-4:-1]) # defprint(name[::-1]) # gfedcba
所谓字符串查找方法即是查找子串在字符串中的位置或出现的次数
基本语法:
作用:检测某个子串是否包含在这个字符串中,如果在返回这个字串开始的位置下标,否则则返回-1。
str1 = 'hello world hello ooaac hello python'# 查找linux子串是否出现在字符串中print(str1.find('ooaac'))# 在str1中查找不存在的子串print(str1.find('and'))
使用input方法输入任意一个文件名称,求点号的索引下标
filename = input('请输入您要上传文件的名称:')# 获取点号的索引下标index = filename.find('.')print(index)# 求文件名称print(f'文件名称为:{filename[:index]}')# 求文件后缀print(f'文件后缀:{filename[index:]}')
index方法其功能与find方法完全一致,唯一的区别在于当要查找的子串没有出现在字符串中时,find()方法返回-1,而index()方法则直接报错
str1 = 'hello world hello ooaac hello python'# 查找linux子串是否出现在字符串中print(str1.index('ooaac'))# 在str1中查找不存在的子串print(str1.index('and'))
字符串序列.rfind(子串)字符串序列.rindex(子串)
强调:rfind()方法与rindex()方法适合于查找子串在字符串中出现了多次的情况
有一个文件名称叫20210310axvu.avatar.png,其中点号出现了2次,这个时候,如果我想获取文件的后缀.png,代码应该如何编写?
filename = '20210310axvu.avatar.png'# 求出点号在字符串中第一次出现的位置index = filename.find('.')print(index)# 求出点号在字符串中最后一次出现的位置index = filename.rfind('.')print(index)
rfind()方法和rindex()返回语法上完全一致,唯一的区别就是对子串没有出现在字符串中的情况,rfind()返回-1,rindex()返回错误。
基本语法:
字符串.count('子串', 开始位置下标, 结束位置下标)
str1 = 'hello world and hello ooaac and hello linux'# 不限定字符串长度ands = str1.count('and')print(f'不限定字符串and出现次数为:{ands}')# 限定字符串长度ands = str1.count('and', 10, 30)print(f'限定字符串and出现次数为:{ands}')
所谓修改字符串,指的就是通过函数(方法)的形式修改字符串中的数据。
基本语法:
字符串.replace(要替换的内容, 替换后的内容, 替换的次数-可以省略)
编写一个字符串,然后把字符串中的linux替换为python
str1 = 'hello linux and hello ooaac'# 把字符串中所有hello字符替换为hiprint(str1.replace('hello', 'hi'))# 把字符串中的第一个hello进行替换为hiprint(str1.replace('hello', 'hi', 1))# 把and字符串替换为&&print(str1.replace('and', '&&'))
目前在工作中,replace主要用于实现关键字替换或过滤功能。如:北京 ===>BJ,论坛关键字过滤,共产党 ==> ***
作用:对字符串进行切割操作,返回一个list()列表类型的数据
# 定义一个要切割的字符串str1 = 'www-ooaac-com'# 使用split()方法进行切割print(str1.split('-'))
str1 = 'myName'# 把str1变成首字母大写字符串print(str1.capitalize())
注意:capitalize()函数转换后,只字符串第一个字符大写,其他的字符全部小写。
作用:把字符串中的所有单词的首字母大写,组成大驼峰
str1 = 'studentmanager'# 把str1变成大驼峰print(str1.title())str2 = 'student-manager'# 把str2变成大驼峰print(str2.title())str3 = 'student-manager'# 把str3变成大驼峰后替换掉-print(str3.title().replace('-', ''))
upper():把字符串全部转换为大写形式lower():把字符串全部转换为小写形式
# 用户名以及密码验证案例username = input('请输入您的账号:')password = input('请输入您的密码:')# 把username和password全部转换为大写或小写print(username.lower())print(password.upper())
也可以写成:
username = input('请输入您的账号:').lower()password = input('请输入您的密码:').upper()print(username)print(password)
(6)strip()、lstrip()与rstrip()
strip()方法主要作用:删除字符串两边空白字符(如空格)Istrip()方法 == left+strip,作用:只删除字符串左边的空白字符rstrip() 方法,作用:只删除字符串右边的空白字符
# 用户名验证案例username = input('请输入您的用户名:')# 去除username两边的空白字符print(len(username)) # len() 统计字符串有多少字符print(username.strip())print(len(username.strip()))
(7)ljust()、rjust()、center()
基本语法:
定义一个字符串,要求返回长度10个字符,不足的使用.点号进行填充。
str1 = 'ooaac'# 左对齐print(str1.ljust(10, '.'))# 右对齐print(str1.rjust(10, '.'))# 居中对齐print(str1.center(10, '.'))
所谓判断即是判断真假,返回的结果是布尔数据类型:True 或 False
作用:检查字符串是否是以指定子串开头,是则返回True,否则返回False。如果设置开始和结束位置下标,则在指定范围内检查。
str1 = 'python program'print(str1.startswith('python'))
作用:检查字符串是否以指定子串结尾,是则返回True,否则返回False。如果设置开始和结束位置下标,则在指定范围内检查。
str2 = 'python.png'print(str2.endswith('.png'))if str2.endswith('.png') or str2.endswith('.jpg') or str2.endswith('.gif'): print(f'{str2}是一张图片格式的图片')else: print(f'您上传的文件格式异常')
作用:如果字符串所有字符(至少有一个字符)都是字母则返回True,否则返回False
str1 = 'admin'str2 = 'admin888'print(str1.isalpha())print(str2.isalpha())
作用:如果字符串只包含数字则返回True,否则返回False
password = input('请输入您的银行卡密码:')if len(password) == 6and password.isdigit(): print('输入密码成功,正在验证...')else: print('密码输入错误,请重新输入')
作用:Python isalnum()方法检测字符串是否由字母和数字组成。如果字符串所有字符(至少由一个字符)都是字母或数字则返回True,否则返回False。
username = input('请输入您的用户名(只能包含数字和字母):')if username.isalnum(): print('合理的用户名,正在录入系统...')else: print('输入的用户名有误,请重新输入...')
作用:如果字符串中只包含空白,则返回True,否则返回False(逆向思维)
str1 = ' ' # 最少要包含一个空白字符print(str1.isspace())username = input('请输入您的用户名:')if len(username) == 0or username.isspace(): print('您没有输入任何字符...')else: print(f'您输入的字符{username}')
思考:有一个人的姓名(TOM)怎么书写存储程序?
答:变量。
思考:如果一个班级100位学生,每个人的姓名都要存储,应该如何书写程序?声明100个变量吗?
答:No,我们使用列表就可以了,列表一次可以存储多个数据。
在Python中,我们把这种数据类型称之为列表。
但是在其他的编程语言中,如Java、PHP、Go等等中其被称之为数组。
列表序列名称 = [列表中的元素1, 列表中的元素2, 列表中的元素3, ...]
定义一个列表,用于保存苹果、香蕉以及菠萝
list1 = ['apple', 'banana', 'pineapple']# list列表类型支持直接打印print(list1)#打印列表的数据类型print(type(list1))
注意:列表可以一次存储多个数据且可以为不同的数据类型。
列表的作用是一次性存储多个数据,程序员可以对这些数据进行的操作有:增、删、改、查
列表在计算机中的底层存储形式,列表和字符串一样,在计算机内存中都占用一段连续的内存地址,我们想访问列表中的每个元素,都可以通过“索引下标”的方式进行获取。
如果我们想获取列表中的某个元素,非常简单,直接使用索引下标。
list1 = ['apple', 'banana', 'pineapple']# 获取列表中的bananaprint(list1[1])
# 1、查找某个元素在列表中出现的位置(索引下标)list1 = ['apple', 'banana', 'pineapple']print(list1.index('apple')) # 0# print(list1.index('peach')) # 查询元素不存在时,会报错# 2、count()方法:统计元素在列表中出现的次数list2 = ['刘备', '张飞', '关羽', '刘备', '刘备', '关羽', '张飞']print(list2.count('刘备')) # 3# 3、in方法和not in方法(黑名单系统)list3 = ['192.168.1.15', '10.1.1.100', '172.35.46.128']if'10.1.1.100' in list3: print('黑名单IP,禁止访问')else: print('正常ip,可以访问')
names = ['孙悟空', '唐僧', '猪八戒']# 在列表尾部追加一个元素“沙僧”names.append('沙僧')print(names)
注意:列表追加数据的时候直接在原列表里面追加了指定数据,即修改了原列表列表为可变类型数据。
列表结尾追加数据,如果数据是一个序列,则将这个序列的数据逐一添加到列表
names = ['孙悟空', '唐僧', '猪八戒']# 1、使用extend方法追加元素"沙僧"names.extend('沙僧')print(names)# 2、建议:使用extend方法两个列表进行合并list1 = ['孙悟空', '唐僧', '猪八戒']list2 = ['沙僧', '黄袍怪']list1.extend(list2)print(list1)
总结:extend方法比较适合于两个列表进行元素的合并操作
names = ['孙悟空', '猪八戒']# 在孙悟空和猪八戒之间,插入一个新元素“沙僧”names.insert(1, '沙僧')print(names)
基本语法:
names = ['Tom', 'Rose', 'Jack', 'Jennify']# 删除Rosedel names[1]# 打印列表print(names)
作用:删除指定下标的元素,如果不填写下标,默认删除最后一个。其返回结果:就是删除的这个元素
names = ['Tom', 'Rose', 'Jack', 'Jennify']# 删除最后一个元素del_names = names.pop(3)# 或 不下标默认删除最后一个# del_names = names.pop()print(del_names)print(names)
names = ['Tom', 'Rose', 'Jack', 'Jennify']names.remove('Rose')print(names)
names = ['Tom', 'Rose', 'Jack', 'Jennify']# 清空列表元素names.clear()# 打印列表print(names)
list1 = ['貂蝉', '大乔', '小乔', '八戒']# 修改列表中的“八戒”元素list1[-1] = "西施"print(list1) # 输出结果:['貂蝉', '大乔', '小乔', '西施']list2 = [1, 2, 3, 4, 5, 6]list2.reverse()print(list2) # 输出结果:[6, 5, 4, 3, 2, 1]list3 = [50, 41, 57, 1, 4, 3]list3.sort() # 默认升序(从小到大)# list3.sort(reverse=True) # 降序(从大到小)print(list3) # 输出结果:[1, 3, 4, 41, 50, 57]list4 = list3.copy()print(list4) # 输出结果:[1, 3, 4, 41, 50, 57]
什么事循环遍历?
答:循环遍历就是使用while或for循环对列表中的每个数据进行打印输出
list1 = ['貂蝉', '大乔', '小乔', '八戒']# 定义计数器i = 0# 编写循环条件while i < len(list1): print(list1[i]) # 更新计数器 i += 1
list1 = ['貂蝉', '大乔', '小乔', '八戒']for i in list1: print(i)
列表的嵌套:列表中又有一个列表,我们把这种情况就称之为列表嵌套。
在其他编程语言中,称之为叫做二维数组或多维数组。
要存储班级一、二、三 =>三个班级学生姓名,且每个班级的学生姓名在一个列表。
# classes = ['第一个班级', '第二个班级', '第三个班级']# 一班:['张三', '李四']# 二班:['王五', '赵六']# 三班:['田七', '孙八']# 把班级和学员信息合并在一起,组成一个嵌套列表students = [['张三', '李四'], ['王五', '赵六'], ['田七', '孙八']]# 问题:嵌套后的列表,我们应该如何访问呢?# 访问李四print(students[0][1])# 嵌套列表进行遍历,获取每个班级的学员信息for i in students: print(i)
fruit = 'apple-banana-orange'print(fruit.split('-'))
作用:和split()方法正好相反,其主要功能是把序列拼接为字符串
案例:把水果列表['apple', 'banana', 'orange']拼接成'apple-banana-orange'
fruit = ['apple', 'banana', 'orange']print('-'.join(fruit))