Python程序设计——字符串处理的特殊方法

news2024/12/22 22:21:08

学习目标:

  1. 学习如何创建字符串
  2. 使用len、min和max函数获取一个字符串的长度、串中的最大和最小的字符
  3. 使用下标运算符([])访问字符串中的元素
  4. 使用截取运算符str[ start:end]从较长的字符串中得到一个子串
  5. 使用+运算符连接两个字符串,通过*运算符复制一个字符串
  6. 使用in和not in运算符判断一个字符串是否包含在另一个字符串内
  7. 使用比较运算符(==、! =、<、<=、>、>=)对字符串进行比较
  8. 使用for循环迭代字符串中的字符
  9. 使用方法isalnum、isalpha、isdigit、isidentifier、islower、isupper 和isspace来测试字符串
  10. 使用方法endswith、startswith、find、rfind 和count搜索子串
  11. 使用方法capitalize、lower、upper、title、swapcase和replace 转换字符串
  12. 使用方法lstrip、rstrip 和strip从一个字符串的左侧或右侧删除空格
  13. 使用方法center、ljust、rjust 和format格式化字符串
  14. 在应用程序( CheckPalindrome、Hex ToDecimalConversion)的开发过程中应用字符串
  15. 为运算符定义特殊的方法
  16. 设计Rational类表示有理数

一、引言

        关键点:本章将重点放在类的设计上,它使用Python中的str类为例并探索Python中特殊方法的作用。

        前一篇介绍了关于类和对象的一些重要概念。我们已经学习了如何定义一个类,以及如何创建和使用对象。str 类不仅在表示字符串方面很有用,而且它也是一个很好的类设计的例子。本文我们将更深人地讨论str类。在Python语言中特殊方法起着非常重要的作用。这里也会介绍一些特殊方法和运算符重载,以及使用特殊方法设计类。

二、str 类

关键点:一个str对象是不可变的;这也就是说,一旦创建了这个字符串,那么它的内容是不可变的。

2.1、创建字符串

你可以使用构造函数构建字符串,如下所示:

s1 = str() # Create an empty string object
s2 = str("Welcome") # Create a string object for We lcome

Python提供了一个简单语法,它通过使用字符串值创建一一个字符串。例如:

s1 = " "# Same as s1= str()
s2 = "Welcome" # Same as s2 = str("Welcome")

        一个字符串对象是不可变的: 一旦创建一个字符串对象出来,那么它的内容就不会再改变。为了优化性能,Python 使用一个对象来表示具有相同内容的字符串。如图所示,s1和s2都指向同一个字符串对象,它们都有着相同的id数。

        这个动作对Python库中的所有不可变对象都是真的。例如: int 是一种不可变类。两个具有相同值的int对象实际上是共享了相同的对象,如图所示:

2.2、处理字符串的函数

        Python的一些内置函数可以和字符串一起使用。你可以使用len函数来返回一个字符串中的字符个数,而max和min函数返回字符串中的最大和最小字符。下面是一些例子:

>>> S = "We1come"
>>> len(s)
7
>>> max(s)
'o'
>>> min(s)
'W'
>>>

        因为字符串s有7个字符,len(s)返回7 。注意:小写字母的ASCII码值要高于小写字母的ASCII码值,所以,max(s) 返回o ,而min(s)返回W 。

2.3、下标运算符 [ ]

一个字符串是一个字符序列。可以使用下面的语法通过下标运算符访问字符串中的一个字符:

s[index]

下标是基于0的;也就是说,它们的范围从0到len(s)-1,如图所示。

2.4、截取运算符 [start : end]

        截取运算符通过使用语法s[start:end]返回字符串其中的一段。这一段就是从下标start到下标end-1的一个子串。例如:

>>> s = "Welcome"
>>> s[1 : 4]
elc

s[1:4]返回从下标1到下标3的子串。

        起始下标或结束下标都可以被忽略。在这种情况下,默认的起始下标是0,而结束下标是最后一个下标。例如:

