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 random

roles = ['哆啦A梦', '迪迦奥特曼', '路飞', '苏大强', '容嬷嬷', '甄嬛', '谢耳朵']
spots = ['埃菲尔铁塔上', '地铁上', '大街上', '飞机上', '三里屯', '家里', '浴室里', '王者峡谷']
events = ['背课文', '高唱《死了都要爱》', '蹦极', '补暑假作业', '跳远', '开黑', '800米跑', '看《生活大爆炸》']

# 请仿照下面这行代码,生成列表 spots 和 events 的随机索引值
i_role = random.randint(0, len(roles) - 1)

# 下面是老师写好的句子模板,请你用字符串格式化的方法向其中填入内容。
# 当然,你也可以 DIY 输出句子的格式哦!
print('我看到了一件怪事:【人物】在【地点】【做某件事】。')

解答后:

# 有下面这行代码,random() 方法才会奇效,注意不要删掉它~
import random

roles = ['哆啦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米跑。
# 我看到了一件怪事:迪迦奥特曼在大街上高唱《死了都要爱》。
# 我看到了一件怪事:容嬷嬷在家里跳远。
......

是不是很有意思呢~~

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#操作MySQL从入门到精通(10)——对查询数据进行通配符过滤

前言 我们有时候需要查询数据,并且这个数据包含某个字符串,这时候我们再使用where就无法实现了,所以mysql中提供了一种模糊查询机制,通过Like关键字来实现,下面进行详细介绍: 本次查询的表中数据如下: 1、使用(%)通配符 %通配符的作用是,表示任意字符出现任意次数…

DP读书:《ModelArts人工智能应用开发指南》(一)人工智能技术、应用平台

怎么用ModelArts人工智能应用 训练底座训练案例 盘古矿山模型Main config.py 训练底座 训练案例 盘古矿山模型 Main 下面是快速助手 https://support.huaweicloud.com/qs-modelarts/modelarts_06_0006.html 准备开发环境 在ModelArts控制台的“ 开发环境 > Notebook”页面…

MQTT协议使用总结

MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布/订阅信息传输协议MQTT在时间和空间上,将消息发送者与接受者分离,可以在不可靠的网络环境中进行扩展。适用于设备硬件存储空间有限或网络带宽有限的场景。 物联网平台支持设…

HarmonyOS应用开发深度指南:从基础到高级实践

1. HarmonyOS开发概述 HarmonyOS是华为推出的分布式操作系统,旨在为不同设备提供统一的体验。它支持多种编程语言,包括ArkTS、JS、C/C++和Java。开发者需要了解HarmonyOS的分布式架构,包括Ability、Service、Data Ability等核心概念。 了解HarmonyOS的分布式架构:HarmonyO…

每天CTF小练一点--ctfshow年CTF

初一 题目: 2023是兔年,密码也是。聪明的小伙伴们,你能破解出下面的密码吗? 感谢大菜鸡师傅出题 flag格式是ctfshow{xxxxxx}.或许密码也有密码。 密文是: U2FsdGVkX1M7duRffUvQgJlESPfOTV2i4TJpc9YybgZ9ONmPk/RJje …

【计算机组成原理】1.1计算机的软硬件组成(记录学习计算机组成原理)

文章目录 1.早期的冯诺依曼机2.早期冯诺依曼机的基本运行框图3.早期冯诺依曼机的特点4.现代计算机的结构5. 小结 本次及以后有关于计算机组成原理的文章,旨在做学习时的记录和知识的分享。不论是应对期末考试,还是考研都是很有帮助的。希望大家多多支持更…

Hotcoin精彩亮相Consensus 2024 Austin,探索行业风向标

5 月 31 日,由CoinDesk主办的“Consensus 2024”大会在德克萨斯州的奥斯汀市正式落下帷幕。作为全球规模最大、最具影响力的加密货币、区块链、Web3盛会,本次Consensus 2024 Austin吸引来自 100 多个国家/地区的 15,000 多名与会者、6,800 家公司、850 多…

动态代理(黑马笔记)

一、BigStar 大明星类 package com.itheima.mydynamicproxy1; public class BigStar implements Star {//实现接口要重写里边的抽象方法private String name;public BigStar() {}public BigStar(String name) {this.name name;}//唱歌Override //表示重写接口中的方法public…

【HarmonyOS】鸿蒙应用实现音效播放

一、问题背景: 应用在强提醒场景下,一般会有播放音效的效果,提示用户注意力的关注。 比如消息提醒,扫码提示,删除键确认提示等。 在鸿蒙应用如何实现音效播放呢? 二、解决方案: 使用AVPlaye…

园区运营管理平台的功能架构

产业园区作为推动地方经济发展的重要载体,其运营管理水平直接影响到园区的竞争力和可持续发展能力,园区运营管理平台作为园区的运营管理工具,旨在通过智能化、自动化的手段提升园区的运营效率和服务水平。 园区运营管理平台不仅为园区管理者提…

45-3 护网溯源 - 为什么要做溯源工作

官网:CVERC-国家计算机病毒应急处理中心 西工大遭网络攻击再曝细节!13名攻击者身份查明→ (baidu.com) 护网溯源是指通过技术手段追踪网络攻击的来源和行为,其重要性体现在以下几个方面: 安全防御:了解攻击源头可以帮助组织加强网络安全防御,及时采取措施防止攻击的再次…

A股冲高回落,金属、地产板块领跌,新股N汇成真首日暴涨753%

行情概述 AH股有色金属、教育及地产板块领跌,军工航天及半导体板块逆势走强;锂电池、创新药概念股也走强。创业板新股N汇成真首日暴涨753%,触发二次临停。 周三A股冲高回落,上证指数收跌0.83%,深成指跌0.8%&#xff…

爬楼梯——动态规划第一步

本问题其实常规解法可以分成多个子问题,爬第 n 阶楼梯的方法数量,等于两个部分之和 爬上 n−1 阶楼梯的方法数量。因为再爬 1 阶就能到第 n 阶爬上 n−2 阶楼梯的方法数量,因为再爬 2 阶就能到第 n 阶 所以我们得到公式 dp[n] dp[n−1] d…

Windows下Qt5.14.2连接华为IoTDA平台

一、华为IoTDA简介 华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助您快速构筑物…

力扣200. 岛屿数量(BFS)

Problem: 200. 岛屿数量 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义方向数组:定义一个方向数组 DIRECTIONS,表示上、下、左、右四个方向的移动。 2.获取网格的行数和列数同时初始化一个计数器 numIslands 用于记录岛屿的数量。 …

【新书上市】图像画质算法与底层视觉技术

图书主页:https://book.douban.com/subject/36895899/ 购买链接:https://item.jd.com/10105601481762.html 内容介绍 本书主要介绍了图像画质相关的各类底层视觉任务及其相关算法,重点讲解了去噪、超分辨率、去雾、高动态范围、图像合成与图…

计算机网络 —— 数据链路层(无线局域网)

计算机网络 —— 数据链路层(无线局域网) 什么是无线局域网IEEE 802.11主要标准及其特点: 802.11的MAC帧样式 我们来看看无线局域网: 什么是无线局域网 无线局域网(Wireless Local Area Network,简称WLAN…

LLM之RAG实战(三十九)| 高级RAG技术全面解析(附代码)

一、高级RAG概述 基本 RAG 的工作流程可分为三个步骤:索引、检索和生成。在索引阶段,文本被转换为嵌入,然后存储在向量数据库中以创建可搜索的索引。在检索步骤中,用户的查询也被转换为嵌入,此嵌入用于在向量数据库中搜…

为什么3D渲染有的模型是黑的?---模大狮模型网

在3D建模和渲染的过程中,遇到模型渲染出来是黑色的情况并不罕见。这可能是由于多种原因导致的,包括但不限于材质设置问题、灯光配置不当、渲染设置错误等。 一、材质设置问题 材质丢失或错误:如果模型在导入或创建时材质没有正确加载或设置&…

力扣 54.螺旋矩阵

题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入&#…