字符串-函数对象方法 概念问题

Posted hfbk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串-函数对象方法 概念问题相关的知识,希望对你有一定的参考价值。

引用自: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‘)

5

 

像这样的函数Python自带的,叫做内建函数,像len()这种不是某个类型专用的函数相对来说是通用的,针对性不强。我们也可以用来获取其他类型的序列的长度,比如列表的元组。其他相关的内建函数还有max()、min()、sum()和reversed()等,至于有什么作用?你自己试一下应该就知道了。

 

另外,我们也可以通过内建函数str()将其他类型的数据转化为字符串:

 

>>>  numInt = 12345

>>>  numFloat = 3.1415926

>>>  numList = [1,2,3,4,5]

>>>  str(numInt)

‘12345‘

>>>  str(numFloat)

‘3.1415926‘

>>>  str(numList)

‘[1,  2, 3, 4, 5]‘

 

 

但转化是很生硬的,比如最后的列表实际是转化成了含有‘[’、‘,’和‘]’的字符串,如果想要变成其他形式就需要专门的方法了。

 

3.4.2对象和方法

每个类型都有对应的对象,这句话就好像我们现在说数据类型,说整数、浮点、字符串这些都是值的类别,说起来都是抽象的定义,简称为类。而看到100、3.14、‘hero’这些值的时候,我们可以称之为整数对象、浮点对象、字符串对象,这些对象是具备了其对应类别全部特征的一个实例。

 

       类在定义的时候,定义一些功能,方式跟函数一样,这些功能可以被类实例化出来的对象所调用,通常我们称之为方法。所以说,方法实际就是函数的另一种形态,区别在于,方法只能被这个类的对象所调用,对象通过点标记调用方法,比如让字符串“hello”首字母大写就是:

 

>>>  ‘hello world‘.capitalize()

‘Hello  world‘

 

所有的字符串方法可以通过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"

>>>  hero.find(‘player01‘)

0

>>>  hero.find(‘100‘)

9

>>>  hero.find(‘0‘)

6

>>>  hero.find(‘milo‘)

-1

 

       如果找到了,那么返回值是第一个字符的索引,如果没找到则返回-1,如果有多个重复元素,则返回第一次出现的索引,那如果是想找到第二个或第三个呢?

 

解决问题的思路:有了问题,那接下来就是解决问题的思路了,因为通常你在学习的时候并不会一下把所有的知识点都学下来,事实上对于编程来讲也没有必要。所以现在我们就一起来理顺一下这个思路吧。首先,既然在字符串中查找子串返回的是索引,那么如果在查找的时候跳过不需要的索引开始查找是不是就行了呢?但是现在我们并没有讲到,或者我并不知道有没有这样的方法的时候,就可以从你要操作的对象入手,查找是否有相关的方法,比如我们现在要查找字符串子串。可以先从find入手看看有没有其他的用法,没有其他用法再看其他方法,从方法列表中还会发现一个rindex()方法,然后再通过help()看一下具体的说明是否可以实现你的想法。下面看下这个过程。

 

      首先从find入手:

>>>  help(str.find)

Help  on method_descriptor:

 

find(...)

    S.find(sub[, start[, end]]) -> int

   

    Return the lowest index in S where  substring sub is found,

    such that sub is contained within  S[start:end].  Optional

    arguments start and end are interpreted  as in slice notation.

   

    Return -1 on failure.

 

这里的str代表字符串这个类型,并不是哪一个字符串。通过help()发现,原来find()还有可选参数,我们看到的方括号即是表示可选参数,这里的可选参数作用是指定查找的起止索引范围,所以,我们只要跳过已找到的第一个元素的索引,再找到的就是第二个了,这个例子我们用了方法的嵌套,就是方法里面还有方法,执行顺序是先执行方法内的方法,并将返回值作为参数传递给上层方法。其实没什么高深的,还是取决于方法所返回的值:

 

>>>  hero = "player01 100"

>>>  hero.find(‘0‘)

6

>>>  hero.find(‘0‘,7)

10

>>>  hero.find(‘0‘,11)

11

>>>  hero.find(‘0‘, hero.find(‘0‘) + 1)

10

 

翻看其他方法你会发现还有一个方法名字有index的rindex()方法:

