引用自:https://mp.weixin.qq.com/s/4y8XjA-ZGc_KzAnGJ_PF6Q
作 者: 邹琪鲜 PythonerCN 3月12日
3.4函数、对象、方法
在前面的学习过程中,我们已经用到了一些函数和方法,也提到过对象这个词,但你可能会发现,前面提到的函数和方法,看着好像有些类似,比如ord( )、turtle.right( )。现在我们要对字符串做更多的操作,就会用到更多的方法和函数,在这之前,我们先搞清楚一些概念。
3.4.1函数
函数是用来解决特定问题的一段小程序,函数程序都会封装起来,所以用户不用看函数的代码是怎么写的,只要知道函数怎么用就可以了。函数可以处理用户提供的数据,做处理后给用户提供返回值。函数的好处就是减少重复的程序。
Python提供了很多类型的函数,针对字符串的就不少,比如,我们可以通过len()获取字符串的长度:
>>> len(‘hello‘)
|
像这样的函数Python自带的,叫做内建函数,像len()这种不是某个类型专用的函数相对来说是通用的,针对性不强。我们也可以用来获取其他类型的序列的长度,比如列表的元组。其他相关的内建函数还有max()、min()、sum()和reversed()等,至于有什么作用?你自己试一下应该就知道了。
另外,我们也可以通过内建函数str()将其他类型的数据转化为字符串:
>>> numInt = 12345
|
但转化是很生硬的,比如最后的列表实际是转化成了含有‘[’、‘,’和‘]’的字符串,如果想要变成其他形式就需要专门的方法了。
3.4.2对象和方法
每个类型都有对应的对象,这句话就好像我们现在说数据类型,说整数、浮点、字符串这些都是值的类别,说起来都是抽象的定义,简称为类。而看到100、3.14、‘hero’这些值的时候,我们可以称之为整数对象、浮点对象、字符串对象,这些对象是具备了其对应类别全部特征的一个实例。
类在定义的时候,定义一些功能,方式跟函数一样,这些功能可以被类实例化出来的对象所调用,通常我们称之为方法。所以说,方法实际就是函数的另一种形态,区别在于,方法只能被这个类的对象所调用,对象通过点标记调用方法,比如让字符串“hello”首字母大写就是:
>>> ‘hello world‘.capitalize()
|
所有的字符串方法可以通过dir()和help()看到:
>>> dir(str) [‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__rmod__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘capitalize‘, ‘casefold‘, ‘center‘, ‘count‘, ‘encode‘, ‘endswith‘, ‘expandtabs‘, ‘find‘, ‘format‘, ‘format_map‘, ‘index‘, ‘isalnum‘, ‘isalpha‘, ‘isdecimal‘, ‘isdigit‘, ‘isidentifier‘, ‘islower‘, ‘isnumeric‘, ‘isprintable‘, ‘isspace‘, ‘istitle‘, ‘isupper‘, ‘join‘, ‘ljust‘, ‘lower‘, ‘lstrip‘, ‘maketrans‘, ‘partition‘, ‘replace‘, ‘rfind‘, ‘rindex‘, ‘rjust‘, ‘rpartition‘, ‘rsplit‘, ‘rstrip‘, ‘split‘, ‘splitlines‘, ‘startswith‘, ‘strip‘, ‘swapcase‘, ‘title‘, ‘translate‘, ‘upper‘, ‘zfill‘] |
方法很多,但也不用刻意去背,随时可以查找到,比如我们在IDLE中输入对象和点后,只要按Tab就可以看到提示效果了,这时列出的是所有方法,按字母排序,默认为第一个,选择要用的就可以了:
图Tab补全方法
如果想更快找到你要用的那个,你可以在点后输入前几个字母也可以,比如我要用find方法,就可以输入f再Tab:
图Tab补全方法
其中有很多使用且比较有意思的功能,我来介绍一下。首先,就是刚刚我们看到的find方法,作用是查找指定字符串中是否含有给定的子串:
>>> hero = "player01 100"
|
如果找到了,那么返回值是第一个字符的索引,如果没找到则返回-1
,如果有多个重复元素,则返回第一次出现的索引,那如果是想找到第二个或第三个呢?
解决问题的思路:有了问题,那接下来就是解决问题的思路了,因为通常你在学习的时候并不会一下把所有的知识点都学下来,事实上对于编程来讲也没有必要。所以现在我们就一起来理顺一下这个思路吧。首先,既然在字符串中查找子串返回的是索引,那么如果在查找的时候跳过不需要的索引开始查找是不是就行了呢?但是现在我们并没有讲到,或者我并不知道有没有这样的方法的时候,就可以从你要操作的对象入手,查找是否有相关的方法,比如我们现在要查找字符串子串。可以先从find入手看看有没有其他的用法,没有其他用法再看其他方法,从方法列表中还会发现一个rindex()方法,然后再通过help()看一下具体的说明是否可以实现你的想法。下面看下这个过程。 |
首先从find入手:
>>> help(str.find)
|
这里的str代表字符串这个类型,并不是哪一个字符串。通过help()发现,原来find()还有可选参数,我们看到的方括号即是表示可选参数,这里的可选参数作用是指定查找的起止索引范围,所以,我们只要跳过已找到的第一个元素的索引,再找到的就是第二个了,这个例子我们用了方法的嵌套,就是方法里面还有方法,执行顺序是先执行方法内的方法,并将返回值作为参数传递给上层方法。其实没什么高深的,还是取决于方法所返回的值:
>>> hero = "player01 100"
|
翻看其他方法你会发现还有一个方法名字有index的rindex()方法:
>>> help(str.rindex)
|
通过help()发现原来跟find查找方向相反是从右向左查找:
>>> hero = "player01 100"
|
除了刚才用到的嵌套,我们还可以把方法和函数通过点标记连接起来用,我们看下面的例子:
>>> hero = "Player01 100"
|
3.4.3切割和拼接
有些时候我们需要从字符串或文件中中提取一些有规律的数据,比如,这里有一个记录了很多人信息的文件,每一行存放了一个人的几项纪录。我们以一行为例,这些记录都通过空格分隔,然后我们要从中提取一些信息,比如这个人的名字:
>>> milo = "milo 18 180 140"
|
原本长短不一的字符串,经过分割变成了四个整体,这样就好操作了,再比如计算机的IP地址,最左后一段的主机地址:
>>> ip = "192.168.1.123"
|
现在我们可以把字符串分割成列表,反过来也可以把列表拼接成字符串,方法是以指定的字符串把列表的各个元素连接起来:
>>> ip = [‘192‘, ‘168‘, ‘1‘, ‘123‘]
|
3.4.4字符串模块
除了内置函数、方法之外,python还提供了一个string模块,用来提供更多的功能,我们先来看一下:
>>> import string
|
我们可以在其中看到一些属性,是一些特殊的字符串,比如所有的小写英文字母,0-9的整数,所有符号等。用法其实也很多,比如我们要写个程序,需要验证用户输入的是一个整数,还是字母数字的组合、去掉字符串中的所有标点符号等等。同时里面也提供了一些方法,help()就可以看到。
原文地址:https://www.cnblogs.com/hfbk/p/9440022.html