你真的知道Python的字符串是什么吗?

在《详解Python拼接字符串的七种方式》这篇推文里,我提到过,字符串是程序员离不开的事情。后来,我看到了一个英文版本的说法:There are few guarantees in life: death, taxes, and programmers needing to deal with strings.它竟然把程序员处理字符串跟死亡大事并列了,可见这是多么命中注定......回头看其它文章,我发现这种说法得到了佐证,因为我在无意中已零零碎碎地提及了字符串的很多方面,例如:字符串读写文件、字符串打印、字符串不可变性、字符串Intern机制、字符串拼接、是否会取消字符串,等等。而这些,还只能算字符串面目的冰山一角。既然如此,那干脆再单独写写Python的字符串吧。这篇内容可能会很基(li)础(lun),并不是什么“骚操作”或“冷知识”,权当是一份温故而求知新的笔记。1 Python字符串是什么?根据维基百科定义:字符串是由零个或多个字符组成的有限序列。而在Python 3中,它有着更明确的意思:字符串是由Unicode码点组成的不可变序列(Strings are immutable sequences of Unicode code points.)字符串是一种序列,这意味着它具备序列类型都支持的操作: # 以下的s、t皆表示序列,x表示元素 x in s # 若s包含x,返回True,否则返回False x not in s # 若s包含x,返回False,否则返回True s + t # 连接两个序列 s * n # s复制n次 s[i] # s的索引第i项 s[i:j] # s切片从第i项到第j-1项 s[i:j:k] # s切片从第i项到第j-1项,间隔为k len(s) # s的长度 min(s) # s的最小元素 max(s) # s的最大元素 s.index(x) # x的索引位置 s.count(x) # s中出现x的总次数

字符串序列还具备一些特有的操作,限于篇幅,按下不表。预告一下,下一篇《你真的知道Python的字符串怎么用吗? 》将会展开介绍,敬请期待......字符串序列是一种不可变序列,这意味着它不能像可变序列一样,进行就地修改。例如,在字符串“Python”的基础上拼接“Cat”,得到字符串“PythonCat”,新的字符串是一个独立的存在,它与基础字符串“Python”并没有关联关系。 basename = "Python" myname = basename + "Cat" id(basename) == id(myname) >>> False # 作为对比,列表能就地修改 baselist = ["Python"] baselist.append("Cat") print(baselist) >>> ['Python', 'Cat']

