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

引用自: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 = ‘ \t\n\r\x0b\x0c‘

……

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

原文地址:https://www.cnblogs.com/hfbk/p/9440022.html

时间: 2024-11-08 09:49:43

字符串-函数、对象、方法 概念问题的相关文章

ES5新增 数组,字符串,对象方法

数组新增方法 迭代方法:forEach() map() filter() some() every() forEach() // array.forEach(function (currentValue, index, arr)); // currentValue:数组当前项的值 // index: 数组当前项的索引 // arr:数组对象本身 var arr = [1, 2, 3]; arr.forEach(function(value, index, array) { console.log

C++ 理解函数对象与lambda表达式

参考<21天学通C++>第21与第22章节,对函数对象进行介绍,同时通过lambda表达式这一匿名函数对象的简洁方式加深对函数对象的理解.本篇博文的主要内容是: (1) 函数对象的概念: (2) 将函数对象用作谓词: (3) 如何使用函数对象实现一元.二元谓词: (4) 如何编写lambda表达式: (5) 如何将lambda表达式用作谓词: (6) 如何编写可存储和可操作状态的lambda表达式. 一. 函数对象 1. 函数对象的概念和种类 函数对象是C++实体,从概念上讲,函数对象是用作函

函数对象、函数嵌套、名称空间与作用域、装饰器

一 函数对象 1.函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 2.利用该特性,优雅的取代多分支的if def foo(): print('foo') def bar(): print('bar') dic={ 'foo':foo, 'bar':bar, } while True: choice=input('>>: ').strip() if choice in dic: dic[choice]()

python基础之====函数对象、函数嵌套、名称空间与作用域、装饰器

阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if def foo(): print('foo') def bar(): print('bar') dic={ 'foo':foo, 'bar':bar, } while True: choice=input(

李洪强iOS开发之OC[017]函数和方法的区别

// //  main.m //  15 - 函数和对象的方法的区别 // //  Created by vic fan on 16/7/12. //  Copyright © 2016年 李洪强. All rights reserved. // 函数和对象方法的区别 对象方法: - (void)run; #import <Foundation/Foundation.h> @interface Person : NSObject{ @public //定义实例变量 NSString *_nam

STL算法设计理念 - 预定义函数对象

预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象 1)使用预定义函数对象: #include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <vector> #include <functional> using namespace std; // plus,预定义好的函数对象,能实现不同类型数据的 + 运算

STL 算法中函数对象和谓词

STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)"的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待.          这是通过重载类的operator()来实现的.          "在标准库中,函数对象被广泛地使用以获得弹性",标准库中的很多算法都可以使用函数

C++STL 预定义函数对象和函数适配器

预定义函数对象和函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional> 必须包含. 1使用预定义函数对象: void main() { plus<int> intAdd; int x = 10; int y = 20; int z = intAdd(x, y); //等价于 x + y cout << z << endl; plus<string> stringAdd; str

07-04 函数对象与闭包

[TOC] 一 函数对象 函数对象指的是函数可以被当做'数据'来处理,具体可以分为四个方面的使用,我们如下 插图:恶搞图26 1.1 函数可以被引用 >>> def add(x,y): ... return x+y ... >>> func=add >>> func(1,2) 3 1.2 函数可以作为容器类型的元素 >>> dic={'add':add,'max':max} >>> dic {'add': <f