Python 中的str是一种不可变序列,由 Unicode 码点组成。
这些码点可以包括字母、变音符号、定位字符、数字、货币符号、emoji、标点、空格和换行符等等。
由于不可变,str对象在内存中的值不会改变;那些看起来会修改字符串的方法,实际返回的是该str对象的新副本或新实例。
str字面量可以用单引号'或双引号"声明。需要时可以使用转义字符\。
>>> single_quoted = 'These allow "double quoting" without "escape" characters.'
>>> double_quoted = "These allow embedded 'single quoting', so you don't have to use an 'escape' character."
>>> escapes = 'If needed, a \'slash\' can be used as an escape character within a string when switching quote styles won\'t work.'
多行字符串用'''或"""声明。
>>> triple_quoted = '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
Line break characters, tabs and other whitespace are fully supported.
You\'ll most often encounter these as "doc strings" or "doc tests" written just below the first line of a function or class definition.
They\'re often used with auto documentation ✍ tools.
'''
字符串可以用+运算符拼接。
这种方法应尽量少用,因为它性能不佳,也不容易维护。
language = "Ukrainian"
number = "nine"
word = "дев'ять"
sentence = word + " " + "means" + " " + number + " in " + language + "."
>>> print(sentence)
...
"дев'ять means nine in Ukrainian."
如果需要把list、tuple、set或其他由单个字符串组成的集合合并成一个str,<str>.join(<iterable>)是更好的选择:
# str.join() makes a new string from the iterables elements.
>>> chickens = ["hen", "egg", "rooster"] # Lists are iterable.
>>> ' '.join(chickens)
'hen egg rooster'
# Any string can be used as the joining element.
>>> ' :: '.join(chickens)
'hen :: egg :: rooster'
>>> ' 🌿 '.join(chickens)
'hen 🌿 egg 🌿 rooster'
# Any iterable can be used as input.
>>> flowers = ("rose", "daisy", "carnation") # Tuples are iterable.
>>> '*-*'.join(flowers)
'rose*-*daisy*-*carnation'
>>> flowers = {"rose", "daisy", "carnation"} # Sets are iterable, but output order is not guaranteed.
>>> '*-*'.join(flowers)
'rose*-*carnation*-*daisy'
>>> phrase = "This is my string" # Strings are iterable, but be careful!
>>> '..'.join(phrase)
'T..h..i..s.. ..i..s.. ..m..y.. ..s..t..r..i..n..g'
# Separators are inserted **between** elements, but can be any string (including spaces).
# This can be exploited for interesting effects.
>>> under_words = ['under', 'current', 'sea', 'pin', 'dog', 'lay']
>>> separator = ' ⤴️ under'
>>> separator.join(under_words)
'under ⤴️ undercurrent ⤴️ undersea ⤴️ underpin ⤴️ underdog ⤴️ underlay'
# The separator can be composed different ways, as long as the result is a string.
>>> upper_words = ['upper', 'crust', 'case', 'classmen', 'most', 'cut']
>>> separator = ' 🌟 ' + upper_words[0]
>>> separator.join(upper_words)
'upper 🌟 uppercrust 🌟 uppercase 🌟 upperclassmen 🌟 uppermost 🌟 uppercut'
str中的码点可以从左侧通过0-based index来引用:
creative = '창의적인'
>>> creative[0]
'창'
>>> creative[2]
'적'
>>> creative[3]
'인'
从右侧同样可以取下标,起始为-1-based index:
creative = '창의적인'
>>> creative[-4]
'창'
>>> creative[-2]
'적'
>>> creative[-1]
'인'
Python 中没有单独的“字符”或“rune”类型,所以对字符串取下标会得到一个新的、长度为 1 的str:
>>> website = "exercism"
>>> type(website[0])
<class 'str'>
>>> len(website[0])
1
>>> website[0] == website[0:1] == 'e'
True
可以通过切片表示法选取子字符串,使用<str>[<start>:stop:<step>]来生成新字符串。
结果不包含stop下标。
如果未给出start,起始下标就是 0。
如果未给出stop,stop下标就是字符串的末尾。
moon_and_stars = '🌟🌟🌙🌟🌟⭐'
sun_and_moon = '🌞🌙🌞🌙🌞🌙🌞🌙🌞'
>>> moon_and_stars[1:4]
'🌟🌙🌟'
>>> moon_and_stars[:3]
'🌟🌟🌙'
>>> moon_and_stars[3:]
'🌟🌟⭐'
>>> moon_and_stars[:-1]
'🌟🌟🌙🌟🌟'
>>> moon_and_stars[:-3]
'🌟🌟🌙'
>>> sun_and_moon[::2]
'🌞🌞🌞🌞🌞'
>>> sun_and_moon[:-2:2]
'🌞🌞🌞🌞'
>>> sun_and_moon[1:-1:2]
'🌙🌙🌙🌙'
还可以用<str>.split(<separator>)把字符串拆成更小的字符串,它会返回一个由子字符串组成的list。
如有需要,还可以对这个列表继续取下标或拆分。
不传任何参数调用<str>.split()时,会按空白字符拆分字符串。
>>> cat_ipsum = "Destroy house in 5 seconds mock the hooman."
>>> cat_ipsum.split()
...
['Destroy', 'house', 'in', '5', 'seconds', 'mock', 'the', 'hooman.']
>>> cat_ipsum.split()[-1]
'hooman.'
>>> cat_words = "feline, four-footed, ferocious, furry"
>>> cat_words.split(', ')
...
['feline', 'four-footed', 'ferocious', 'furry']
<str>.split()的分隔符可以不止一个字符。
拆分匹配时使用的是整个字符串。
>>> colors = """red,
orange,
green,
purple,
yellow"""
>>> colors.split(',\n')
['red', 'orange', 'green', 'purple', 'yellow']
字符串支持所有常见序列操作。
可以用for item in <str>在循环中逐个迭代各个码点。
可以用for index, item in enumerate(<str>)在循环中同时迭代下标_和_元素。
>>> exercise = 'လေ့ကျင့်'
# Note that there are more code points than perceived glyphs or characters
>>> for code_point in exercise:
... print(code_point)
...
လ
ေ
့
က
ျ
င
်
့
# Using enumerate will give both the value and index position of each element.
>>> for index, code_point in enumerate(exercise):
... print(index, ": ", code_point)
...
0 : လ
1 : ေ
2 : ့
3 : က
4 : ျ
5 : င
6 : ်
7 : ့
你在帮妹妹做英语词汇作业,她觉得这份作业很枯燥。她班上学的是通过添加_前缀_和_后缀_来造新词。老师会给出一组单词,要求把前缀加到词首、把后缀加到词尾,造出拼写正确的变形词。
这份作业有四个活动,每个活动都有一组文本或单词需要处理。
英语中最常见的前缀之一是un,意思是“不”。在这个活动中,妹妹需要给单词加上un,造出表示否定,也就是“不”的单词。
实现add_prefix_un(<word>)函数,它接收word作为形参,返回加上un前缀后的新单词:
>>> add_prefix_un("happy")
'unhappy'
>>> add_prefix_un("manageable")
'unmanageable'
妹妹的课上还在学习另外四个常见前缀:en(意为“放入”或“覆盖”)、pre(意为“之前”或“向前”)、auto(意为“自己”或“相同”)和inter(意为“之间”或“在……之中”)。
在这个练习中,班上的同学用这些前缀把词汇分组,方便一起学习。每个前缀都放在一个数组里,里面是常与它搭配的单词。同学们需要套用这个前缀,生成一个字符串,展示前缀加到所有单词上的结果。
实现make_word_groups(<vocab_words>)函数,它以如下形式的vocab_words为形参:[<prefix>, <word_1>, <word_2> .... <word_n>],并返回一个字符串,其中前缀已加到每个单词上,形如:'<prefix> :: <prefix><word_1> :: <prefix><word_2> :: <prefix><word_n>'。
这里不需要写for或while循环来处理输入。仔细想想,改用哪些字符串方法(以及分隔符)可以做到。
>>> make_word_groups(['en', 'close', 'joy', 'lighten'])
'en :: enclose :: enjoy :: enlighten'
>>> make_word_groups(['pre', 'serve', 'dispose', 'position'])
'pre :: preserve :: predispose :: preposition'
>> make_word_groups(['auto', 'didactic', 'graph', 'mate'])
'auto :: autodidactic :: autograph :: automate'
>>> make_word_groups(['inter', 'twine', 'connected', 'dependent'])
'inter :: intertwine :: interconnected :: interdependent'
ness是一个常见的后缀,意思是_“状态”_。在这个活动中,妹妹需要去掉ness后缀,找出原本的词根。不过当然,还有一些恼人的拼写规则:如果词根本来以辅音加“y”结尾,那么这个“y”就变成了“i”。去掉“ness”后,需要把这些词根里的“y”还原回来。例如happiness --> happi --> happy。
实现remove_suffix_ness(<word>)函数,它接收一个word,返回去掉ness后缀后的词根。
>>> remove_suffix_ness("heaviness")
'heavy'
>>> remove_suffix_ness("sadness")
'sad'
后缀常用来改变一个单词的词性。英语里有一种常见的做法,叫“动词化”,也就是给形容词加上en后缀,让它_变成_动词。
在这个任务中,妹妹要从句子里提取形容词并把它变成动词,练习“动词化”。好在,这里需要变形的词都是“规则”的,加上后缀时不需要改变拼写。
实现adjective_to_verb(<sentence>, <index>)函数,它接收两个形参:一个使用该词汇的sentence,以及句子拆分后该单词的index。函数应返回提取出的形容词所对应的动词。
>>> adjective_to_verb('I need to make that bright.', -1 )
'brighten'
>>> adjective_to_verb('It got dark as the sun set.', 2)
'darken'