3.4 字符串

    字符串是什么

    在上面我们已经初步接触到了字符串,很简单地说,字符串就是……

    3.4 字符串 - 图1

    字符串的基本用法

    现在我们来试着了解一些字符串的基本用法一一合并。请在你的 IDE(也就是前面推荐的 PyCharm) 中输入如下代码,在 IDE 中代码并不能自动运行,所以我们需要手动点击运行,方法是点击右键,选择 Run‘文件名’ 来运行代码。

    what_he_does = ' plays '
    his_instrument = 'guitar'
    his_name = 'Robert Johnson'
    artist_intro = his_name + what_he_does + his_instrument

    print(artist_intro)

    你会发现输出了这样的结果:

    Robert Johnson plays guitar

    也许你会觉得无聊,但实际上这段代码加上界面之后是下图这样的,类似于你在音乐播放器里面经常看到的样子。Robert Johnson是著名的美国蓝调吉他手,被称为与魔鬼交换灵魂的人。

    3.4 字符串 - 图2

    注:本图的GUI图形界面采用了 Python 标准库 TKinter 进行实现

    也许你已经注意到了,上面我们说到变量的时候,有些变量被进行不同形式的赋值。我们现在试着在 IDE 中这样做:

    num = 1
    string = '1'

    print(num + string)

    你一定会得到如下的结果,原因是字符串(string)只是Python中的一种数据类型,另一种数据类型则称之为整数(integer),而不同的数据类型是不能够进行合并的,但是通过一些方法可以得到转换。

    3.4 字符串 - 图3

    插一句,如果你不知道变量是什么类型,可以通过 type() 函数来查看类型,在 IDE 中输入 print(type(word))

    另外,由于中文注释会导致报错,所以需要在文件开头加一行魔法注释 #coding:utf-8 ,也可以在设置里面找到 “File Encodings” 设置为 UTF-8

    接下来,我们来转化数据数据类型。我们需要将转化后的字符串储存在另一个变量中,试着输入这些:

    num = 1
    string = '1'
    num2 = int(string)

    print(num + num2)

    这样被转换成了同种类型之后,就可以合并这两个变量了。

    我们来做一些更有意思的事情,既然字符串可以相加,那么字符串之间能不能相乘?当然可以!输入代码:

    words = 'words' * 3
    print(words)

    你会得到 wordswordswords

    好,现在我们试着解决一个更复杂的问题:

    word = 'a loooooong word'
    num = 12
    string = 'bang!'
    total = string (len(word) - num) #等价于字符串'bang!'4
    print(total)

    到这里,你就掌握了字符串最基本的用法了,Bang!

    字符串的分片与索引

    字符串可以通过 string[x] 的方式进行索引、分片,也就是加一个 [] 。字符串的分片(slice) 实际上可以看作是从字符串中找出来你要截取的东西,复制出来一小段你要的长度,储存在另一个地方,而不会对字符串这个源文件改动。分片获得的每个字符串可以看作是原字符串的一个副本。

    先来看下面这段代码。如果你对字符串变量后面一些莫名其妙的数字感到困惑和没有头绪的话,不妨对照着代码下面的这个表格来分析。

    name = 'My Name is Mike'

    print(name[0])
    'M'
    print(name[-4])
    'M'
    print(name[11:14]) # from 11th to 14th, 14th one is excluded
    'Mik'
    print(name[11:15]) # from 11th to 15th, 15th one is excluded
    'Mike'
    print(name[5:])
    'me is Mike'
    print(name[:5])
    'My Na'

    3.4 字符串 - 图4

    : 两边分别代表着字符串的分割从哪里开始,并到哪里结束。 以 name[11:14] 为例,截取的编号从第11个字符开始,到位置为14但不包含第14个字符结束。 而像 name[5:] 这样的写法代表着从编号为5的字符到结束的字符串分片。 相反, name[:5] 则代表着从编号为0的字符开始到编号为5但不包含第5个字符的字符分片。可能容易搞混,可以想象成第一种是从5到最后面,程序员懒得数有多少个所以就省略地写。第二种是从最前面到5,同样是懒得写0,所以就写成了 [:5] 。 好,现在我们试着解决一个更复杂的问题,来做一个文字小游戏叫做一一“找出你朋友中的魔鬼”。输入代码:
    word = 'friends'
    find_the_evil_in_your_friends = word[0] + word[2:4] + word[-3:-1]
    print(find_the_evil_in_your_friends)
    如果运行正常,你就会发现这样的答案:fiend , 也就发现了朋友中的魔鬼,get到了吗? 再来看一个实际项目中的应用,同样是分片的用法。
    'http://ww1.site.cn/14d2e8ejw1exjogbxdxhj20ci0kuwex.jpg'
    'http://ww1.site.cn/85cc87jw1ex23yhwws5j20jg0szmzk.png'
    'http://ww2.site.cn/185cc87jw1ex23ynr1naj20jg0t60wv.jpg'
    'http://ww3.site.cn/185cc87jw1ex23yyvq29j20jg0t6gp4.gif'
    在实际项目中切片十分好用。上面几个网址(网址经过处理,所以你是打不开的)是使用 Python 编写爬虫后,从网页中解析出来的部分图片链接,现在总共有500余张附有这样链接的图片要进行下载,也就是说我需要给这500张不同格式的图片(png.jpg,gif)以一个统一的方式进行命名。通过观察规律,决定以链接尾部倒数10个字符的方式进行命名,于是输入代码如下:
    url = 'http://ww1.site.cn/14d2e8ejw1exjogbxdxhj20ci0kuwex.jpg'
    file_name = url[-10:]

    print(file_name)
    你会得到这样的结果: 0kuwex.jpg

    字符串的方法

    Python 是面向对象进行编程的语言,而对象拥有各种功能、特性,专业术语称之为——方法(Method)。为了方便理解,我们假定日常生活中的车是“对象”,即car。然后众所周知,汽车有着很多特性和功能,其中"开"就是汽车一个重要功能,于是汽车这个对象使用“开”这个功能,我们在 Python 编程中就可以表述成这样:car.drive()

    3.4 字符串 - 图5

    在理解了对象的方法后,我们来看这样一个场景。很多时候你使用手机号在网站注册账户信息,为了保证用户的信息安全性,通常账户信息只会显示后四位,其余的用 * 来代替,我们试着用字符串的方法来完成这一个功能。

    3.4 字符串 - 图6

    输入代码:

    phone_number = '1386-666-0006'
    hiding_number = phone_number.replace(phone_number[:9],'' 9)
    print(hiding_number)

    其中我们使用了一个新的字符串方法 replace()进行“遮挡”。replace 方法的括号中,第一个 phone_number[:9] 代表要被替换掉的部分,后面的 '' 9 表示将要替换成什么字符,也就是把 乘以9,显示9个

    你会得到这样的结果:*0006

    现在我们试着解决一个更复杂的问题,来模拟手机通讯簿中的电话号码联想功能。

    3.4 字符串 - 图7

    注:在这里只是大致地展示解决思路,真实的实现方法远比我们看到的要复杂

    输入代码:

    search = '168'
    num_a = '1386-168-0006'
    num_b = '1681-222-0006'

    print(search + ' is at ' + str(num_a.find(search)) + ' to ' + str(num_a.find(search) + len(search) + len(search)) + ' of num_a')
    print(search + ' is at ' + str(num_b.find(search)) + ' to ' + str(num_b.find(search) + len(search) + len(search)) + ' of num_b')

    你会得到这样的结果,代表了包含168的所有手机号码

    168 is at 5 to 8 of num_a
    168 is at 0 to 3 of num_b

    字符串格式化符

    a word she can get what she for.

    A.With B.came

    这样的填空题会让我们印象深刻,当字符串中有多个这样的“空”需要填写的时候,我们可以使用 .format() 进行批处理,它的基本使用方法有如下几种,输入代码:

    print('{} a word she can get what she {} for.'.format('With','came'))
    print('{preposition} a word she can get what she {verb} for'.format(preposition = 'With',verb = 'came'))
    print('{0} a word she can get what she {1} for.'.format('With','came'))

    这种字符串填空的方式使用很广泛,例如下面这段代码可以填充网址中空缺的城市数据:

    city = input("write down the name of city:")
    url = "http://apistore.baidu.com/microservice/weather?citypinyin={}".format(city)
    注:这是利用百度提供的天气api实现客户端天气插件的开发的代码片段

    好了,到这里你就掌握了变量和字符串的基本概念和常用方法。

    下一步,我们会继续学习更深一步的循环与函数。