Python学习——【1.4】字符串扩展知识

【1.4】字符串扩展知识

一、字符串的三种定义方式

(一)三种定义方式

  字符串在Python中有多种定义方式。

单引号定义法

name = '张三'

双引号定义法

name = "张三"

三引号定义法

name = """张三"""

  对于三引号定义法,和多行注释的写法一样,同样支持换行操作。

  只不过,使用变量去接收它,那么它就是字符串了。如果不使用变量接收它,它就作为多行注释来使用。

示例

# 单引号定义法
name = '张三'
print(type(name))

# 双引号定义法
name = "张三"
print(type(name))

# 三引号定义法
name = """
我是
张
三
"""
print(type(name))

输出结果如下:

<class 'str'>
<class 'str'>
<class 'str'>

(二)字符串的引号嵌套

  如果我想定义的字符串本身就包含了单引号、双引号的内容呢?如何写?

  解决方案如下:

  • 我们使用单引号定义法时,可以在里面包含双引号内容;
  • 我们使用双引号定义法时,可以在里面包含单引号内容;
  • 可以使用转义字符(\)来将引号解除效用,变成普通字符。

示例

# 字符串内包含双引号
name = '"张三"'
print(name)

# 字符串内包含单引号
name = "'张三'"
print(name)

# 使用转义字符 \ 解除引号的效用
name = "\"张三\""
print(name)
name = '\'张三\''
print(name)

输出结果如下:

"张三"
'张三'
"张三"
'张三'

说明:

  为什么双引号里直接套双引号,或者单引号里直接套单引号时会出错,原因在于程序是成对地解析引号的。

  例如,name = ""张三"",虽然我们觉得是这样的:name = ““张三””。

  但是从程序的视角来看是这样的:name = ""张三""。(即,两边各一个空字符串,中间是两个中文字符)

二、字符串拼接

  如果我们有两个字符串字面量,可以将其拼接成一个字符串,通过+号即可完成,例如:

print("我叫小明," + "今年12岁。")

输出结果如下:

我叫小明,今年12岁。

  不过,像这样单纯使用两个字符串字面量进行拼接,就显得很没有必要了,因为我们完全可以把它们直接就写成一个字符串。

  一般,字面量和变量,或者变量和变量之间才会用到拼接,例如:

name = "小明"
print("我叫" + name + ",今年12岁。")

输出结果如下:

我叫小明,今年12岁。

  注意,如果进行字符串拼接的变量中,有数字,那么数字类型必须转换成字符串类型之后,才能进行拼接,否则会报错。例如:

name = "小明"
age = 12

# 注意,这样直接拼接会报错!
# print("我叫" + name + ",今年" + age + "岁。")

# 将age进行类型转换,即可正确输出
print("我叫" + name + ",今年" + str(age) + "岁。")

  不光是整数或者浮点数不能这样直接拼接。实际上,除字符串类型外的其他类型都是无法直接这样进行字符串拼接的。即,字符串拼接操作只适用于字符串类型本身,无法和非字符串类型进行拼接

问题:

  既然如此,那么字符串拼接操作也太没用了。——这一点不用着急,学习过字符串格式化就明白了。

三、字符串格式化 — 占位型拼接

  在学习过字符串拼接之后,我们会发现,它不太好用,原因主要在于:

  1.变量过多,拼接起来太麻烦了。例如:print("我是" + name + ",我的性别是:" + gender + ",我住在:" + address ",我的爱好是:" + hobby)

  2.字符串无法和非字符串类型进行拼接。

  所以,有没有其它方式,既方便,又支持拼接各种类型呢?

  有。这种方式,就是字符串的格式化。

  我们可以通过如下语法,完成字符串和变量的快速拼接:(这种方式也叫“占位型拼接”)

name = "小明"
info = "我叫%s" % name

print(info)

