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

是不是很有意思呢~~

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值