>>> S = "Welcome"
>>>s[ :6]
'Welcom'
>>> s[4: ]
'ome'
>>>s[1:-1]
elcom
>>>

        在第2行中,s[ :6] 和s[0:6]是一样的,都返回的是从下标0到下标5的子串。在第4行中,s[4: ]和s[4:7]是一样的,都返回的是从下标4到下标6的子串。你也可以在截取字符串的过程中使用负下标。例如,在第6行中,s[1:-1]s[1:-1+len(s)]是一样的

        注意:如果截取操作s[i:j] 中的下标(i或j)是负数,那么就用len(s)+index来替换下标。如果j>len(s),那么j就会被设置成len(s)。如果i>=j,那么截取的子串就会成为空串。

2.5、连接运算符+和复制运算符*

        你可以使用连接运算符+组合或连接两个字符串。你也可以使用复制运算符*来连接相同的字符串多次。下面是一 些例子:

>>> s1 = "Welcome"
>>> s2 = "Python"
>>> s3 = s1 + "to" + s2
>>> s3
'Welcome to Python'
>>> s4 = 3 * s1
>>> s4
'WelcomeWelcomeWelcome'
>>> s5 = s1 * 3
>>>s5
'WelcomeWelcomeWelcome'
>>>

注意: 3*s1和s1*3具有相同的效果。

2.6、in和notin运算符

你可以使用in和not in操作来测试一个字符串 是否在另一个字符串中。下面是一些例子:

>>> s1 = "Welcome" 
>>> "come" in s1
True
>>> "come" not in s1
False
>>>

下面是另一个例子:

s = input("Enter a string: ")
if "Python" in s:
    print("Python","is in", s)
else:
    print("Python","is not in", s)

        如果你在运行这个程序的时候将字符串“WelcometoPython”作为输入,这个程序就应该显示:
        python is in Welcome to Python.

2.7、比较字符串

        你可以使用比较运算符来对字符串进行比较(已经介绍过==、!=、 >、<. >=和<=)。Python是通过比较字符串中对应的字符进行比较的,比较是通过计算字符的数值代码实现的。例如,a比A大,因为a的数值代码比A的数值代码大。

        假设你需要比较字符串s1("Jane")和s2("Jake")。首先,比较s1和s2中的首字符(J和J)。因为它们是一样的,所以比较它们的第二个字符(a和a)。因为它们也是一样的,所以比较它们的第三个字符(n 和k)。因为n的ASCII码值要大于k的,所以s1是大于s2的。

        下面是一些例子:

>>>'green' == 'glow'
False
>>> "green" != "g1ow"
True
>>> "green" > "glow"
True
>>> "green" >= "glow"
True
>>> "green" < "g1ow"
False
>>> "green" <= "g1ow"
False
>>> "ab" <= "abc"
True
>>>

2.8、迭代字符串

        一个字符串是可迭代的。这意味着你可以使用一个for循环来顺序遍历字符串中的所有字符。例如,下面的代码显示了字符串s中的所有字符:

for ch in s:
    print(ch)

你可以将这段代码读作“对于s中的每个字符ch,都打印ch”。

        这个for循环没有使用下标来访问字符。但是,如果你想以不同顺序遍历字符,那么你仍然必须使用下标。例如,下面的代码显示了字符串奇数位置的字符:

for i in range(0, len(s), 2):
    print(s[i])

        这段代码使用变量i作为字符串s的下标。i的初始值是0,然后,在它达到或超过len(s)之前每次增加2。对于每个i值,都打印s[i]。

2.9、测试字符串

2.10、搜索字串

2.11、转换字符串

 注意:如同之前所述,字符串是不可变的。str 类中没有方法能改变字符串的内容,这些方法都是创建了新的字符串。

2.12、删除字符串中的空格

        你可以使用下图中的方法从字符串的前端、末端或者两端来删除字符串中的空格。回
顾一下,字符' '、\t、\f、\r和\n都被称作空白字符。

        注意:删除空白字符的方法只能去掉字符串前后两端的空白字符,并不能删除被非空白字符包围的空白字符。

        提示:在输入字符串上应用strip()方法来确保删除输入的末尾任何不需要的字符,这是很好的经验。