# 输出结果:我叫小明

  可见,与传统的字符串拼接相比,它的不同之处在于:

  1.在字符串字面量的内部,使用%s作为占位符;

  2.拼接符号由+号变成了%号。

  其中的%s,说明如下:

  • %表示:我要占位;
  • s表示:将变量变成字符串,并放入占位的地方。(注意,是“变成”,而不需要本身就是字符串)

  概括起来就是:我先占个位置,等一会儿有一个变量过来,我把它变成字符串并放到占位的位置上。

  上述例子仍然是字符串类型的拼接,而且只有一个变量。如果有其他类型的变量进行拼接还可不可以?如果变量不止一个,该怎么写拼接的代码?示例如下:

name = "小明"
age = 12

info = "我叫%s,今年%s岁。" % (name, age)
print(info)

# 输出结果:我叫小明,今年12岁。

说明:

  1.无论是什么类型,都可以在占位符%s的作用下,转成字符串并放到对应位置上。

  2.当有多个变量占位时,要注意:变量要用括号括起来,并按照占位的顺序填入,之间用逗号分隔开

占位符

  对于%s占位符,通过刚才的学习,我们知道,它是将对应的变量转换成字符串,并进行拼接的。

  所以,它其实还是要把非字符串类型先转换成字符串类型,然后才做的拼接。

  此时,我们会想,难道其他数据类型地位就比字符串低吗?有没有什么方式,可以让数字或者其他类型,以其原本面貌直接拼接进去呢?(不要先转换成字符串)

  有。

  在Python中,其实支持很多的数据类型占位。(即,除了%s占位符外,还有很多其他的占位符)最常用的是如下三种:

符号说明
%s将内容转换成字符串,放入占位位置
%d将内容转换成整型,放入占位位置
%f将内容转换成浮点型,放入占位位置

  示例如下:

# 占位符有多种,如%s %d %f
name = "小明"
age = 12
height = 157.5

info = "我叫%s,我今年%d岁,我的身高是%f厘米。" % (name, age, height)
print(info)

# 输出结果:我叫小明,我今年12岁,我的身高是157.500000厘米。

四、格式化的精度控制

  在上面的实例中,对于浮点数占位符%f输出浮点型数据时,可以发现,原来的157.5变成了157.500000进行输出了。这就是因为我们没有对数字的精度作控制。

  我们可以使用辅助符号m.n来控制数据的宽度精度

  • m:控制宽度,要求是数字。如果设置的宽度小于数字自身,则不生效;
  • .n:控制小数点精度,要求是数字,并且会进行小数的四舍五入

  说明如下:

  • %5d:表示将整数的宽度控制在5位。如数字11被设置为%5d,就会变成:[][][]11[]表示空格),用三个空格补足宽度。
  • %5.2f:表示将宽度控制为5,将小数点精度设置为2。

  注意:小数点以及小数部分,都要计入宽度计算。例如,对11.345设置了%7.2f,结果是:[][]11.35[]表示空格)。其中,两个空格用于补充宽度(11.35本身的宽度为5),且小数部分在限制2位精度后,四舍五入为.35

  • %.2f:表示不限制宽度,只设置小数点精度为2。如11.345设置%.2f后,结果是11.35

示例

num1 = 11
num2 = 11.345

# 数字11 限制宽度为5
print("%5d" % num1)

# 数字11 限制宽度为1
print("%1d" % num1)

# 数字11.345 限制宽度为7 小数精度为2
print("%7.2f" % num2)

# 数字11.345 不限制宽度 小数精度为2
print("%.2f" % num2)

输出结果如下:

   11
11
  11.35
11.35

五、字符串格式化 — 快速格式化

  目前通过%符号占位的格式化已经很方便了,而且还可以进行精度控制。

  但是,还有没有更简便的方式?

  有。

  通过语法:f"内容{变量1}内容{变量2}"的格式,来快速格式化。

示例

name = "小明"
age = 12
height = 157.5

print(f"我是{name},我今年{age}岁,我的身高是{height}厘米。")

输出结果如下:

我是小明,我今年12岁,我的身高是157.5厘米。

注意:

  1.不关心类型。只需要在字符串前面加上一个fformat的首字母),然后在字符串内部把变量用{}括起来即可。

  2.变量是什么样的就怎么输出,不作格式或精度上的控制。(适合对格式或精度没要求的时候快速使用)

