Python 极简教程(八)字符串 str
由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍。
对于字符串,前面在数据类型中已经提到过。但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作。而我们在实际编码过程中,又经常会与字符串打交道。所以这里字符串单独列出一节来讲解。
字符串是由一对引号(单双引号都可以)括起来进行标识。字符串的数据类型是 str
, 同时字符串也是一种序列。
定义一个字符串:
>>> s = 'nemo'
>>> s1 = '中文'
>>> s2 = "Python 极简教程"
>>> s3 = ''' # 多行字符串,用三对引号(三个单引号或者三个双引号)
Python 极简教程
希望大家多提意见
顺便点个喜欢
'''
字符串操作
字符串的操作有很多与列表类似,因为字符串和列表同样都是序列。
1. 字符串相加(拼接)
>>> s = '懒猫'
>>> s1 = 'nemo'
>>> s + s1
'懒猫nemo'
2. 字符串乘法
>>> s = 'nemo'
>>> s * 3
'nemonemonemo'
3. 成员运算
>>> ms = 'n'
>>> s = 'nemo'
>>> ms in s
True
>>> 'x' in s
False
>>> 'x' not in s
True
# 也可以判断连续字符串
>>> 'em' in s
True
4. 通过索引取字符
字符串通过索引取字符的方式与列表中的取值相同。字符串中的每个字符相当于字符串的每个元素,索引从0开始。
>>> s = 'nemo'
>>> s[1]
'e'
格式化字符串
1. 使用 % 格式化
格式化字符串,本义是在打印的时候可以将打印出来的字符串格式化后输出(控制台,也就是打印语句的输出),这样字符串看起来更加整洁美观。
但是实际编码过程中,很少直接通过控制台输出,所以更多的时候,格式化字符串用来将字符串中的部分字符串用参数代替。
例如,从键盘接收两个输入,分别是姓名和爱好,然后输出* x 的爱好是 y *(x 用输入的姓名代替,y 用输入的爱好代替)
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('%s 的爱好是 %s !' % (name, fondness))
以上代码,用 IDLE 新建一个文件,运行效果更好。
'%s 的爱好是 %s !' % (name, fondness)
上面的
%s 的爱好是 %s !
就是格式化字符串,%
为占位符,s
表示占位的数据格式为字符串。
引号后面的%
为固定格式
(name, fondness) 是实际的参数,需要和前面的 % 数量一致,数量不一致就会报错。如果只有一个 % 就不需要括号
# 只有一个参数的情况
>>> name = 'nemo'
>>> '你的名字是 %s!' % name
'你的名字是 nemo!'
# 还可以先存起来,后面再赋值
>>> s = '你的名字是 %s!'
>>> s % 'nemo'
'你的名字是 nemo!'
其他还有很多格式化的用法,因为实际使用比较少,这里就不再赘述。有兴趣的可以查阅相关资料。
2. 使用 format 函数
format 函数是 Python 官方目前主推的格式化用法。但是同样我们实际很少需要在控制台上输出,因此主要还是用它来进行字符串内部字符的参数化。
format 函数的占位符为 {},可以是空的 {},后面实际赋值的时候按照 {} 出现的顺序依次赋值。也可以在 {} 中加上索引,如{0},{1}等,0 代表后面的第一个实际值,1为第二个,依次类推。还可以在 {} 中加上名称, 如 {name}, {fondness},那么会以该名称赋值。
示例如下:
# 以三种方式修改上面的例子
#1. 空的 {} 占位
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{} 的爱好是 {}!'.format(name, fondness)) # 写法上注意一下 字符串.format()
#2. 加上索引
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{1} 的爱好是 {0}!'.format(fondness, name)) # 故意更换了一下位置,对比一下
#3. 加上名称
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{n} 的爱好是 {f}!'.format(f=fondness, n=name)) # 前面 {} 加了名字,在后面就写成 名称=值(变量)
上面的例子,故意调整了一下顺序和名称,自己动手练练,感受一下。
3. f 字符串
f-string
是 Python 3.6 中定义的一种参数化字符串的方式,主要是让格式化字符串更加便捷。
在 f-string
中,不要再使用 %-格式化 或者 format 函数中的复杂写法,可以直接在字符串中写入变量名。f-string
用 {} 标识变量,区别在于 {} 不再是用来占位的,而是直接写入变量名。
修改上面的格式化例子:
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print(f'{name} 的爱好是 {fondness}!') # 字符串前面的 f 大小写均可
除此之外,还可以在f-string
中使用函数和表达式:
# 显示当前时间
>>> import time # 引入时间库
>>> print(f'当前时间是 {time.ctime()}!') # time.ctime() 为显示当前时间的函数
当前时间是 Tue Mar 19 23:30:49 2019!
# 直接在字符串中进行运算
>>> x = 10
>>> y = 5
>>> F'x + y = {x+y}'
'x + y = 15'
可谓非常方便实用,而且据说速度优于其他的格式化方式。
r 字符串
字符串中如果出现 反斜杠 \
会出现一些不同的意思,比如\n
表示换行,\t
制表符(Tab)等等,如果你想表示一个 Windows 路径的时候,比如C:\test\nemo
,那么实际打印的时候会变成如下的样式:
>>> path = 'C:\test\nemo.txt'
>>> print(path)
C: est
emo.txt
如果是操作文件的时候,就会出现各种异常。因此为了避免其中的特殊字符造成字符串不是原来的意思,我们可以使用 r
(大小写都可以)来将字符串中的特殊字符全部定义为普通字符。
>>> path = r'C:\test\nemo' # r 写在字符串第一个引号前面
>>> print(path)
C:\test\nemo
字符串常用内置方法
以下仅列出较为常用的内置方法,其余方法请参考其他资料。(写太多不常用的内容,就称不上极简教程了)
注意:其中部分极少使用的默认参数也已去掉
下面这些方法非常常用,需要背下来,就算不能背下来,至少要知道有这些方法。
方法 | 说明 |
---|---|
str.strip() | 删除字符串前后空格 |
str.replace(old, new) | 把将字符串中的 old 替换成 new |
str.join(seq) | 以指定字符串作为分隔符,将 seq 中所有的元素合并为一个新的字符串 |
str.split(obj) | 以 obj 为分隔符切割字符串,生成一个列表 |
str.find(obj) | 检测 obj 是否包含在字符串中 str中,如果是返回开始的索引值,否则返回-1 |
str.index(obj) | 跟find()方法一样,只不过如果str不在字符串中会报一个异常 |
string.startswith(obj) | 检查字符串是否是以 obj 开头。是则返回 True,否则返回 False |
string.endswith(obj) | 检查字符串是否以 obj 结束。如果是,返回 True,否则返回 False |
string.upper() | 转换 string 中的小写字母为大写 |
string.lower() | 转换 string 中所有大写字符为小写 |
1. str.strip() 去前后空格
我们在进行登录的时候,偶尔手抖在账号前或后输入了一个空格,也能登录成功;有些系统又不行。之所以能登录成功,其实是因为开发人员做了处理,帮你去掉了不小心在账号前后输入的空格。这就是 strip 这个方法的用途。
>>> s = ' nemo ' # 前后有空格
>>> s.strip()
'nemo'
2. str.replace(old, new) 替换
字符串替换,用于将字符串中的某部分内容替换成新的字符串。
# 将下面字符串中的'+'加号,替换成','逗号。
>>> s = 'MP3+pdf+doc+txt'
>>> s.replace('+', ',') # 被替换的字符串在前,替换后的字符串在后
'MP3,pdf,doc,txt'
3. str.join(seq) 字符串组合
字符串组合,是将列表中的字符串元素组合成一个完整的字符串。使用指定的字符串来分隔组合好的字符串。
这个方法是比较容易出错的,组合的字符串在'.'前面,列表是作为参数放在括号中。
# 比如列表中有多个单词,想组成一句话
>>> words= ['it', 'was', 'the', 'season', 'of', 'Light']
>>> ' '.join(words) # 用空格分隔,空格要放在前面
'it was the season of Light'
# 小练习 1
>>> li = ['a', 'b', 'c'] # 组合成 a_b_c
>>> face = ['*', '_', '*'] # 组合成 *_*
注意,列表中必须全部是字符串,如果存在其他数据类型则会报错。
4. str.split(obj) 切割字符串
以传入的obj 为分隔符切割字符串,生成一个列表。七号和上面的 join 方法是反过来的。
比如:
# 将下面的英文句子拆分为单个的英文的单词
>>> s = 'this is a pig'
>>> s.split() # 默认按空格进行拆分
['this', 'is', 'a', 'pig'] # 拆出后的结果是一个列表
# csv文件是以逗号分隔的一种文件格式。将下面以逗号分隔的内容拆分成一个列表
>>> s = '张三,男,30,170'
>>> s.split(',') # 按逗号拆分,括号中把逗号作为字符串传入
['张三', '男', '30', '170']
# 小练习 2
# 1. 从键盘接收一组数字输入,数字以逗号分隔。返回这一组数字中的最大最小值
# 2. 从键盘接收一组数字,数字以空格分隔。反向后输出
5. 字符串查找
str.find(obj)
从左边开始查找整个字符串,返回找到匹配的字符的起始位置索引。如果找不到则返回 -1。
>>> s = 'it was the season of Darkness'
# 找到其中 of 所在的索引
>>> s.find('of') # 找到则返回 of 开始的索引值
18
>>> s.find('nemo') # 找不到返回 -1
-1
str.index(obj)
查找的结果与 find 方法一样。不同的是,找不到的时候,会报错。
>>> s = 'it was the season of Darkness'
# 找到其中 of 所在的索引
>>> s.index('of')
18
>>> s.index('nemo')
ValueError: substring not found # 报子串不存在的错误
6. 字符串判断
用于判断字符串是否以什么开头或者以什么结尾。
str.startswith(obj)
检查字符串是否是以指定的obj字符串开头。是则返回 True,否则返回 False
>>> s = 'it was the season of Darkness'
>>> s.startswith('it') # 注意 startswith,start 后面有个 s,starts
True
>>> s.startswith('ness')
False
str.endswith(obj)
检查字符串是否是以指定的obj字符串结尾。是则返回 True,否则返回 False
>>> s = 'it was the season of Darkness'
>>> s.endswith('ness') # 注意 endswith,end 后面也有个s
True
>>> s.endswith('it')
False
7. 大小写转换
string.upper()
把字符串中的小写字母全部转换成大写字母。
>>> s = 'nEmO'
>>> s.upper()
'NEMO'
str.lower()
把字符串中的大写字母全部转换成小写字母。
>>> s = 'nEmO'
>>> s.lower()
'nemo'
# 小练习 3
# s = 'NemO'
# s == 'nemo' 改造这个等式,使之返回 True
小练习答案:
# 小练习 1
>>> li = ['a', 'b', 'c'] # 组合成 a_b_c
>>> '_'.join(li)
>>> face = ['*', '_', '*'] # 组合成 *_*
>>> ''.join(face)
# 小练习 2
# 1. 从键盘接收一组单词,以逗号分隔。返回这一组单词中的最大最小值
>>> s = input('请输入一组单词,以逗号分隔:')
请输入一组单词,以逗号分隔:nemo,leo,nano,aux
>>> li = s.split(',')
>>> max(li)
'nemo'
>>> min(li)
'aux'
# 2. 从键盘接收一组数字,数字以空格分隔。将顺序反向后输出
>>> s = input('请输入一组数字,以空格分隔:')
请输入一组数字,以空格分隔:31 25 14 8 11
>>> li = s.split()
>>> li.reverse()
>>> ' '.join(li)
'11 8 14 25 31'
# 小练习 3
# s = 'NemO'
# s == 'nemo' 改造这个等式,使之返回 True
>>> s.lower() == 'nemo' # 这也是实现字符串忽略大小写的写法
>>> s == 'nemo'.upper()
Python 极简教程(八)字符串 str的更多相关文章
- python极简教程04:进程和线程
测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...
- python极简教程01:基础变量
测试奇谭,BUG不见. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的教程,他们同大多数自学编程语言的人一样,无外乎遇到以下这些问题: 网络上的资料过多且良莠不全,不知道如 ...
- Python 极简教程(三)数据类型
每种语言都有各种数据类型.这就像在现实生活中,我们计数的时候需要用到数字,在表述金额.重量.距离等需要精确计数时用到小数,在日常交谈中要用文字,等等.在计算机语言中,为了表述不同的情况,也需要用到各种 ...
- Python 极简教程(七)列表 list
由于列表过于重要,请认真看完并保证所有代码都敲过一遍. 什么是列表 列表是 Python 中最常用的数据结构,也是一种数据类型,其样式如下: li = [1, 2, 3, 'a', 'b'] 列表是一 ...
- Python 极简教程(一)前言
现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...
- Python 极简教程(十二)逻辑控制语句 if else
计算机软件之所以能够对不同的情况进行不同的处理,就是我们在编码的时候,通过逻辑控制语句,告诉软件在不同的情况下应该做什么处理. 比如我们在登录的时候,那么当你输入正确的账号密码和错误的账号密码,完全是 ...
- Python 极简教程(十一)字典 dict
字典是以大括号标识,以键值对(key:value)的形式,无序,不可重复,可变的集合类型. 字典具有非常高效的读写效率. >>> d = {} # 创建一个空字典 >>& ...
- Python 极简教程(六)运算符
运算符,我们日常生活中使用的加减乘除,都是运算符的一种.当然这种一般我们称为算术运算符,用于处理数字运算的. 但是在计算机语言中,还有很多的运算符.用于处理不用的情况. 主要有以下几类: 算术运算符 ...
- Python 极简教程(十)集合 set
什么是集合? 集合(set)是一种可变,无序和不重复的序列. 集合是python的序列之一,集合没有列表(list).元组(tuple)和字典(ditc)常见.但是有时候也有奇效. 我们先来看个集合的 ...
随机推荐
- Important Abstractions and Data Structures
For Developers > Coding Style > Important Abstractions and Data Structures 目录 1 TaskRunne ...
- 在 Snoop 中使用 PowerShell 脚本进行更高级的 UI 调试
原文:在 Snoop 中使用 PowerShell 脚本进行更高级的 UI 调试 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.欢迎转载.使用.重新发布, ...
- 【 Codeforces Round #425 (Div. 2) D】Misha, Grisha and Underground
[Link]:http://codeforces.com/contest/832/problem/D [Description] 给你一棵树; 然后给你3个点 让你把这3个点和点s,t,f对应; 然后 ...
- [Zabbix] 怎样实现邮件报警通知以及免费短信报警通知
前提条件: (1) zabbixserver端已经安装成功而且执行. (2) zabbixclient已经成功建立而且执行. 1 下载而且安装msmtp软件 Wget http://sourcefo ...
- POJ 3174 暴力枚举
思路: 暴力枚举三个点 判一判 搞定 (x1*y1=x2*y2) x1.y1.x2.y2为他们两两的差 //By SiriusRen #include <cstdio> using nam ...
- 5个jvm命令
本文是Neward & Associates的总裁Ted Neward为developerworks独家撰稿“你不知道5个……”系列中的一篇,JVM是多数开发人员视为理所当然的Java功能和性 ...
- jdbc的数据库驱动类DriverManager.getConnection()详解
1.Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); ...
- sparksql不支持hive中的分区名称大写
但是在hive中查询是可以的. 后来经过一点一点测试发现,原来分区名称不能是大写,必须小写才行.
- 洛谷——P1137 旅行计划
https://www.luogu.org/problem/show?pid=1137 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出 ...
- CDN服务上线,DNSPOD布局云端生态圈
爱因斯坦曾说过,我从不去想未来,由于它来得已经够快的了.是的,随着互联网的高速发展,我们的生活节奏越来越快,可是人们的耐心却像鞋底一样越磨越薄. 遥控器按一下,鼠标点一下,仅仅要认为没意思或者等待时间 ...