前言

忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。

在Python中,我们经常会遇到字符串的拼接问题,几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型。而拼接字符串是必备的一种技能。今天,我跟大家一起来学习Python拼接字符串的七种方式。

下面话不多说了,来一起看看详细的介绍吧

1、来自C语言的%方式

print('%s %s' % ('Hello', 'world'))

>>> Hello world

%号格式化字符串的方式继承自古老的C语言,这在很多编程语言都有类似的实现。上例的%s是一个占位符,它仅代表一段字符串,并不是拼接的实际内容。实际的拼接内容在一个单独的%号后面,放在一个元组里。

类似的占位符还有:%d(代表一个整数)、%f(代表一个浮点数)、%x(代表一个16进制数),等等。%占位符既是这种拼接方式的特点,同时也是其限制,因为每种占位符都有特定意义,实际使用起来太麻烦了。

2、format()拼接方式

# 简洁版

s1 = 'Hello {}! My name is {}.'.format('World', 'Python猫')

print(s1)

>>>Hello World! My name is Python猫.

# 对号入座版

s2 = 'Hello {0}! My name is {1}.'.format('World', 'Python猫')

s3 = 'Hello {name1}! My name is {name2}.'.format(name1='World', name2='Python猫')

print(s2)

>>>Hello World! My name is Python猫.

print(s3)

>>>Hello World! My name is Python猫.

这种方式使用花括号{}做占位符,在format方法中再转入实际的拼接值。容易看出,它实际上是对%号拼接方式的改进。这种方式在Python2.6中开始引入。

上例中,简洁版的花括号中无内容,缺点是容易弄错次序。对号入座版主要有两种,一种传入序列号,一种则使用key-value的方式。实战中,我们更推荐后一种,既不会数错次序,又更直观可读。

3、() 类似元组方式

s_tuple = ('Hello', ' ', 'world')

s_like_tuple = ('Hello' ' ' 'world')

print(s_tuple)

>>>('Hello', ' ', 'world')

print(s_like_tuple)

>>>Hello world

type(s_like_tuple)

>>>str

注意,上例中s_like_tuple并不是一个元组,因为元素间没有逗号分隔符,这些元素间可以用空格间隔,也可以不要空格。使用type()查看,发现它就是一个str类型。我没查到这是啥原因,猜测或许()括号中的内容是被Python优化处理了。

这种方式看起来很快捷,但是,括号()内要求元素是真实字符串,不能混用变量,所以不够灵活。

# 多元素时,不支持有变量

str_1 = 'Hello'

str_2 = (str_1 'world')

>>> SyntaxError: invalid syntax

str_3 = (str_1 str_1)

>>> SyntaxError: invalid syntax

# 但是下面写法不会报错

str_4 = (str_1)

4、面向对象模板拼接

from string import Template

s = Template('${s1} ${s2}!')

print(s.safe_substitute(s1='Hello',s2='world'))

>>> Hello world!

说实话,我不喜欢这种实现方式。浓浓的一股被面向对象思想毒害的臭味。

就不多说了。

5、常用的+号方式

str_1 = 'Hello world! '

str_2 = 'My name is Python猫.'

print(str_1 + str_2)

>>>Hello world! My name is Python猫.

print(str_1)

>>>Hello world!

这种方式最常用、直观、易懂,是入门级的实现方式。但是,它也存在两处让人容易犯错的地方。

首先,新入门编程的同学容易犯错,他们不知道字符串是不可变类型,新的字符串会独占一块新的内存,而原来的字符串保持不变。上例中,拼接前有两段字符串,拼接后实际有三段字符串。

其次,一些有经验的老程序员也容易犯错,他们以为当拼接次数不超过3时,使用+号连接符就会比其它方式快(ps:不少Python教程都是如此建议),但这没有任何合理根据。

事实上,在拼接短的字面值时,由于CPython中的 常数折叠 (constant folding)功能,这些字面值会被转换成更短的形式,例如'a'+'b'+'c' 被转换成'abc','hello'+'world'也会被转换成'hello world'。这种转换是在编译期完成的,而到了运行期时就不会再发生任何拼接操作,因此会加快整体计算的速度。

常数折叠优化有一个限度,它要求拼接结果的长度不超过20。所以,当拼接的最终字符串长度不超过20时,+号操作符的方式,会比后面提到的join等方式快得多,这与+号的使用次数无关。

题外话:你是否觉得20这个数字很熟悉呢?没错,我们之前在《Python中的“特权种族”是什么?》中提到过,字符串类的特权种族也是以20为限。当时也有一个例子,展示了编译期和运行期的区别,建议你去回看。

6、join()拼接方式

str_list = ['Hello', 'world']

str_join1 = ' '.join(str_list)

str_join2 = '-'.join(str_list)

print(str_join1) >>>Hello world

print(str_join2) >>>Hello-world

str对象自带的join()方法,接受一个序列参数,可以实现拼接。拼接时,元素若不是字符串,需要先转换一下。可以看出,这种方法比较适用于连接序列对象中(例如列表)的元素,并设置统一的间隔符。

当拼接长度超过20时,这种方式基本上是首选。不过,它的缺点就是,不适合进行零散片段的、不处于序列集合的元素拼接。

7、f-string方式

name = 'world'

myname = 'python_cat'

words = f'Hello {name}. My name is {myname}.'

print(words)

>>> Hello world. My name is python_cat.