六、对表达式进行格式化

  刚刚的演示,都是基于变量的。

  可是,我想更优雅一些,少写点代码,能否不必通过变量这种“介质”,而直接对“表达式”进行格式化是否可行呢?(如果不太理解这里是什么意思,往下看即可)

  先了解一下什么是表达式。

  表达式:一条具有明确执行结果代码语句

注意:

  两个要点,“是一条代码语句”,且“有明确执行结果”,即为“表达式”。

  例如:1 + 15 * 2就是表达式。因为它们都是一条代码语句,并且有明确的执行结果。

  又例如,对于常见的变量定义语句:name = “张三” 或 age = 11 + 11,其中等号右侧的部分(加粗的部分),叫做表达式。它们是一条代码语句,并且有明确的结果(只不过它们的结果又通过赋值运算符赋给了变量而已)。

  那么,对于字符串格式化,能否直接格式化一个表达式呢?

  可以。

示例

print("1 * 1的结果是:%d" % (1 * 1))
print(f"1 * 1的结果是:{1 * 1}")
print("字符串在Python中的类型是:%s" % type("This is a string."))

输入结果如下:

1 * 1的结果是:1
1 * 1的结果是:1
字符串在Python中的类型是:<class 'str'>

  即,在无需使用变量进行数据存储的时候,可以直接对表达式作格式化,从而简化代码。

※、练习

股价计算小程序

  定义如下变量:

  • name:公司名;
  • stock_price:当前股价;
  • stock_code:股票代码;
  • stock_price_daily_growth_factor:股票每日增长系数(浮点类型,例如1.2);
  • growth_days:增长天数。

  计算:经过growth_days天的增长后,股价达到了多少钱。

  使用字符串格式化进行输出,对于浮点数,要求小数点后保留两位小数。

示例输出

公司:CSDN,股票代码:453000,当前股价:19.99
每日增长系数是:1.2,经过7天的增长后,股价达到了:71.63

补充:

  第一行输出,要求用f"{变量}"的方式输出;

  第二行输出,要求用%占位符的方式输出。

我写的代码

name = "CSDN"  # 公司名
stock_code = 453000  # 股票代码
stock_price = 19.99  # 当前股价
stock_price_daily_growth_factor = 1.2  # 股票每日增长系数
growth_days = 7  # 增长天数

print(f"公司:{name},股票代码:{stock_code},当前股价:{stock_price}")

new_stock_price = stock_price * (stock_price_daily_growth_factor ** growth_days)
print("每日增长系数是:%.2f,经过%d天的增长后,股价达到了:%.2f" % (stock_price_daily_growth_factor, growth_days, new_stock_price))

输出结果如下:

公司:CSDN,股票代码:453000,当前股价:19.99
每日增长系数是:1.20,经过7天的增长后,股价达到了:71.63

存在的问题

  1.问题一:股票代码stock_code不应该用数字类型去定义,而应该用字符串类型。原因在于,如果代码是以0开头的,那么数字类型就不合法了。

  2.问题二:在示例输出中,每日增长系数是1.2,而非1.20。首先想到的修改思路是,把它的占位符改为%.1f,但这样有两个问题,第一,如果增长系数变了,占位符可能也要跟着变;第二,在你不知道系数是多少的情况下,你怎么知道是保留一位小数?所以,进一步想到修改思路为,使用%s作为其占位符。

订正后的代码

name = "CSDN"  # 公司名
stock_code = "453000"  # 股票代码
stock_price = 19.99  # 当前股价
stock_price_daily_growth_factor = 1.2  # 股票每日增长系数
growth_days = 7  # 增长天数

print(f"公司:{name},股票代码:{stock_code},当前股价:{stock_price}")

new_stock_price = stock_price * (stock_price_daily_growth_factor ** growth_days)
print("每日增长系数是:%s,经过%d天的增长后,股价达到了:%.2f" % (stock_price_daily_growth_factor, growth_days, new_stock_price))

输出结果如下:

公司:CSDN,股票代码:453000,当前股价:19.99
每日增长系数是:1.2,经过7天的增长后,股价达到了:71.63
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋秋秋叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值