查看原文
其他

字符串的小帮手之ascii()、str()和repr()函数

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:俞诗琪

文字编辑:余术玲

技术总编:张   邯

重磅!!!爬虫俱乐部将于2019年10月2日至10月5日在湖北武汉举行Python编程技术培训,本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python编程技术,尤其是爬虫技术和文本分析技术。该培训目前在火热招生中,点击《爬虫俱乐部2019十一Python编程技术培训报名啦!》,了解培训详细信息,抓紧时间报名吧!另外,2019年8月22日至28日在湖北武汉举行的Stata编程技术培训,高级班招生已经结束,初级班仅剩几个名额感兴趣的同学可打开爬虫俱乐部往期推文——《爬虫俱乐部2019暑假stata编程训练营报名啦!报名,不要错过机会哦! 

用Python处理数据时,时常要解决不同类型数据的拼接问题,如下程序所示:
In [1]: 'he was born in '+2019

结果:

TypeError: must be str,not int
当对象为字符串数据和数值型数据时,若直接用“+”号将两者拼接起来,结果会出现“TypeError”的报错提醒,这是因为“+”号适用于字符串间的连接,却不适用于数值型数据,所以此处给数字2019加上引号即可。但当我们需要拼接多对数据时,简单地给每个数字加上引号显然过于繁琐,由此我们需要运用打印字符串的函数str()并通过for语句进行循环,依次将多个数字转化为字符串进行拼接,如下所示:
In [2]: for num in 2019,2018,2017: print('he was born in '+str(num))

结果:

he was born in 2019he was born in 2018he was born in 2017
正如各位所见,内置函数str()具有将非字符串数据转化为字符串的功能,除此以外,函数ascii()和函数repr()也有类似的功能,将程序中的str()函数替换成ascii()repr()函数也能产生相同结果。本文将分别介绍以上三个内置函数的用法,并借用简单的例子,帮助区别它们之间的差别,以便大家更好地理解和掌握。


1、ascii()函数
上文已有提及,ascii()函数是一个将对象的形式转换为字符串的内置函数,它适用于多种形式的数据,如数字、字符串、字典、列表等等,使用起来也特别简单,其语法形式是ascii(object),object表示需要转换的数据对象,示例如下:
In [3]: ascii(123456)  #转换对象为数字Out[3]: '123456'In [4]: ascii("python")  #转换对象为字符串Out[4]: "'python'"In [5]: ascii([2019,"pig"])  #转换对象为列表Out[5]: "[2019, 'pig']"In [6]: ascii({2019:"pig",2018:"dog"})   #转换对象为字典Out[6]: "{2019: 'pig', 2018: 'dog'}"
可以看到,以上程序的输出结果,与输入数据在外观上一致,仅仅形式上变为字符串。特别的是,若输入的是字符串形式数据时,ascii()函数返回值会在字符串外围多一个引号,且字符串或列表、字典等数据中包含的转义字符,经输出后会多一条反斜杠“\”进行修饰。事实上小编还“藏了一手”,不知道大家是否发现,以上输入的皆是ASCII编码过的数据,但对于非ASCII码的数据,ascii()函数会有什么样的表现呢?
In [7]: ascii("爬虫俱乐部")Out[7]: "'\\u722c\\u866b\\u4ff1\\u4e50\\u90e8'"
正如上面例子所示,文字“爬虫俱乐部”未被ASCII编码,被ascii()函数转化为相应的Unicode编码的字符串形式输出,理解不同的编码方式可以参考我们往期推文——《带你走进编码的世界——Unicode编码》。因此该函数正如其名,适用于输出ASCII码的数据,但对于非ASCII码的数据,则会用\x\u等编码的字符代替非ASCII部分,ASCII码部分数据则原样转成字符串形式输出。


