
版本信息为家庭中文版, 具体版本号是3.6.4。—str类型特指3的内容里包含了字符串这种数据, 这串字符的类别被规定为 str 类型, 从结构上讲, 它是由一个个码点也就是 code 按照顺序排列组合而成的序列存在, 而且在性质上它属于不可变的那个类型。字符串有三种写法这里分别是单引号, 接下来是双引号, 最后提到的是三引号。用户可以进行单双引号之间的互相嵌套操作, 同时三引号也能够用来嵌套单引号和双引号, 这样的处理方式使得字符串可以扩展为多行数据。如果用户想要实现字符串对自己进行嵌套的情况, 就需要使用反斜杠来进行转义处理。还可以使用str构造函数创建字符串class str()类字符串b, utf-8,注意一下, 第二个构造函数是基于字节准确的说法是类似个字节的, 比如是字节或者别的什么来构造字符串的, 意思就是实现把字节转换成字符串这个功能, 但是必须要正确地写好参数才行。大家必须特别注意这样一个事情, 也就是这个str(bytes, , )这个写法, 它与这个bytes.(, )这个写法, 它们在功能上面是相同的。新当两个字符串字面量仅仅是被空格给隔开的时候, 它们就会被自动合并成为同一个单一的字符串字面量。 sdfs wwwsdfswww (sdfs www)sdfswww sdfs www # 多个空格sdfswww这部分内容存在一定程度的复杂情况, 并非凭借视觉直观即可快速把握全貌, 若希望深入探索相关细节, 则可以借助数字工具进行挖掘操作, 关于这一部分在这里暂时略去不予赘述。字符串本身是不可变的变量, 然而, 在实际操作的过程中, 人们可以通过使用str. join这种方法来创造新的字符串, 同时, 也有办法借助于io模块里面的io函数去构造字符串, 这两个方法的具体原型结构如下所示。str.join()该代码片段涉及将输入输出操作配置为, 在等于空字符串的情况下保持默认状态。对于后者而言, 我们还需要进行深入的挖掘和探究, 而对于前者, 则只稍微懂得一些罢了。自己一直以来没有搞明白字符串前面添加 r、u 做什么现在OK了-r 的意思是, 字符串里所有的字符都代表它们自己的本来的样子, 也就是说, 反斜杠就是一个普通的反斜杠, 它不是被用来做转义操作的, 在正常情况下一比如\n这个写法是表示一个换行符的它是一个单独的字符, 但是如果是在r\n这样的写法里面, 它就是由两个字符组成的, 一个是反斜杠本身, 另外一个是小写字母n。-u 代表这是字符串, 也就是把它当字符处理, 在版本3中保留这个设置是为了和版本2保持兼容。不过在版本3里面, 默认所有的东西都是字符串, 所以就不需要再去额外添加这个标记了, 而且它还不能和 r 放在一起用。repr()函数的具体用途是什么呢? 有些人对它的使用场合感到不太确定。根据菜鸟教程上面提供的解释内容,repr()这个函数的作用是专门用来把某个对象转化为一种能够让解释器直接读取的格式形式的, 并且这种做法会用到eval()函数。接下来呢, 咱们就来一些测试的操作环节。 x n y \n d1 123 f1 999.87 repr(x), repr(y), repr(d1), repr(f1)(n, \\n, 123, 999.87) len(repr(x)), len(repr(y)), len(repr(d1)), len(repr(f1))(3, 4, 3, 6) eval(repr(x)), eval(repr(y)), eval(repr(d1)), eval(repr(f1))(n, \n, 123, 999.87)关于字符串这类对象所包含的属性以及方法, 开发者可以通过调用dir函数来查看其中的所有方法的内容, 在此之中, 能够被外部环境直接进行调用的部分共计有44个之多: for attr in dir(str):print(attr, type(eval(str.%s % attr)))__add____class____contains____delattr____dir____doc____eq____format____ge____getattribute____getitem____getnewargs____gt____hash____init____init_subclass____iter____le____len____lt____mod____mul____ne____new____reduce____reduce_ex____repr____rmod____rmul____setattr____sizeof____str____subclasshook__capitalizecasefoldcentercountencodeendswithexpandtabsfindformatformat_mapindexisalnumisalphaisdecimalisdigitisidentifierislowerisnumericisprintableisspaceistitleisupperjoinljustlowerlstripmaketranspartitionreplacerfindrindexrjustrpartitionrsplitrstripsplitsplitlinesstartswithstripswapcasetitletranslateupperzfillView Codecapitalize, casefold, center, count, encode, endswith, expandtabs,find, format, format_map, index, isalnum, isalpha, isdecimal, isdigit,isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper,join, ljust, lower, lstrip, maketrans, partition, replace, rfind, rindex,rjust, rpartition, rsplit, rstrip, split, splitlines, startswith, strip,swapcase, title, translate, upper, zfill其中包括了查找功能, 还包括去除字符串左右的空格, 以及判断字符串里面各个元素的类别。在进行中文分隔的时候需要用到re模块, 还需要进行大小写的转换, 还有将内容转换为bytes格式。另外, 关于格式化字符串这个部分, 在文章的后面会做简单的介绍, 此外还包含了居中对齐、左边对齐或者右边对齐, 以及替换等这些功能。模块该模块里面包含了一些用于字符串的常量, 此外还有类、还有一个帮助函数, 这个函数的写法是.(s, sepNone)。其中, 某一个类型主要是用于字符串格式化这一件事情的, 你要是去继承它的它的话, 那么你开发出一个自定义的格式化类就非常容易了还有一种类主要用途是提供一下简单的字符串替换功能, 这个功能在很多场景都是很有用的, 尤其是在处理语境上的国际化, 简单来说就是对 (i18n) 进行各种各样的处理和适配。对于字符串常量这种概念, 大家可能觉得在实际使用时候的价值并不是非常突出。string.ascii_lettersstring.ascii_lowercasestring.ascii_uppercasestring.digitsstring.hexdigitsstring.octdigitsstring.punctuationstring.printablestring.whitespace下面是测试, 不过出了个问题, 就是跟上面提到的一条老规定对不上了, 因为没接上。 string.ascii_lettersabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ string.digits0123456789 string.ascii_letters string.digitsSyntaxError: invalid syntax 2323 sdsds2323sdsds type(string.digits) type(string.ascii_letters)关于这份学习笔记的内容。学习了一遍str类型, 发现它几乎很难用到。其实字符串类型的大部分功能都已经在str类型里面包含了。除了类的使用这一点之外, 其他的当然都可以直接使用str本身的格式化功能来实现, 而且这样做的效果会更便捷一些, 毕竟相关的语法相对来说是比较简单的。大家可能会觉得, 官方的文档里提到类在进行格式化转换时, 会使用和str.()函数一样的语法。可是开发者完全可以通过继承这个类的方式, 来开发出属于自己的, 比较特别的字符串格式化能力。当然, 这样的功能可能大部分开发人员在平时用不到? 虽然这两者所用的语法在大体方向上有一些共通的地方, 不过它们之间还是存在一定区别的。想要搞清楚具体的不同点在哪里, 建议您去仔细查阅一下官方给出的那些说明性文字。字符串格式化简介通过前面的学习, 我们发现了字符串拥有的四种格式化语法。1.%2.选项A或者是小写字母f, 或者是一个以大写F和小写f来作为其组成部分的字符。解释一下, 就是在字符串字面前加上 f 或者 F, 这样就能把当前命名空间里的元素, 用来对字符串进行格式化处理了。这也不需要像其他的语法那样, 非要把格式化字符串和变量放在一起混着用。这件事, 的确看起来有点高级。以下是具体的应用示范情况。 name Fred fHe said his name is {name!r}.He said his name is Fred. fHe said his name is {repr(name)}. # repr() is equivalent to !rHe said his name is Fred. width 10 precision 4 value decimal.Decimal(12.34567) fresult: {value:{width}.{precision}} # nested fieldsresult: 12.35 today datetime(year2017, month1, day27) f{today:%B %d, %Y} # using date format specifierJanuary 27, 2017 number 1024 f{number:#0x} # using integer format specifier0x4003. /str.(*args, **)(str.())的功能和(str.())的功能是一模一样的, 也就是所谓的相似, 这个是用来用在字典上面的, 而不是用来当作一个字典。示例 The sum of 1 2 is {0}.format(12)The sum of 1 2 is 3 {0}, {1}, {2}.format(a, b, c)a, b, c {}, {}, {}.format(a, b, c) # 3.1 onlya, b, c {2}, {1}, {0}.format(a, b, c)c, b, a {2}, {1}, {0}.format(*abc) # unpacking argument sequencec, b, a {0}{1}{0}.format(abra, cad) # arguments indices can be repeatedabracadabra Coordinates: {latitude}, {longitude}.format(latitude37.24N, longitude-115.81W)Coordinates: 37.24N, -115.81W coord {latitude: 37.24N, longitude: -115.81W} Coordinates: {latitude}, {longitude}.format(**coord)Coordinates: 37.24N, -115.81Wstr.示例更多的示例您可以去进行查看, 这些里面包含着不少高级的或者是更加复杂的使用情况, 它们是比较适合在进行进阶操作的时候来使用的。4.支持使用美元符号$来进行替换操作, 具体包括$和${}这两种方式进行变量替换。需要说明的是, 当出现两个连续的美元符号$$时, 表示转义含义, 即代表一个字面意义的美元符号$。从整体上看, 这套机制的确比较简单直观。class .()-(, **kwds)-(, **kwds)开发者是可以去对这个类进行继承的, 这样就可以去实现一个属于他们自己的模板类了。官文使用示例 from string import Template s Template($who likes $what) s.substitute(whotim, whatkung pao)tim likes kung pao d dict(whotim) Template(Give $who $100).substitute(d)Traceback (most recent call last):...ValueError: Invalid placeholder in string: line 1, col 11 Template($who likes $what).substitute(d)Traceback (most recent call last):...KeyError: what Template($who likes $what).safe_substitute(d)tim likes $what.示例关于这份学习笔记的内容。语法一的这种实现方式, 和我们通常在C语言里边去用到的那种函数的格式化字符串的方法, 是存在着相似之处的。关于语法2这个问题, 请您去查阅一下参考链接2的内容, 因为这个部分我目前还未来得及进行仔细阅读。语法3是在str函数和模块的类当中被使用的, 这和语法2有关系, 是根据语法2来的, 对吧?所谓的语法4其实是这个模块里面提供给你的一种操作, 这种操作的性质非常简单, 主要作用就是对字符串里的内容进行替换处理。大家都清楚该如何进行操作, 也就是掌握了基础的使用方法, 但是更为艰巨的挑战在于对语法含义的深入领会, 接下来在这里对语法2和语法3的相关说明进行补充这些内容源自官方文档, 至于更详备的解释细节也请务必仔细阅读官方网站的文件, 这两个部分正是最为困难的所在:语法2f_string :: (literal_char | {{ | }} | replacement_field)*replacement_field :: { f_expression [! conversion] [: format_spec] }f_expression :: (conditional_expression | * or_expr)(, conditional_expression | , * or_expr)* [,]| yield_expressionconversion :: s | r | aformat_spec :: (literal_char | NULL | replacement_field)*literal_char ::语法3format_spec :: [[fill]align][sign][#][0][width][grouping_option][.precision][type]fill ::align :: | | | ^sign :: | - | width :: digitgrouping_option :: _ | ,precision :: digittype :: b | c | d | e | E | f | F | g | G | n | o | s | x | X | %疑问这些人究竟是怎么想到要用上面的方式来表示语法的? 在计算机科学领域之中, 这种结构被称作什么? 本人好像曾在其他的文档里面也看到过相关内容, 可是却没有能够完全理解它, 所以特别欢迎各位读者给予指导与建议这一现象和编译原理到底有没有关系?能够写出上述语法的人, 想必是一定非常聪明的, 又或者说明其在计算机科学方面拥有很高的造诣水平这种情况很可能是建立在一些计算机科学领域先驱者所取得的成果的基础之上的, 这些人当中包括编程语言C语言的创作者在内, 当然, 这种追溯的过程还可以进一步地向下延伸下去。这篇文章就先到这里。它几乎已经把str类型和模块的各个知识点都概括进去了。所以, 就先把它当作是一个暂时的交代吧。另外, 里面提到的关于字符串的函数部分, 还是需要花费精力去突破那些重难点并进行练习。还有格式化字符串这个问题, 也需要通过增加更多的场景来进行充分的练习与强化。建议大家把官方文档里的示例内容认真地研究一番。更进一步在参与学习活动之时, 用户察觉到了一个现象, 那就是, str.split这个函数在处理汉语文本的句子结构时, 其性能表现不佳, 或者说直接导致了功能的失效, 因而, 必须转而求助于re这个模块所提供的分割函数来进行替代操作, 针对这一个既有的问题点, 以及后续可能会涉及到的中文处理相关的其他种种疑问事项, 例如中文词语的划分、生成中文词汇图片、以及自然语言智能识别等等这些内容领域, 都需要继续地深入下去探索与研究。 cnstr 姑娘还晒出了自己的辞职信引发众多网友关注。姑娘说她在这家公司上班6年一个月3.5k左右。在辞职信中她列出了7条离职原因。没想好做什么但是不能继续这样下去了’ cnstr.split(了的)[姑娘还晒出了自己的辞职信引发众多网友关注。姑娘说她在这家公司上班6年一个月3.5k左右。在辞职信中她列出了7条离职原因。没想好做什么但是不能继续这样下去了’]len(cnstr.split(了的)) # 分隔失败返回列表长度为11import re re.split([了的], cnstr) # [了的] 是正则表达式[姑娘还晒出, 自己, 辞职信引发众多网友关注。姑娘说她在这家公司上班6年一个月3.5k左右。在辞职信中她列出, 7条离职原因。没想好做什么但是不能继续这样下去, ’]