2.13、格式化字符串


 下面是使用center、ljust和rjust方法的一些例子:

>>> s = "Welcome"
>>> s1 = s.center(11)
>>>s1
'  Welcome  '
>>> s2 = s.ljust(11)
>>>>s2
'Welcome       '
>>> s3 = s.rjust(11)
>>;>>s3
'      Welcome '
>>>

        在第2行,s.center(11)将字符串s放在占位11个字符的字符串中央。在第5行,s.ljust(11)将字符串s放在占位11个字符的字符串左端。在第8行,s.rjust(11) 将字符串s放在占位11个字符的字符串右端。

三、运算符重载和特殊方法

关键点: Python允许为运算符和函数定义特殊的方法来实现常用的操作。Python使用一种独特方式来命名这些方法以辨别它们的关联性。

        在之前,我们已经学会了如何使用完成字符串操作的运算符。可以使用运算符+来结合两个字符串,而运算符*可以结合同一字符串多次,关系运算符(==、!=.<.<=、>、>=)用来比较两个字符串,而下标运算符[]用来访问一个字符。例如:

s1 ="Washi ngton"
s2 = "Cali fornia"
print("The first character in s1 is",s1[0] )
print("s1+s2is",s1+s2)
print("s1 < s2?",s1 < s2 )

        这些运算符实际。上都是在str类中定义的方法。为运算符定义方法被称作运算符重载。运算符重载允许程序员使用内嵌的运算符为用户定义方法。下表罗列出运算符和方法之间的映射关系。当你命名这些方法时,名字前后要加两个下划线以便于Python辨识它们的关联性。例如:为了将运算符+作为方法来使用,你应当定义一个名为__ add__ 的方法。 注意:这些方法并不是私有的,因为它们除了两个起始下划线还有两个结尾下划线。回顾一下,类中的初始化程序被命名为__ init__ ,这是一个初始化对象的特殊方法。

例如,你可以使用如下方法改写之前的代码:

s1 = "Washington"
s2 = "California"
print("The first character in sl is", s1.__ getitem__(0) )
print("s1 + s2 is", s1.__add__ (s2))
print("s1 < s2?", s1.__lt_ __ (s2))

        s1.__ getitem__ (0) 与s1[0]相同,sl.__ add__ (s2) 与s1+s2相同,而s1.__ lt__ (s2) 与s1<s2相同。现在,你可以看出重载运算符的优势。重载运算符可以极大地简化程序,让程序更易读、易维护。

        Python支持in运算符,它可以用来判断一个字符是否在另一个字符串中或者一个元素是否是一个容器中的成员。对应的方法被命名为__ contains__(self,e)。 你可以使用方法__contain__或使用 in运算符来判断一个字符是否在一个字符串内,代码如下所示。

1 s1 = "Washi ngton"
2 print("Is W in s1?", 'W' in s1 )
3 print("Is W in s1?", s1.__contains__('W') )

W in s1和s1.__ contains__('w')一样。

如果一个类定义了__ len__ (self) 方法,那么Python允许你使用方便的语法将调用方法作为函数调用。例如:__ len__ 方法被定义在 str类中,该方法返回字符串的字符个数。你既可以使用__ len__ 方 法也可以使用len函数来获取字符串中的字符个数,代码如下所述:

1 s1 = "Washington"
2 print("The 1ength of s1 is", 1en(s1))
3 print("The 1ength of s1 is", s1.__1en__())

len(s1)和s1.__ len__ () 是相同的。

        许多特殊的运算符都被定义为Python的内置类型,例如: int 和float。假设i是3而j是4。i.__add__ (j) 和i+j是相同的,而i.__sub__(j) 和i-j是相同的。

注意:你可以传递一个对象 去调用print(x)。 这等价于调用print(x.__ str__()) 或 print(str(x))。

        注意:比较运算符(==、!=、<、<=、>和>=)也可以通过使用方法__ cmp__ (self,other)来实现。如果self<other,那么该方法返回负整数。如果self==other,那么该方法返回0。如果self>other, 那么该方法返回正整数。对于两个对象a和b,如果__ It___ 可用的话,那么a<b就调用a.__ It__(b)。 如果不行的话就调用__cmp__ 方法 来决定顺序。