2、str()
str()函数用于返回字符串形式的数据对象,语法结构类似ascii()函数,即str(object),它一个显著的特点是,其返回对象的内容,相对于机器语言更便于人们阅读。同样,str()函数也适用于数字、字符串、字典、列表等形式数据,如下图程序所示:
In [8]: str(123456) #转换对象为数字Out[8]: '123456'In [9]: str("python") #转换对象为字符串Out[9]: 'python'In [10]: str([2019,"pig"]) #转换对象为列表Out[10]: "[2019, 'pig']"In [11]: str({2019:"pig",2018:"dog"}) #转换对象为字典Out[11]: "{2019: 'pig', 2018:'dog'}"
对比函数ascii()的输出结果可知,输入同样的字符串数据时,函数str()返回值就没有多加一个引号或反斜杠“\”以修饰结果了。值得关注的是,函数str()对于非ASCII编码的数据,也能输出与原目标一致的字符串形式,且我们可借助print()函数,将函数str()中的转义符表达出来,使得函数str()的返回内容具有人类可读性:
In [12]: print(str("爬虫\n俱乐部"))

结果:

爬虫俱乐部
除此之外,对于用\x\u开头的编码str()函数还可以输出经Unicode编码转换的字符串:
In [13]: str('\u722c\u866b\u4ff1\u4e50\u90e8')Out[13]: '爬虫俱乐部'


3、repr()
repr()函数同样是返回对象的字符串形式,其输出的字符串形式具有解释器可读取的特点。对于具有人类可读性形式的数据,repr()函数只能输出加以引号、反斜杠等修饰的形式,该形式适合机器读取,可能不便于人们阅读。repr()函数的语法为repr(object),对象可为数字、字符串、字典、列表等形式数据,如下图程序所示:
In [14]: repr(123456)  #转换对象为数字Out[14]: '123456'In [15]: repr("python")  #转换对象为字符串Out[15]: "'python'"In [16]: repr([2019,"pig"]) #转换对象为列表Out[16]: "[2019, 'pig']"In [17]: repr({2019:"pig",2018:"dog"})  #转换对象为字典Out[17]: "{2019: 'pig', 2018:'dog'}"
显然,当转换对象是ASCII码时,repr()函数的结果与ascii()函数一致。对于非ASCII码,repr()函数也能输出与原目标一致的字符串形式,但对于字符串中的转义符,没有str()函数的输出结果那么便于人理解:
In [18]: repr("爬虫\n俱乐部")Out[18]: "'爬虫\\n俱乐部'"
同str()函数一样,对于用\x\u等编码的字符,repr()函数也可输出经Unicode编码转换的字符串
In [19]: repr('\u722c\u866b\u4ff1\u4e50\u90e8')Out[19]: "'爬虫俱乐部'"


4、函数ascii()、str()和repr()的区分
讲了这么多,大家是不是有点晕呢?没关系,下面我们总结了一个简单的表格,帮助大家区分这三种函数的关系:  

程序

结果

print(ascii("爬虫俱乐部\n"))

'\u722c\u866b\u4ff1\u4e50\u90e8\n'

print(str('\u722c\u866b\u4ff1\u4e50\u90e8\n'))

爬虫俱乐部

 

print(repr('\u722c\u866b\u4ff1\u4e50\u90e8\n'))

'爬虫俱乐部\n'

print(ascii('\u722c\u866b\u4ff1\u4e50\u90e8\n'))

'\u722c\u866b\u4ff1\u4e50\u90e8\n'

总的来说,三种函数的参数都可以是数字、字符串、字典、列表等对象,区别在于,str() 函数的返回值是便于人类阅读的,例如可将数据中转义字符串“\n”表达成换行,而repr() 输出解释器可读的结果,在转义字符串“\n”前会多加一个反斜杠以修饰。对于ascii() 函数来说,当目标是ASCII码时作用与repr() 函数相似,目标是非ASCII码时则有不同的表示方式。ascii() 函数与另外两者函数的区别在于,ascii() 函数不能经Unicode码转换\x\u编码的字符,而后两者可以。


对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

 朝花夕拾—— 如何输出内存中的矩阵与绘图

 朝花夕拾——putdocx批量输出变量观测值

         爬虫俱乐部2019十一Python编程技术培训报名啦!
        Stata16新功能——定义图形元素的绝对大小
        添加docx内容哪家强,Stata16新命令帮你忙
        将数值型计算“一网打尽”——(1)
        将数值型计算“一网打尽”——(2)
         Stata16新功能之“框架”——读入多个数据集(1)
 Stata16新功能——同一个文档,不一样的布局
 手持Python,斗图不输!

 万般进制千机变,Python一计乾坤定——利用Python来进行进制转换

        朝花夕拾——cnstock与cntrade强强联合

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存