为了丰富学员们的课外知识,老师让我们助理分享这套Python系列教程。由于Python教程并非老师所写,所以不如老师的AI教学风趣幽默,望大家见谅!想要学习AI技术的新朋友可以去www.captainbed.net。本公众号由助理负责运营,只免费分享课外知识,不回复任何私信。


注意在上一篇文章的例子中,没有通过任何操作对原始的字符串进行改变。因为字符串在Python中具有不可变性——在创建后不能就地改变。

例如,不能通过对其某一位置进行赋值而改变字符串,但是你总是可以通过建立一个新的字符串并以同一个变量名对其进行赋值:

.>>> S

'Spam'

.>>> S[0] = 'z'             # Immutable objects cannot be changed

...error text omitted...

TypeError: 'str' object does not support item assignment

.>>> S = 'z' + S[1:]        # But we can run expressions to make new objects

.>>> S

'zpam'

在Python中的每一个对象都可以分为不可变性或者可变性。在核心类型中,数字、字符串和元组是不可变的;列表和字典不是这样(它们可以完全自由地改变)。在其他方面,这种不可变性可以用来保证在程序中保持一个对象固定不变。

目前我们学习过的每一个字符串操作都是通用的序列操作。也就是说,这些操作在Python的其他序列中也会工作,包括列表和元组。但是,除了一般的序列操作,字符串还有独有的一些操作。

例如,字符串的find方法是一个基本的子字符串查找的操作(它将返回一个传入的子字符串的偏移量,如果没有找到的话就返回-1),而字符串的replace方法将会对全局进行搜索并替换。

.>>> S.find('pa')            # Find the offset of a substring

1

.>>> S

'Spam'

.>>> S.replace('pa','XYZ')  # Replace occurrences of a substring with another

'SXYZm'

.>>> S

'Spam'

注意上面的代码都不会改变原始的字符串,而是会创建一个新的字符串作为结果——因为字符串具有不可变性。字符串方法将是Python中文本处理的头号工具。除了上面的方法外,还有其他的方法能够实现通过分隔符将字符串拆分为子字符串,大小写变换,测试字符串的内容(数字、字母或其他),去掉字符串后的空格字符等等。

.>>> line = 'aaa,bbb,ccccc,dd'

.>>> line.split(',')                # Split on a delimiter into a list of substrings

['aaa','bbb','ccccc','dd']

.>>> S = 'spam'

.>>> S.upper()                      # Upper- and lowercase conversions

'SPAM'

.>>> S.isalpha()                    # Content tests: isalpha,isdigit,etc.

True

.>>> line = 'aaa,bbb,ccccc,dd\n'

.>>> line = line.rstrip()           # Remove whitespace characters on the right side

.>>> line

'aaa,bbb,ccccc,dd'

字符串还支持一个叫做格式化的高级替代操作:

.>>> '%s,eggs,and %s' % ('spam','SPAM!')       # Formatting expression (all)

'spam,eggs,and SPAM!'

.>>> '{0},eggs,and {1}'.format('spam','SPAM!') # Formatting method (2.6,3.0)

'spam,eggs,and SPAM!'

注意:尽管序列操作是通用的,但方法是不通用(虽然某些方法名相同,但字符串的方法只能用于字符串)。一条简明的法则是这样的:可作用于多种类型的通用型操作都是以内置函数或表达式的形式出现的[例如,len(X),X[0]],但是类型特定的操作是以方法调用的形式出现的[例如,aString.upper()]。