四、总结

  • 字符串对象是不可变的,不可以改变它的内容。
  • 可以使用Python函数len、min和max来返回字符串的长度、最大元素和最小元素。
  • 可以使用下标运算符[]来指向字符串中的一个单独的字符。
  • 可以使用连接运算符+来连接两个字符串,使用复制运算符*来复制一个字符串多次,使用截取运算符[: ]来获取子串,而使用运算符in和not in来判断-一个字符是否在一个字符串中。
  • 使用比较运算符(==、!=、 <、<=、>和>=)比较两个字符串。
  • 使用for循环迭代字符串中的所有字符。
  • 可以在字符串对象上使用像endswith、startswitch、 isalpha、 islower、 isupper、lower、 upper、 find 、count、replace和strip这样的函数。
  • 可以为重载操作定义特殊方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SegFormer之模型训练

单卡训练&#xff0c;所有配置文件里的【SyncBN】改为【BN】 启动训练 &#xff08;1&#xff09;终端直接运行 python tools/train.py local_configs/segformer/B1/segformer.b1.512x512.ade.160k.py &#xff08;2&#xff09;在编辑器中运行 在 [config] 前面加上’–‘将…

Coremail AI实验室:利用高级语境和视觉智能进行钓鱼邮件检测

在这个日益数字化的时代&#xff0c;对电子邮件安全需求是至关重要的。新兴的高级威胁邮件&#xff1a;应用社工技术的钓鱼邮件&#xff0c;仿冒公检法的钓鱼邮件等等&#xff0c;都需要更高级的防御策略。 Coremail邮件安全人工智能实验室&#xff0c;整合了高级文本语境理解和…

datawhale49期-task02:安装MMSegmentation

task02:安装MMSegmentation 运行环境&#xff1a;window11 ,GPU RTX 4060、CUDA v11.8 1. Pytorch环境 步骤 1. 创建一个 conda 环境&#xff0c;并激活 conda create --name openmmlab python3.8 -y conda activate openmmlabStep 2. 参考 official instructions 安装 PyTor…

抓包分析 TCP 协议

TCP 协议是在传输层中&#xff0c;一种面向连接的、可靠的、基于字节流的传输层通信协议。 环境准备 对接口测试工具进行分类&#xff0c;可以如下几类&#xff1a; 网络嗅探工具&#xff1a;tcpdump&#xff0c;wireshark 代理工具&#xff1a;fiddler&#xff0c;charles&…

vue基础知识四:Vue实例挂载的过程

一、思考 我们都听过知其然知其所以然这句话 那么不知道大家是否思考过new Vue()这个过程中究竟做了些什么&#xff1f; 过程中是如何完成数据的绑定&#xff0c;又是如何将数据渲染到视图的等等 一、分析 首先找到vue的构造函数 源码位置&#xff1a;src\core\instance\…

龙蜥社区安全联盟(OASA)正式成立,启明星辰、绿盟、360 等 23 家厂商重磅加入

7 月 28 日&#xff0c;由启明星辰、绿盟、360、阿里云、统信软件、浪潮信息、中兴通讯&#xff5c;中兴新支点、Intel、中科院软件所等 23 家单位共同发起的龙蜥社区安全联盟&#xff08;OASA&#xff0c;OpenAnolisSecurityAlliance&#xff09;&#xff08;以下简称“安全联…

[xgb] plot tree

xgboost plot tree debug problem1solutionsreference problem2solutionreference problem3solutionreference supplementary explanationplot_tree参数介绍num_treesmodel.get_booster().best_iteration图中信息介绍缺失值叶子的值 训练的XGB模型里有多少棵树 problem1 用xgb…

探索Python编程的技巧:多线程魔法、网络舞台、正则魔法阵与递归迷宫