>>>  help(str.rindex)

Help  on method_descriptor:

 

rindex(...)

    S.rindex(sub[, start[, end]]) -> int

   

    Return the highest index in S where  substring sub is found,

    such that sub is contained within  S[start:end].  Optional

    arguments start and end are interpreted  as in slice notation.

   

    Raises ValueError when the substring is  not found.

       

通过help()发现原来跟find查找方向相反是从右向左查找:

>>>  hero = "player01 100"

>>>  hero.rindex(‘0‘)

11

 

除了刚才用到的嵌套,我们还可以把方法和函数通过点标记连接起来用,我们看下面的例子:

>>>  hero = "Player01 100"

>>>  hero.find(‘A‘)

-1

>>>  hero.upper()

‘PLAYER01  100‘

>>>  hero.upper().find(‘A‘)

2

 

3.4.3切割和拼接

有些时候我们需要从字符串或文件中中提取一些有规律的数据,比如,这里有一个记录了很多人信息的文件,每一行存放了一个人的几项纪录。我们以一行为例,这些记录都通过空格分隔,然后我们要从中提取一些信息,比如这个人的名字:

>>>  milo = "milo 18 180 140"

>>>  zou = "zouqixian 38 185 160"

>>>  milo.split()

[‘milo‘,  ‘18‘, ‘180‘, ‘140‘]

>>>  zou.split()   #默认以空格为分隔符,返回值为一个列表

[‘zouqixian‘,  ‘38‘, ‘185‘, ‘160‘]  

>>>  milo.split()[0]

‘milo‘

>>>  zou.split()[0]

‘zouqixian‘

 

原本长短不一的字符串,经过分割变成了四个整体,这样就好操作了,再比如计算机的IP地址,最左后一段的主机地址:

>>>  ip = "192.168.1.123"

>>>  ip.split(‘.‘)  #自定义分隔符

[‘192‘,  ‘168‘, ‘1‘, ‘123‘]

>>>  ip.split(‘.‘)[-1]

‘123‘

 

现在我们可以把字符串分割成列表,反过来也可以把列表拼接成字符串,方法是以指定的字符串把列表的各个元素连接起来:

>>>  ip = [‘192‘, ‘168‘, ‘1‘, ‘123‘]

>>>  print(ip)

[‘192‘,  ‘168‘, ‘1‘, ‘123‘]

>>>  ".".join(ip)  #以字符串”.“调用join方法拼接列表中的对象

‘192.168.1.123‘

>>>  print(".".join(ip))

192.168.1.123

>>>  print("".join(ip))   #用空字符串拼接

1921681123

>>>  print("aaa".join(ip))  #可自定义任意字符串

192aaa168aaa1aaa123 

 

3.4.4字符串模块

除了内置函数、方法之外,python还提供了一个string模块,用来提供更多的功能,我们先来看一下:

>>>  import string

>>>  help(string)

……

DATA

    __all__ = [‘ascii_letters‘,  ‘ascii_lowercase‘, ‘ascii_uppercase‘, ‘cap...

    ascii_letters =  ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ‘

    ascii_lowercase =  ‘abcdefghijklmnopqrstuvwxyz‘

    ascii_uppercase =  ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘

    digits = ‘0123456789‘

    hexdigits = ‘0123456789abcdefABCDEF‘

    octdigits = ‘01234567‘

    printable =  ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU...

    punctuation =  ‘!"#$%&‘()*+,-./:;<=>[email protected][\]^_`{|}~‘

whitespace = ‘ x0bx0c‘

……

 

我们可以在其中看到一些属性,是一些特殊的字符串,比如所有的小写英文字母,0-9的整数,所有符号等。用法其实也很多,比如我们要写个程序,需要验证用户输入的是一个整数,还是字母数字的组合、去掉字符串中的所有标点符号等等。同时里面也提供了一些方法,help()就可以看到。

以上是关于字符串-函数对象方法 概念问题的主要内容,如果未能解决你的问题,请参考以下文章

逆向及Bof基础实践

10个JavaScript代码片段,使你更加容易前端开发。

10个JavaScript代码片段,使你更加容易前端开发。

20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

20155307刘浩《网络对抗》逆向及Bof基础

20155311高梓云《网络对抗》逆向及Bof基础