f-string方式出自PEP 498(Literal String Interpolation,字面字符串插值),从Python3.6版本引入。其特点是在字符串前加 f 标识,字符串中间则用花括号{}包裹其它字符串变量。

这种方式在可读性上秒杀format()方式,处理长字符串的拼接时,速度与join()方法相当。

尽管如此,这种方式与其它某些编程语言相比,还是欠优雅,因为它引入了一个 f 标识。而其它某些程序语言可以更简练,比如shell:

name="world"

myname="python_cat"

words="Hello ${name}. My name is ${myname}."

echo $words

>>>Hello world. My name is python_cat.

总结一下,我们前面说的“字符串拼接”,其实是从结果上理解。若从实现原理上划分的话,我们可以将这些方法划分出三种类型:

格式化类:%、format()、template

拼接类:+、()、join()

插值类:f-string

当要处理字符串列表等序列结构时,采用join()方式;拼接长度不超过20时,选用+号操作符方式;长度超过20的情况,高版本选用f-string,低版本时看情况使用format()或join()方式。

python shell怎么运行字符串拼接无输出_Python拼接字符串的7种方法总结相关推荐

  1. shell运行python文件_在python shell中运行python文件的实现

    在python shell中运行python文件的实现 最近在学习flask开发,写好程序后需要在python shell中运行测试功能.专门抽时间研究了下,总结以防止以后遗忘. 这是测试文件的结构, ...

  2. Python输出所有水仙花数(3种方法)

    输出所有水仙花数(3种方法) print(*list(map(lambda x: x[1], filter(lambda x: x[0], [(i**3+j**3+k**3 == i*100+j*10 ...

  3. python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)

    python 导入数据包的几种方法 1.直接导入整个数据包:improt 数据包 2.导入数据包中的某一个函数: from 数据包 improt 函数(当函数这一项为 * 时为导入整个数据包) 3. ...

  4. 浅谈C语言将字符串中的空格替换成%20的几种方法(附图超级详细解答)

    文章目录 题目分析 暴力位移法 巧用数组法 高效倒放法 题目分析 将字符串中的空格替换为%20.样例: "abc defgx yz" 转换成 "abc%20defgx%2 ...

  5. python的三种取整方式_python 取整的两种方法

    问题简介: 要把一个浮点数(float)整数部分提取出来.比如把"2.1"变成"2"的这一过程:现在我们给这个过程起一个名字叫"取整".那么 ...

  6. Python学习02、输入输出、控制台输出、格式化字符串的方式、运算符

    输入输出 和用户交互 我们把用户将信息传递给程序的过程叫做输入 把程序将结果展示给用户的过程称为输出 输入输出的最基本方法就是控制台.用户通过控制台输入一些字符串,程序再通过控制台打印出一些字符串 那 ...

  7. python字符串反向输出_Python反向字符串– 5种方法和最佳方法

    python字符串反向输出 Python String doesn't have a built-in reverse() function. However, there are various w ...

  8. [工具] 解决sublime text运行javascript console无输出问题

    1.使用nodeJS在sublime text 运行javascript 下载安装nodeJS 在sublime text新建build system:tools->build system-& ...

  9. python字符串补空格输出_Python去除空格,Python中常见字符串去除空格的方法总结...

    今天小编就为大家分享一篇关于Python去除字符串前后空格的几种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧: Python去除空格方法一: stri ...

最新文章

  1. 《人工智能北京共识》发布,全文公开
  2. 控制反转(IoC) ? 工厂模式?
  3. 51Nod 1007 正整数分组 | DP (01背包)
  4. 在阿里云服务器(Ubuntu系统)下使用WordPress搭建博客网站教程
  5. 在Android Studio中打开DDMS
  6. Qt5开发及实例学习之监听目录
  7. java连接mysql数据库方法_java连接mysql数据库的方法详解
  8. 第四章 consul cluster
  9. 预处理、const、static与sizeof-static全局变量与普通的全局变量有什么区别
  10. Code::Blocks IDE - Open Source, Cross-platform Free C++ IDE
  11. uni的numberbox怎么用_jQuery EasyUI表单插件Numberbox数字框
  12. 数学建模——典型相关分析及相关SPSS操作
  13. 【软件相关】Multisim完整教程
  14. 手机怎么用外嵌字幕_iphone 12发布 ! “预购、定金、尾款、换手机”用英语怎么说?...
  15. 解决网易云音乐登录接口-460问题
  16. 408计算机组成原理学习:数据的表示与计算
  17. 七夕情人节生日节日表白网页,不是程序员也会用~
  18. 一对一直播源码一对一直播源码搭建你要知道的功能
  19. 【线性代数】通俗的理解奇异值以及与特征值的区别,还有奇异值分解及其应用
  20. python安装成功可为什么打不开_python为什么安装了运行不了?

热门文章

  1. 计算机教学常规检查小结,小学教学常规检查自查报告范文
  2. FSMC驱动TFTLCD原理,时序和寄存器介绍
  3. 云ERP服务商E店宝获上市公司和嘉资源1亿元C轮融资
  4. LTP(Linux Test Project)学习(一)——LTP介绍
  5. tiny4412 lcd驱动问题记录
  6. 新一代信息技术-大数据
  7. 您选择的用户登录名已在该企业中使用,请选在另一个登录名,然后再试
  8. LCP 22.黑白方格画
  9. Coursera机器学习(Andrew Ng)笔记:无监督学习与维度约减
  10. 2021年,吃瓜的打工人开始奋斗