一 多线程 1.1 进程和线程 进程&#xff1a; 就是一个程序&#xff0c;运行在系统之上&#xff0c;称这个程序为一个运行进程&#xff0c;并分配进程ID方便系统管理。线程&#xff1a;线程是归属于进程的&#xff0c;一个进程可以开启多个线程&#xff0c;执行不同的工作&…

剑指offer-2.1数组

数组 数组可以说是最简单的一种数据结构&#xff0c;它占据一块连续的内存并按照顺序存储数据。创建数组时&#xff0c;我们需要首先指定数组的容量大小&#xff0c;然后根据大小分配内存。即使我们只在数组中存储一个数字&#xff0c;也需要为所有的数据预先分配内存。因此数…

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查

背景 Kotlin作为一门JVM脚本语言&#xff0c;收到很多Java开发者的青睐。 项目采用JavaKotlin混合编程。Spring Boot应用开发&#xff0c;不会发生变动的配置放在本地配置文件&#xff0c;可能会变化的配置放在远程Apollo Server。 问题 因为业务需要&#xff0c;需要增加一…

css学习1

1、样式定义如何显示元素。 2、样式通常保存至外部的css文件中。 3、样式可以使内容与表现分离。 4、css主要有两部分组成&#xff1a;选择器与一条或多条声明。 选择器通常为要改变的html元素&#xff0c;每条声明由一个属性和一个值组成。每个属性有一个值&#xff0c;属性…

Centos7.9上(离线)安装Gitlab

1、下载Gitlab的rpm安装包Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、安装rpm -i gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm&#xff0c;如果依赖缺失&#xff0c;yum安装即可 3、vi /etc/gitlab/gitlab.rb 配置external_url&…

超声波一体气象站的介绍

超声波一体气象站集风速、风向、温湿度、噪声采集、PM2.5和 PM10、CO2、大气压力、光照于一体&#xff0c;采用标准 ModBus-RTU 通信协议&#xff0c;RS485信号输出方式&#xff0c;通信距离可达 2000 米&#xff0c;数据能够通过 485 通信的方式上传至客户的监控软件或 PLC 组…

210、仿真-基于51单片机灭火小车超声波避障温度烟雾控制报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…

Hlang社区-社区主页实现

文章目录 前言首页结构固定导航栏左侧导航itemitem标志头部推荐文章展示ITEM实现ToolTip完整实现首页完整实现前言 废话不多说,直接看到效果,这里的话是我们社区主页,不是产品宣传主页哈: 是的也许你已经发现了这个页面和某个网站长得贼像。没错是这样的,这个布局我确实…

利用OpenCV光流算法实现视频特征点跟踪

光流简介 光流&#xff08;optical flow&#xff09;是运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xff0c;从而计算出相邻帧之间物体的运动信息的一种方法。…

如何将常用的jdbc方法封装起来???

你是否还在为每次新建项目连接数据库而烦恼&#xff1f;&#xff1f;&#xff1f;&#xff08;教你一次代码&#xff0c;简单完成每次连接&#xff09; 1.建立maven项目 还没下载安装或者不会建立maven项目的可以看这里哦&#xff1a;maven的下载安装与配置环境变量&#xff0…

android wifi扫描 framework层修改扫描间隔

frameworks/opt/net/wifi/service/java/com/android/server/wifi/ScanRequestProxy.java 这个也就是说前台应用可以在120s(2分钟) 扫描 4 次 * a) Each foreground app can request a max of* {link #SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS} scan every* {l…

05应用程序设计和文件操作

一、 给应用程序设置菜单栏 比如: 在qt中,如果想要使用菜单栏功能,那么界面的基类要选择QMainWindow,不能选择QWidget QDialog 实现菜单栏步骤如下: 第一步:在UI设计师,直接双击菜单栏 第二步:在UI设计师,修改文本内容和其他设置 进行设置 设置的效果图如下: …

ASP.NET WEB API通过SugarSql连接MySQL数据库

注意&#xff1a;VS2022企业版可以&#xff0c;社区版可能存在问题。实体名称和字段和数据库中的要一致。 1、创建项目&#xff0c;安装SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件结构 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …