参考来源:Vitu.AI

在之前的课程里,我们陆陆续续地了解了数值的不同类型(字符串,整数和浮点数)和两种批量存储数值的数据结构(列表和元组)。

那么这一节课,我们来具体认识一下,我们一直提到的字符(string)到底是什么,以及字典(dict),即另外一种批量存储数值的方式。

字符串是什么?

处理字符串是Python同样为人所知的强大特点之一。作为数据科学家,每天少不了和文本的处理打交道。

让我们来简单地回顾一下,在之前的课堂里我们了解到的关于字符串的应用。

# 将字符串赋值给变量

x = 'Pluto is a planet'
y = "Pluto is a planet"

# 用运算符来判断字符串的布尔值
x == y

如果我们想引用的文本内容里包含单引号,那么我们就选择用双引号来包含这个文本;

类似地,如果我们想引用的文本内容里包含双引号,那么我们就选择用单引号来包含这个文本。

让我们一起来看下面具体的例子:

print("Pluto's a planet!")
print('My dog is named "Pluto"')

如果我们试图用单引号来引用包含单引号的文本,那么不怎么聪明的python会混淆。

举个例子,python会认为下方需要展示的只有‘Pluto’,从而对后面的's a planet!‘产生疑惑,从而报错。

print('Pluto's a planet!‘)

当然啦,如果我们坚持用单引号,那么我们还是可以用反斜杠()解决python报错的问题的。

让我们来看下面的解决办法:

print('Pluto\'s a planet!')

又或者,我们可以用三引号来解决这个问题。

简单的来说,只要在想引用的文本前后,加上三个单引号,无论文本内容是否包含单引号或者双引号,python都会认识。

print('''Pluto's a planet!''')

讲远一点,对于print()这个函数,值得一提的是,它自带了换行的功能。除非,我们通过参数end来特地强调,不需要换行。

让我们来看看下方的例子:

print("hello")
print("world")
print("hello", end='')
print("pluto", end='')

那么,关于print()这个函数里的参数要转行的时候,我们怎么解决呢?

自然是用我们刚刚才了解反斜杠(),即escaping来解决。
让我们来看看下方的例子:

hello = "hello\nworld"
print(hello)

让我们再来总结一下,关于反斜杠()的用法吧。

what you type ... what you get example print(example)
' ' 'What's up?' What's up?
" " "That's "cool"" That's "cool"
\ \ "Look, a mountain: /\" Look, a mountain: /\
n 换行 "1n2 3" 1
2 3

字符串是序列

字符串可以被认为是字符序列。

上一节课里,我们了解的所有我们可以对列表做的事情,我们也可以对一个字符串做同样的处理。

# 索引(indexing)

planet = 'Pluto'
planet[0]
# 切片(slicing)

planet[-3:]
# 字符串有多长?

len(planet)
# 是的,我们也可以循环这个字符串

[char+'! ' for char in planet]

但是,字符串有一个明显区别于列表的属性,字符串和元组一样也是不可以修改的。

# 当我们想要改变现有字符的值时,python会出错

planet[0] = 'B'
# 当我们想要添加新的字符的值时,python也会出错

planet.append('s')

字符串的方法

之前的课程里,我们介绍过方法(method)是一个对象(object)自己可以调用的函数。

那么,对于一个字符串,有哪些方法可以调用呢?让我们来看一些例子吧。

# 把全句话改为大写

claim = "Pluto is a planet!"
claim.upper()
# 再把全句话改为小写

claim.lower()
# 查找某一个字母在字符串的索引位置

claim.index('o')
# 判断一个字符串是否从某一个单词开始
# 我们在上方定义过 `planet = 'Pluto'`

claim.startswith(planet)
# 判断一个字符串是否以某一个单词结束

claim.endswith('dwarf planet')

接下来,我们要介绍两个新的方法,既适用于字符串,也适用于列表。

str.split()可以将一个字符串转换为一个较小的字符串列表,没有特殊说明的时候以空格为分割的界限。

这对于将我们从一个大字符串分割到一个一个单词组成的列表是非常有用的。

words = claim.split()
words

如果我们想处理其他格式的字符串,我们可以给split()这个函数输入参数。

让我们来看一个例子:

datestr = '1956-01-31'
year, month, day = datestr.split('-')

print(year)
print(month)
print(day)

str.join()是一个和str.split()相反的函数,它可以将一串字符串拼接成一个长字符串。

具体来说,两个函数是用一样的参数,只是排布的位置不一样:

str.join(seperator)

seperator.join(str)

'/'.join([month, day, year])
# 我们可以使用任意的字符串作为我们想用连接的节点。

' ? '.join([word.upper() for word in words])

在第一课的时候,我们就说过,加号(+)和乘号(*)在python里被给予了特殊的魔力。我们可以直接用它们来处理字符串。

让我们来看个例子:

planet + ', we miss you.'

但是,值得注意的是,加号(+)只能处理同类型的事物。

# 当我们混合`str`和`int`两种类型的数值时,pyhton会出错

position = 9
planet + ", you'll always be the " + position + "th planet to me."
# 我们需要先把所有事物转换为`str`

planet + ", you'll always be the " + str(position) + "th planet to me."

上方的代码看起来有些杂乱,str.format()这个函数可以帮我们让这一行代码看起来更整洁。

"{}, you'll always be the {}th planet to me.".format(planet, position)

这样的代码看起来是不是整洁一点了呢?

str.format()这个函数可以帮我们自动调节事物的格式为字符串。其中,在我们要插入值的地方用大括号{}来占位表示。

format()这个函数还可以做的更多,让我们来看个例子:

pluto_mass = 1.303 * (10**22)
earth_mass = 5.9722 * (10**24)
population = 52910390

"{} weighs about {:.2} kilograms ({:.3%} of Earth's mass). It is home to {:,} Plutonians.".format(
  planet, pluto_mass, pluto_mass / earth_mass, population,)

让我们按照顺序一一来解读大括号{}的内容吧:

{:.2} 表示保留到两位小数

{:.3%} 表示保留到三位小数的百分号形式

{:,} 表示用千分位分隔符

# 同样的,`format()`同样可以用索引的方式来赋值。
# 我们还用到了三个单引号来引用文本

s = '''Pluto's a {0}.
No, it's a {1}.
{0}!
{1}!'''.format('planet', 'dwarf planet')

print(s)

str.format()这个函数有很多不同的用法。

如果你还感兴趣的,可以查看这里的更多介绍pyformat.info或者官方说明the official docs。

字典(Dictionaries)

字典(Dict)是一种内置的python数据结构,用于将键(key)映射(map)到值(value)。

让我们来看个例子:

numbers = {'one':1, 'two':2, 'three':3}

在这个例子中,“one”、“two”和“three”是键,1、2和3是它们的对应值。

字典对获取值是很有友好的,可以通过方括号的语法来访问,类似于索引到列表和字符串。

让我们一起来看看下面的例子:

numbers['one']

值得一提的是,字典和列表一样是可以编辑的。

# 让我们添加一个新的键和值的映射

numbers['eleven'] = 11
numbers
# 让我们更换现有的键相对应的值

numbers['one'] = 'Pluto'
numbers

字典解析

和列表解析类似,字典这个数据结构也有字典解析的属性。

让我们来看个例子:

planets = ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']

planet_to_initial = {planet: planet[0] for planet in planets}
planet_to_initial

in也可以用于字典,来判断当前字典是否拥有这个键:

'Mercury' in planet_to_initial
'Moon' in planet_to_initial

一般情况下,字典的键可以用来循环:

for i in planet_to_initial:
    print("{} = {}".format(i, planet_to_initial[i]))

对于字典,我们可以分别使用dict.keys()和dict.values()访问这个字典里的所有键或所有值的集合。

让我们再来看一个更有趣的操作:

# 从字典`planet_to_initial`里拿到所有行星的首字母,用空格把它们组合起来

' '.join(sorted(planet_to_initial.values()))

之前说到,字典的键可以用来循环,通过dict.items()这个函数,字典的键和值可以一起相应地循环。

让我们一起来了解一下:

# 还记得反斜杠的用法和意义吗?

for planet, initial in planet_to_initial.items():
    print("{} begins with \"{}\"".format(planet.rjust(10), initial))

原文地址:初始python【今天开始写代码】第六课


VituTech
1 声望2 粉丝