python字符串的进阶

在上一篇文章的 密码破解器 中,我们回顾了循环专题的知识点。

while 循环和 for 循环是 Python 中的两大循环语句,它们都可以实现循环的功能,但在具体使用时略有差别。当循环次数不确定时,我们选用 while 循环;当循环次数确定,需要遍历整个序列的元素时,for 循环则更为合适。

此外,for 循环和 zip() 函数、enumerate() 函数搭配使用能更加灵活的操作序列中的元素。

如果有所遗忘,推荐你回到上节课再加强理解哦。

从本关开始,我们将攻克一个新目标——字符串。各位 Python 练习生们,你们准备好了吗?🎙️

字符串

在 Python 的世界里,字符串是表示文本的数据类型,我们再来回顾一下如何将字符串赋值给变量:

name1 = '小贝'
name2 = "小贝"

Python 中的字符串是使用一对英文单引号(')或英文双引号(")包裹的任意文本。无论是用单引号还是用双引号,它俩的效果都是一样的,但需要保持前后引号的统一。

在之前的课程练习中,我们打印的文字好像都只能在一行,如果我们要打印多行文字时,比如打印一首诗,要怎么办呢?你可能会像下面这样编写代码,然后发现报错了。

poetry = '日暮苍山远,天寒白屋贫。
柴门闻犬吠,风雪夜归人。'
print(poetry)
# 报错:SyntaxError: bad token on line 1

系统在读取第一行代码时,只识别到一个单引号,而无法读取后续的字符串,导致了语法错误。为了避免这个问题,你也可能像下面这样机智地使用多个 print() 函数。

poetry1 = '日暮苍山远,天寒白屋贫。'
poetry2 = '柴门闻犬吠,风雪夜归人。'
print(poetry1)
print(poetry2)
# 输出:
# 日暮苍山远,天寒白屋贫。
# 柴门闻犬吠,风雪夜归人。

问题是解决了,但如果要输出一首莎士比亚的十四行诗《我怎么能够把你来比作夏天》,岂不是要编写 28 行代码,想想就觉得很麻烦。那有没有什么好的办法呢?这个时候,就要用到强大的三引号了。

我们可以像下面这样使用一对三引号(''' 或 """)来包裹多行字符串。三引号包裹的字符串和普通的字符串使用上没有区别,只是三引号支持多行字符串而已。

poetry = '''我怎么能够把你来比作夏天?
你不独比它可爱也比它温婉:
狂风把五月宠爱的嫩蕊作践,
夏天出赁的期限又未免太短:
天上的眼睛有时照得太酷烈,
它那炳耀的金颜又常遭掩蔽:
被机缘或无常的天道所摧折,
没有芳艳不终于凋残或消毁。
但是你的长夏永远不会凋落,
也不会损失你这皎洁的红芳,
或死神夸口你在他影里漂泊,
当你在不朽的诗里与时同长。
只要一天有人类,或人有眼睛,
这诗将长存,并且赐给你生命。'''
print(poetry)
# 输出:
# 我怎么能够把你来比作夏天?
# 你不独比它可爱也比它温婉:
# 狂风把五月宠爱的嫩蕊作践,
# 夏天出赁的期限又未免太短:
# 天上的眼睛有时照得太酷烈,
# 它那炳耀的金颜又常遭掩蔽:
# 被机缘或无常的天道所摧折,
# 没有芳艳不终于凋残或消毁。
# 但是你的长夏永远不会凋落,
# 也不会损失你这皎洁的红芳,
# 或死神夸口你在他影里漂泊,
# 当你在不朽的诗里与时同长。
# 只要一天有人类,或人有眼睛,
# 这诗将长存,并且赐给你生命。

除了使用多行字符串来实现多行文本外,使用 \n 也能达到一样的效果。\n 被称为 换行符,用于文本间的换行。

插入了换行符,其后方的内容将另起一行显示,所以,输出《风雪夜归人》的诗行可以这样实现:

poetry = '日暮苍山远,天寒白屋贫。\n柴门闻犬吠,风雪夜归人。'
print(poetry)
# 输出:
# 日暮苍山远,天寒白屋贫。
# 柴门闻犬吠,风雪夜归人。

拼接字符串

我们都知道通过 + 可以将两个字符串拼接,得到一个新的字符串。

first_name = '史蒂夫'
last_name = '乔布斯'
# 使用 + 拼接字符串
full_name = first_name + '·' + last_name
print(full_name)
# 输出:史蒂夫·乔布斯

当我们把同一个字符串重复很多次的时候,我们可以使用多个 + 拼接,像下面这样:

str1 = '海草'
str2 = str1 + str1 + str1
print(str2)
# 输出:海草海草海草

上面那样的写法太麻烦了,你有没有想到更快捷的方法?

对了,用 *!数学中的乘法是相同的数加起来的快捷方式,Python 中字符串的拼接操作也是如此。

str1 = '海草'
str2 = str1 * 3  # 相当于 str1 + str1 + str1
print(str2)
# 输出:海草海草海草

编程练习

你小时候肯定听过这么一个童谣:“从前有座山,山里有个庙。庙里有老和尚和小和尚,有一天老和尚对小和尚说:从前有座山,山里有个庙。庙里有老和尚和小和尚,有一天老和尚对小和尚说:从前有座山,山里有个庙。庙里有老和尚和小和尚,有一天老和尚对小和尚说:……”。

我们接下来用字符串拼接的方法,将这个一直循环的童谣讲 20 遍!

最优解:

story = '从前有座山,山里有个庙,庙里有老和尚和小和尚,有一天老和尚对小和尚说:'
print(story * 20)
# 将 story 重复 20 遍拼接在一起使用 print() 输出

运用字符串拼接的方式完成一组重复文本的输出,既省时又省心。

其实 Python 还提供了一种更高级的方法来组合字符串,那就是字符串格式化输出。

字符串格式化输出

字符串格式化输出 是按照一种既定格式给字符串填空的方式,以便我们更加方便地写入字符串。比如一段自我介绍的文本:我叫 xx,今年 xx 岁,来自 xx。,根据我们学过的知识,我们会这样写:

def print_intro(name, age, city):intro = '我叫' + name + ',今年 ' + str(age) + ' 岁,来自' + city + '。'print(intro)print_intro('小贝', 18, '南京')
# 输出:我叫小贝,今年 18 岁,来自南京。

提示:字符串类型和数字类型不能直接相加,需要用 str() 函数进行类型转换。

上面的例子里,我们用了一堆 + 来拼接字符串,既麻烦又难以一眼看出来是什么。接下来老师用字符串的格式化输出实现同样的功能:

def print_intro(name, age, city):intro = '我叫%s,今年 %d 岁,来自%s。' % (name, age, city)print(intro)print_intro('小贝', 18, '南京')
# 输出:我叫小贝,今年 18 岁,来自南京。

小贝提问,这段代码看起来有点复杂,“%”在这里是什么意思,老师能不能再详细地说一说?

好的,我们来看一下字符串格式化输出的语法规则:

% 运算符左边是要格式化的字符串,右边是一个元组。如果只有一个占位符,可以将元组里的元素拿出来,如:'我叫%s' % '小贝'

我们通过 %s%d 这样的占位符在字符串中“占位”,Python 会将 % 右边的内容会按顺序替换掉对应的占位符,一一填空。每个占位符都有特定的含义,我们来看一下常见的占位符:

提示:如果你不太确定应该用什么占位符,%s 是万能的,它会把任何数据类型转换为字符串。

编程练习

小贝写了段播报天气的代码,但还是用 + 进行字符串拼接实现的,你能用字符串格式化输出的知识帮她改进一下代码吗?

weathers = [('南京', 36),('成都', 30),('昆明', 26)
]for w in weathers:print('今天' + w[0] + '的最高气温是' + str(w[1]) + '度')

解答后为:

weathers = [('南京', 36),('成都', 30),('昆明', 26)
]for w in weathers:
# 如果你不太确定应该用什么占位符,%s 是万能的,它会把任何数据类型转换为字符串。print('今天%s的最高气温是%s度'%(w[0],w[1]))# 今天南京的最高气温是36度
# 今天成都的最高气温是30度
# 今天昆明的最高气温是26度

编程练习—练习生

身为 Python 练习生的你,练习时长有多久了呢?今天我们来用字符串格式化的知识来做段自我介绍!

格式是:同学们大家好,我是 Python 练习时长 xxx 的个人练习生 xxx,喜欢 xxx!。比如:同学们大家好,我是 Python 练习时长两年半的个人练习生小贝,喜欢唱、跳、Python、篮球!

将下面的代码,用刚刚学的占位符的方式去展示

def print_intro(duration, name, hobby):# 用占位符修改下面字符串print('大家好,我是 Python 练习时长两年半的个人练习生小贝,喜欢唱、跳、Python、篮球!')# 将参数改为你的自我介绍
print_intro('两年半', '小贝', '唱、跳、Python、篮球')

优化后的代码为:

def print_intro(duration, name, hobby):# 用占位符修改下面字符串print('大家好,我是 Python 练习时长%s的个人练习生%s,喜欢%s!'%(duration, name, hobby))# 将参数改为你的自我介绍
print_intro('两年半', '小贝', '唱、跳、Python、篮球')

编程练习—人类的本质是复读机

在各大 APP 的评论区里,一旦某个人的发言有意思,其他人就会“保持队型”,纷纷模仿他说的话。

比如随处可见的“+1”和“+10086”,视频 UP 主求赞之后弹幕上总会飘过一大片“下次一定”,人类的本质果然是复读机呢。

列表 words 中储存了一些常见的网络用语,我们可以用字符串方法将列表里的元素都“复读”三次,比如将 ['+1', '就这'] 复读为 ['+1+1+1', '就这就这就这']

要求复读后不改变列表元素的顺序,请你在原列表中,将每个元素都复读三次,并将复读后的列表打印出来。

words = ['+1', '不会吧', '下次一定', '+10086', '就这']

解题后:

words = ['+1', '不会吧', '下次一定', '+10086', '就这']
# 方法一
items = []
for word in words:items.append('%s'%(word * 3))
print(items)# 方法二
# for i in range(len(words)):
#   words[i] *= 3
# print(words)

编程练习——句子扭蛋

学完一关啦,想不想轻松一下?这就给你介绍一个好玩的游戏:句子扭蛋。

首先邀请你的小伙伴一起,大开脑洞随便写下三组词,分别包括人物、地点和事件三类词,比如:

人物:哆啦A梦,迪迦奥特曼,路飞,苏大强,容嬷嬷,甄嬛,谢耳朵

地点:埃菲尔铁塔上,地铁上,大街上,飞机上,三里屯,家里,浴室里,王者峡谷

事件:背课文,高唱《死了都要爱》,蹦极,补暑假作业,跳远,开黑,800米跑,看《生活大爆炸》

然后,在三组词里随机抽签,用上面这些词来“造句”,比如“容嬷嬷在王者峡谷看《生活大爆炸》。”

是不是觉得还蛮有趣的?Python 可以很方便地做一个这样的游戏,我们把人物、地点和事件分别存到列表 rolesspots 和 events 里,再用 random() 函数随机生成列表的索引值,在列表中随机选取元素并拼成句子。

生成 roles 列表随机索引值 i_role 的代码已经写好,请你仿照这个例子,生成其他列表的索引值,并用字符串格式化的方法,把随机取到的列表元素拼成句子。

提示:老师给的例子不够有趣?你可以修改列表里已经写好的词,DIY 你自己的句子扭蛋哦!

# 有下面这行代码,random() 方法才会奇效,注意不要删掉它~
import randomroles = ['哆啦A梦', '迪迦奥特曼', '路飞', '苏大强', '容嬷嬷', '甄嬛', '谢耳朵']
spots = ['埃菲尔铁塔上', '地铁上', '大街上', '飞机上', '三里屯', '家里', '浴室里', '王者峡谷']
events = ['背课文', '高唱《死了都要爱》', '蹦极', '补暑假作业', '跳远', '开黑', '800米跑', '看《生活大爆炸》']# 请仿照下面这行代码,生成列表 spots 和 events 的随机索引值
i_role = random.randint(0, len(roles) - 1)# 下面是老师写好的句子模板,请你用字符串格式化的方法向其中填入内容。
# 当然,你也可以 DIY 输出句子的格式哦!
print('我看到了一件怪事:【人物】在【地点】【做某件事】。')

解答后:

# 有下面这行代码,random() 方法才会奇效,注意不要删掉它~
import randomroles = ['哆啦A梦', '迪迦奥特曼', '路飞', '苏大强', '容嬷嬷', '甄嬛', '谢耳朵']
spots = ['埃菲尔铁塔上', '地铁上', '大街上', '飞机上', '三里屯', '家里', '浴室里', '王者峡谷']
events = ['背课文', '高唱《死了都要爱》', '蹦极', '补暑假作业', '跳远', '开黑', '800米跑', '看《生活大爆炸》']# 请仿照下面这行代码,生成列表 spots 和 events 的随机索引值
i_role = random.randint(0, len(roles) - 1)
i_spot = random.randint(0, len(roles) - 1)
i_event = random.randint(0, len(roles) - 1)# 下面是老师写好的句子模板,请你用字符串格式化的方法向其中填入内容。
# 当然,你也可以 DIY 输出句子的格式哦!
print('我看到了一件怪事:%s在%s%s。' %(roles[i_role],spots[i_spot],events[i_event]))# 我看到了一件怪事:甄嬛在三里屯蹦极。
# 我看到了一件怪事:甄嬛在埃菲尔铁塔上800米跑。
# 我看到了一件怪事:迪迦奥特曼在大街上高唱《死了都要爱》。
# 我看到了一件怪事:容嬷嬷在家里跳远。
......

是不是很有意思呢~~

预告:下一篇:字符串的索引

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/341547.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发短视频系统设计:架构、存储与性能优化全解

1. 系统概况与需求分析 1.1 短视频系统简介 当前短视频行业的快速发展,加上用户对高清、流畅观看体验的需求不断提升,对系统的并发处理能力、视频处理速度、存储效率等多方面都提出了极高的要求。那么,我们首先需要了解一个完整的短视频系统…

【C++】list的使用(上)

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 前言🌈关于list🔥默认成员函数构造函数(constructor)析构函数(destructor)赋值运算符重载 &#x1…

SOCKS 代理 和 HTTP 代理, WebSocket

SOCKS 代理 和 HTTP 代理 的区别 SOCKS 代理 和 HTTP 代理 都是代理服务器,它们充当客户端和目标服务器之间的中介,但它们的工作方式和应用场景有所不同。 1. SOCKS 代理: 工作原理: SOCKS 代理是一种更底层的代理,…

[沫忘录]MySQL InnoDB引擎

[沫忘录]MySQL InnoDB引擎 逻辑存储结构 InnoDB采用 “表、段,区, 页、行” 这样的层级结构进行存储。 **表空间(tablespace)**ibd文件,主要用于存储记录、索引等数据,一个mysql实例可有多个表空间,甚至能通过innodb…

2024年度CCF-阿里云瑶池科研基金正式发布

2024年度CCF-阿里云瑶池科研基金正式发布 截止时间:2024年7月1日24:00(北京时间) 欢迎CCF会员积极申报 “CCF-阿里云瑶池科研基金”由CCF与阿里云计算有限公司于2024年联合设立,专注于数据库领域,旨在为领域学者提供…

做自媒体素材哪里找?做自媒体必备的几个高质量素材网站分享

在自媒体的世界里,内容是王道。无论是视频还是文章,优秀的自媒体作品都需要有力的内容和高质量的素材作支撑。今天,我为大家整理了一些优质的素材网站,帮助每一位自媒体创作者,无论新手还是老手,都能找到适…

nginx平滑升级

#平滑升级 kill -USR2 <PID号> //查看nginx版本 [rootl1 logs]# nginx -v //查看nginx版本 nginx version: nginx/1.26.0 [rootl1 logs]# 安装一个1.25版本实验一下 [rootl2 ~]# cd /opt/ [rootl2 opt]# [rootl2 opt]# lsnginx-1.25.5.tar.gz nginx-1.26.0.tar.…

Stable Diffusion: Lora篇

前面提到&#xff0c;在提示词中可以使用LoRA并设置权重。LoRA是Low-Rank Adaptation的简写&#xff0c;直译为轻量级微调&#xff0c;是一种通用的AI大模型微调技术&#xff0c;通过LoRA使用可以对Stable Diffusion模型输出进行微调型&#xff0c;更加随心所欲地实现定制华输出…

数据结构--双向链表

目录 一.链表的分类 二.双向链表的结构 三.双向链表的实现 1.初始化 2.尾插与头插 3.尾删与头删 4.在指定位置之后插入数据 查找函数 5.删除指定节点 6&#xff0c;销毁链表 四.完整代码 List.h List.c 一.链表的分类 链表的结构⾮常多样&#xff0c;以下情况组合起…

单列集合--ArryList、LinkedList、Set

使用IDEA进入某个类之后&#xff0c;按ctrlF12,或者alt数字7&#xff0c;可查看该实现类的大纲。 package exercise;import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.function.Consumer;public class Demo3 {public static void…

ShowDoc item_id 未授权SQL注入漏洞复现

0x01 产品简介 ShowDoc 是一个开源的在线文档协作平台,它支持Markdown、图片等多种格式,方便团队成员共同编辑和分享文档。企业常见使用场景是使用其进行接口文档、内部知识库管理。 0x02 漏洞概述 2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前…

基于三元组一致性学习的单目内窥镜里程计估计

文章目录 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope摘要方法实验结果 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope 摘要 单目图像中深度和姿态的估计对于计算机辅助导航至关重要。由于很难获…

6. MySQL 查询、去重、别名

文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…

映射网络驱动器自动断开的解决方法

如果将驱动器映射到网络共享&#xff0c;映射的驱动器可能会在定期处于非活动状态后断开连接&#xff0c;并且 Windows 资源管理器可能会在映射驱动器的图标上显示红色 X。&#xff0c;出现此行为的原因是&#xff0c;系统可以在指定的超时期限后断开空闲连接&#xff0c; (默认…

【Kubernetes】k8s的调度约束(亲和与反亲和)

一、调度约束 list-watch 组件 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和…

0基础学习Elasticsearch-使用Java操作ES

文章目录 1 背景2 前言3 Java如何操作ES3.1 引入依赖3.2 依赖介绍3.3 隐藏依赖3.4 初始化客户端&#xff08;获取ES连接&#xff09;3.5 发送请求给ES 1 背景 上篇学习了0基础学习Elasticsearch-Quick start&#xff0c;随后本篇研究如何使用Java操作ES 2 前言 建议通篇阅读再回…

c语言项目-贪吃蛇项目2-游戏的设计与分析

文章目录 前言游戏的设计与分析地图&#xff1a;这里简述一下c语言的国际化特性相关的知识<locale.h> 本地化头文件类项setlocale函数 上面我们讲到需要打印★&#xff0c;●&#xff0c;□三个宽字符找到这三个字符打印的方式有两种&#xff1a; 控制台屏幕的长宽特性&a…

语法分析-编译原理期末复习

自上而下的语法分析 自上而下语法分析法:或从开始符号出发,找最左推导;或从根开始,构造推导树。 自下而上语法分析法:从输入串开始,归约,直至文法开始符。 回溯分析法 产生回溯的原因:公共左因子(开始匹配上了,可能走错分枝)、左递归(不知道递归多少次)、空产生式。 …

【Git】分支管理 -- 详解

一、理解分支 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前努力学习 C 的时候&#xff0c;另一个你正在另一个平行宇宙里努力学习 JAVA。 如果两个平行宇宙互不干扰&#xff0c;那对现在的你也没啥影响。不过&#xff0c;在某个时间点&#xff0c;两个平行宇宙…

解决 clickhouse jdbc 偶现 failed to respond 问题

背景 Clickhouse集群版本为 Github Clickhouse 22.3.5.5&#xff0c; clickhouse-jdbc 版本为 0.2.4。 问题表现 随着业务需求的扩展&#xff0c;基于Clickhouse 需要支持更多任务在期望的时效内完成&#xff0c;于是将业务系统和Clickhouse交互的部分都提交给可动态调整核心…