字符串这种序列与其它序列(如列表、元组)的不同之处在于,它的“元素”限定了只能是Unicode码点。Unicode码点是什么呢?简单理解,就是用Unicode编码的字符。那字符是什么呢?字符是人类书写系统的各类符号,例如阿拉伯数字、拉丁字母、中文、日文、藏文、标点符号、控制符号(换行符、制表符等)、其它特殊符号(@#¥%$*等等)。那Unicode编码又是什么呢?Unicode别名是万国码、国际码,它是一种适用性最广的、将书写字符编码为计算机数字的标准。总所周知,在最底层的计算机硬件世界里,只有0和1。那么,怎么用这个二进制数字,来表示人类的文化性的字符呢?这些字符数量庞大,而且还在日益增长与变化,什么样的编码方案才是最靠谱的呢?历史上,人类创造了多种多样的字符编码标准,例如ASCII(1963年)编码,以西欧语言的字符为主,它的缺点是只能编码128个字符;例如GB2312(1981年),这是中国推出的编码标准,在兼容ASCII标准的基础上,还加入了对日文、俄文等字符的编码,但缺点仍是编码范围有限,无法表示古汉语、繁体字及更多书写系统的字符。Unicode编码标准于1991年推出,至今迭代到了第11版,已经能够编码146个书写系统的130000个字符,可谓是无所不包,真不愧是“国际码”。Unicode编码其实是一个二进制字符集,它建立了从书写字符映射成唯一的数字字符的关系,但是,由于各系统平台对字符的理解差异,以及出于节省空间的考虑,Unicode编码还需要再做一次转换,转换后的新的二进制数字才能作为实际存储及网络传输时的编码。这种转换方式被称为Unicode转换格式(Unicode Transformation Format,简称为UTF),它又细分为UTF-8、UTF-16、UTF-32等等方式。我们最常用的是UTF-8。为什么UTF-8最常用呢?因为它是可变长度的编码方案,针对不同的字符使用不同的字节数来编码,例如编码英文字母时,只需要一个字节(8个比特),而编码较复杂的汉字时,就会用到三个字节(24个比特)。

二进制的编码串可以说是给机器阅读的,为了方便,我们通常会将其转化为十六进制,例如“中”字的Unicode编码可以表示成0x4e2d ,其UTF-8编码可以表示为0xe4b8ad ,'0x'用于开头表示十六进制,这样就简洁多了。不过,UTF-8编码的结果会被表示成以字节为单位的形式,例如“中”字用UTF-8编码后的字节形式是\xe4\xb8\xad 。Python中为了区分Unicode编码与字节码,分别在开头加“u”和“b”以示区分。在Python 3中,因为Unicode成了默认编码格式,所以“u”被省略掉了。 # 字符转Unicode编码 # Python3中,开头的u被省略,b不可省略 hex(ord('中')) >>> '0x4e2d' hex(ord('A')) >>> '0x41' # 字符转UTF-8编码(encode) '中'.encode('utf-8') >>> b'\xe4\xb8\xad' 'A'.encode('utf-8') >>> b'A' # Unicode编码还原成字符 chr(0x4e2d) >>> '中' chr(0x41) >>> 'A' # UTF-8编码还原成字符(decode) b'\xe4\xb8\xad'.decode('utf-8') >>> '中' b'A'.decode('utf-8') >>> 'A'


总结一下,Python 3 中的字符串是由Unicode码点组成的不可变序列,也即是,由采用Unicode标准编码的字符组成的不可变序列。Unicode编码将书写系统的字符映射成了计算机二进制数字,为了方便,通常显示为十六进制;在运算内存中,字符以Unicode编码呈现,当写入磁盘或用于网络传输时,一般采用UTF-8方式编码。在Python 2中,因为历史包袱,即Python先于Unicode编码而诞生,所以其编码问题是个大难题。幸好抛弃Python 2已成大势所趋,所以我就不再对此做介绍或比对了。2 Python字符串 VS Java字符串虽然不提纵向版本间的差异,但是,我想将Python字符串与其它编程语言做一个横向对比。我觉得这会是挺好玩的事。通过跨语言的比较,也许我们能加深对一个事物(字符串)的理解,还可能受到启发,得到对“编程语言”及“编程哲学”的领悟。由于本人才疏学浅,本文就只对两点皮毛特性作说明,欢迎读者斧正和补充。(1)字符串的定义方式Python的字符串是内置类型,所以使用起来很方便,有如下三种定义方式: str_0 = '''Python字符串可以写在用三引号对内,表示多行字符串。 还可以写在单引号对内, 当然还可以写在双引号对内。 ''' str_1 = 'Python猫是一只猫' str_2 = "Python猫是一个微信公众号"

Java的字符串不是内置类型,它属于对象,需要通过String类来创建。不过,正因为字符串太常用,所以Java特意预定义了一个字符串类String,使得程序员也可以像这样来定义:String name = "Python猫"; ,而不必这样写:String name = new String("Python猫"); 。Java的字符串只能写在双引号内,不具备Python中单双引号混用的灵活。至于三引号的多行字符串表示法,Java程序员表示羡慕得要死,那种痛苦,受过折磨的人最懂。写出来让Python程序员开心一下: String s = "Java 的多行字符串很麻烦,\n" + "既要使用换行符,\n" + "还需要使用加号拼接";

为什么Java不支持多行字符串、什么时候支持多行字符串?此类问题在Python程序员眼里,可能很费解,但它绝对能排进“Java程序员最希望能实现的特性”的前列。好不容易,官方有计划在Java 11 实现,但今年9月发布的Java 11 仍是没有,现在改计划到Java 12 了。(2)单个字符与字符序列Java中其实也有单引号的使用,用在char类型上,例如char c = 'A'; 。char是一种内置类型,表示单个用Unicode编码的字符。Python中没有char类型,字符串类型通吃一切。前面说到,Python的字符串是一种字符序列,而Java的字符串并不是一种序列,要表示相近的概念的话,就得用到字符数组 或者 字符串数组 ,例如: char[] a = { 'a', 'b', 'c'}; String[] str = new String[]{"1","2","3"};

字符数组和字符串数组是一种序列,但并不是字符串,它们之间如果要相互转换,还是挺麻烦的。另外,说是序列,但Java的序列操作绝对无法跟Python相比,别的不说,就上面提及的几个基础操作,试问Java能否实现、实现起来要花费多大力气?最后来个Ending,关于“Python字符串到底是什么”就说到这啦,希望对你有所帮助。下次,我再跟大家说说“Python字符串到底怎么用”,敬请期待。本文原创并首发于微信公众号【Python猫】,后台回复“爱学习”,免费获得20+本精选电子书。拓展阅读:https://zh.wikipedia.org/wiki/Unicodehttps://zh.wikipedia.org/wiki/UTF-8https://dwz.cn/AvWg1EDxhttps://yiyibooks.cn/xx/python_352/library/stdtypes.htmlhttps://github.com/acmerfight/insight_python/blob/master/Unicode_and_Character_Sets.md


C语言字符串是什么意思

这个怎么给你解释呢!字符串是C语言当中专门定义的一类数据格式(string),相对于单个字符的数据格式CHAR来说,可用于存储多个字符,包括字母、数字、符号。
字符串的长度可以自定义,例如:string a[100],就是定义了长度为100个字符的字符串。

字符串变量是什么意思

  字符串是所有编程语言中都经常需要处理的问题之一,字符串指的是什么呢?下面是我整理字符串变量的内容,欢迎阅读。

  字符串的简介
  字符串主要用于编程,概念说明、函数解释、用法详述见正文,这里补充一点:字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=?abcdefghij?,则s[0]=?a?,s[9]="j",而字符串的零位正是它的长度,如s[0]=10(※上述功能Ansistring没有。),这可以给我们提供很多方便,如高精度运算时每一位都可以转化为数字存入数组。
  什么是变量
  变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的;但在纯函数式语言(如Haskell)中,变量可能是不可变(immutable)的。在一些语言中,变量可能被明确为是能表示可变状态、具有存储空间的抽象(如在Java和Visual Basic中);但另外一些语言可能使用其它概念(如C的对象)来指称这种抽象,而不严格地定义?变量?的准确外延。

  变量介绍

  由于变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用。变量可以保存程序运行时用户输入的数据(如使用InputBox函数在屏幕上显示一个对话框,然后把用户键入的文本保存到变量中)、特定运算的结果以及要在窗体上显示的一段数据等。简而言之,变量是用于跟踪几乎所有类型信息的简单工具。

  变量声明后没有赋值的话 编译器会自动提示并赋予默认值

  变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息。例如,可以创建一个名为Click Count的变量来存储用户单击Web页面上某个对象的次数。使用变量并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值。在VB Script中只有一个基本数据类型,即Variant,因此所有变量的数据类型都是Variant。

  变量简介

  字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=?a1a2?an?(n>=0)。它是编程语言中表示文本的数据类型。在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。

  通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。
  c语言字符型常量与变量
  字符常量:一个字符常量代表ASCII字符集中的一个字符,在程序中用单引号把一个字符括起来作为字符常量。例如?A? ?b?等都是合法的字符常量。

  注意: 1、C语言区分大小写:单引号中的大小写字母代表不同的字符常量,例如?A?与?a?是不同的字符常量;2、单引号中的空格符也是一个字符常量3、字符常量只能包括一个字符,所以?ab?是非法的;4、字符常量只能用单引号括起来,不能用双引号。比如?a?不是一个字符常量而是一个字符串。

  转义字符常量:转义字符又称反斜线字符,这些字符常量总是以一个反斜线开头后跟一个特定的字符,用来代表某一个特定的ASCII字符,这些字符常量也必须扩在一对单引号内。

  注意:1:转义字符常量只代表一个字符,例如?\n?、?\101?; 2:反斜线后的八进制数可以不用0开头;

  3:反斜线后的十六进制数只可由小写字母x开头,不能以大写字母X或0X开头。

  字符串常量:字符串常量是由双引号括起来的一串字符。在C语言中,字符串是用字符型一维数组来存放的。系统在每个字符串的末尾自动加上一个字符?\0?作为字符串结束标志,?\0?在这里占用存储空间但不计入字符串的实际长度。两个连续的双引号(? ?)也是一个字符串常量:称为空串,占一个字节,该字节用来存放?\0?。

  在C语言中,字符常量可以参与任何整数运算以及关系运算。

  字符变量:C语言中,字符变量是用关键字char来定义的,例如:char a=?b?,字符变量在内存中占一个字节,当把一个字符放入字符变量中时,字符变量的值就是该字符的ASCII码值,所以字符变量可以作为整型变量来处理,可以参与任何整形变量的运算。