字符串(1)
And since they did not see fit to acknowledge God, God gave them up to a debased mind and things that should no be done. They were filled with every kind of wickedness, evil, covetousness, malice. Full of envy, murder, strife, deceit, craftiness, they are gossips, slanderers, God-haters, insolent, haughty, boastful, inventors of evil, rebellious toward parents, foolish,faithless, heartless, ruthless. They know God's decree, that those who practice such things deserve to die--yet they not only do them but even applaud others who practice them. (ROMANS 1:28-32)
字符串(1)
计算机,当初是为了什么而发明的?
计算!
现如今,我们通常所见之范围内,都在用她做什么?
聊天!看视频!打游戏!处理文档!
显然,已经“忘记初心”,计算机再不是当初的计算机了,成为了“电脑”。也正是忘记初心,变成“电脑”,才成为大众的工具。而支持她作为“电脑”之用的,就是里面的软件。
电脑中的软件,只有少数是用来计算的,多数是不用于计算的。处理文档则是多数功能之一。
软件程序如何处理文档?要再看看自然语言。
如果对自然语言,有很多种,比如英语、法语、汉语等,这是对自然语言的分类。
我还有一种分类方法,固然尚未得到广泛认同,但“真理是掌握在少数人的手里”是我的信念,至少可以让自己成为“民科”。
来自“民科”的分类法:
- 语言中的两个元素(比如两个字)拼接在一起,出来一个新的元素(比如新的字),这是第一类;
- 两个元素并排摆放在一起,只是得到这两个元素的并列显示。比如“好”和“人”,两个元素拼接在一起是“好人”,这是第二类。
举例:3和5拼接(就是整数求和)在一起是8,这就是第一类;如果是35,那就属于第二类。
只有抽象的原理才能是普适的,所以,用符号的方式概括上述分类:
- 第一类:△ +□ = ○
- 第二类:△ +□ = △ □
很放肆地下一个结论:人类的语言,离不开以上两类,不是第一类就是第二类。
可以鼓掌了。
之所以自鸣得意,是因为了解的太少。
字符串
google,不至于让我盲目。
维基百科的字符串词条早已经有了完整的说明,这个说明是针对一种叫做“字符串”的东西而阐述的:
字符串(String),是由零个或多个字符组成的有限串行。一般记为s=a[1]a[2]...a[n]。
伟大的维基百科!它已经把我煞费苦心还自鸣得意的分类取了一个形象的名称,叫做字符串,本质上就是一串字符。
根据这个定义,在前面两次让一个程序员感到神奇的"Hello,World",就是一个字符串。或者说不管用英文还是中文还是别的某种文,写出来的文字都可以做为字符串对待,当然,里面的特殊符号,也是做为字符串的,比如空格等。
严格地说,在Python中的字符串是一种对象类型,这种类型用str表示,通常单引号''
或者双引号""
包裹起来。
字符串和前面讲过的数字一样,都是对象的类型,或者说都是Python数据类型。当然,表示方式还是有区别的。
"I love Python." 'I love Python.''I LOVE PYTHON.' 'I LOVE PYTHON.'
不论使用单引号还是双引号,结果都是一样的,都是字符串。
Python 2的用户,可以看到:
>>> 250250>>> type(250)<type 'int'>>>> "250"'250'>>> type("250")<type 'str'>
Python 3则是这样的结果:
>>> type(250)<class 'int'>>>> type("250")<class 'str'>
仔细观察,同样是250,一个没有放在引号里面,一个放在了引号里面,用type()
函数来检验一下,发现它们居然是两种不同的对象类型,前者是int类型,后者则是str类型,即字符串类型。所以,务必注意,不是所有数字都是int(or float),必须要看看,它在什么地方,如果在引号里面,就是字符串了。如果搞不清楚是什么类型,就让type()
来帮忙搞定。
操练一下字符串吧。
先看Python 2下的操作
>>> print "good good study, day day up"good good study, day day up>>> print "----good---study---day----up"----good---study---day----up
在print
后面,打印的都是字符串。注意,是双引号里面的,引号不是字符串的组成部分。它是在告诉计算机,它里面包裹着的是一个字符串。
在Python 3中,区别就是print()
是一个函数了。
>>> print("good good study, day day up")good good study, day day up
爱思考,有惊喜;多尝试,有收获。
如果把下面这句话看做一个字符串,应该怎么做?
What's your name?
这个问题非常好,因为在这句话中有一个单引号,如果直接在交互模式中像上面那样输入,就会这样:
>>> 'What's your name?'File "<stdin>", line 1 'What's your name?' ^SyntaxError: invalid syntax
出现了SyntaxError
(语法错误)引导的提示,这是在告诉我们这里存在错误,错误的类型就是SyntaxError
,后面是对这种错误的解释“invalid syntax”(无效的语法)。特别注意,错误提示的上面,有一个^符号,直接只着一个单引号,不用多说,你也能猜测出,大概在告诉我们,可能是这里出现错误了。
在python中,这一点是非常友好的,如果语句存在错误,就会将错误输出来,供程序员改正参考。当然,错误来源有时候比较复杂,需要根据经验和知识进行修改。还有一种修改错误的好办法,就是将错误提示放到google中搜索。
上面的错误原因是什么呢?
仔细观察,发现那句话中事实上有三个单引号,本来一对单引号之间包裹的是一个字符串,现在出现了三个(一对半)单引号,computer姑娘迷茫了,她不知道单引号包裹的到底是谁。于是报错。
有解吗?有!必须有。
解决方法一:双引号包裹单引号
>>> "What's your name?""What's your name?"
用双引号来包裹,双引号里面允许出现单引号。其实,反过来,单引号里面也可以包裹双引号。这个可以笼统地成为二者的嵌套。
解决方法二:使用转义符
所谓转义,就是让某个符号不再表示某个含义,而是表示另外一个含义。转义符的作用就是它能够转变符号的含义。在Python中,用\
作为转义符(其实很多语言,只要有转义符的,都是用这个符号)。
>>> 'What\'s your name?'"What's your name?"
是不是看到转义符\
的作用了。
本来单引号表示包括字符串,它不是字符串一部分,但是如果前面有转义符,那么它就失去了原来的含义,转化为字符串的一部分,相当于一个特殊字符了。
变量能不能指向某个字符串?如果可以则操作会更简单。
变量和字符串
曾记否:变量无类型,对象有类型。比如在数字中:
>>> a = 5>>> a5
其本质含义是变量a相当于一个标签,贴在了对象5上面。并且我们把这个语句叫做赋值语句。
整数是对象,通过赋值语句可以设置一个变量指向整数;
字符串是对象,显然也能够通过赋值语句,实现变量指向字符串。
所以字符串对象与某个变量联系在一起:
>>> b = "hello,world">>> b'hello,world'>>> print b #Python 2hello,world#>>> print(b) #Python 3#hello,world
检查类型的函数type()
总是在我们需要的时候被想起来。
#Python 2>>> type(a)<type 'int'>>>> type(b)<type 'str'>#Python 3>>> type(a)<class 'int'>>>> type(b)<class 'str'>
有一种说法:a称之为数字型变量,b叫做字符(串)型变量。
这种说法,在某些语言中是成立的。某些语言,需要提前声明变量,然后变量就成为了一个筐,将值装到这个筐里面。
但是,Python不是这样的。要注意区别。
小学语文老师布置这样一个题目:请用“不约而同”造句。
一小朋友回答:
我问姐姐,“约吗?”,姐姐说,不约儿童。
上面这句话,就是多个字符串连接到了一起。所以,字符串是可以连接起来的。
连接字符串
对数字,用+
,可以得到一个新的数字,如:3+5
,就得到了8
。那么对字符串都能进行什么样的操作呢?试试吧:
>>> "py" + "thon"'python'
两个字符串可以“相加”,但与数字“相加”不同。实质上是把两个字符串连接起来。
>>> "py" - "thon" # 在进行这种操作的时候,要斟酌一下其意义?Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: unsupported operand type(s) for -: 'str' and 'str'
用+
号实现连接,的确比较简单,不过,有时候你会遇到这样的问题:
>>> a = 1989>>> b = "free">>> print b+a # Python 2的写法,如果是Python 3,请使用print(b + a)Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: cannot concatenate 'str' and 'int' objects
报错了,其错误原因已经打印出来(一定要注意看打印出来的信息):cannot concatenate 'str' and 'int' objects
。原来a
对应的对象是一个int
类型的,不能将它和str
对象连接起来。如果是Python 3,报错信息是TypeError: unsupported operand type(s) for +: 'int' and 'str'
。
怎么办?
原来,用+
所连接的两个对象,必须是同一种类型。如果是不同类型的,则"cannot concatenate"或者"unsupported"。
如果两个都是数字,毫无疑问是正确的,就是求和;如果都是字符串,那么就得到一个新的字符串。
修改上面的错误,可以通过以下方法:
>>> print b + `a` free1989
注意,上面的代码,不要使用在Python 3中。
在Pytohn 2中,也要注意,一不小心就会犯错误。包裹着字母a
的,不是单引号,是键盘中通常在数字1左边的那个,在英文半角状态下输入的符号——叫做“反引号”。
这种方法,在编程实践中比较少应用,特别是在python 3中,已经把这种方式弃绝了。窃以为原因就是这个符号太容易和单引号混淆了。在编程中,也不容易看出来,可读性太差。
常言道,“困难只有一个,解决困难的方法不止一种”,既然反引号可读性不好,在编程实践中就尽量不要使用。于是乎就有了下面的方法,这是被广泛采用的。不但简单,更主要是直白,一看就懂什么意思了。
>>> print b + str(a) # 如果是Python 3,请使用print(b + str(a)) free1989
用str(a)
实现将整数对象转换为字符串对象。虽然str
是一种对象类型,但是它也能够实现对象类型的转换——str()
是函数,关于函数,后面会详述。其实前面已经遇到过int()
了。比如:
>>> a = "250">>> type(a)<type 'str'> # 对于Pytohn 3,返回值略有差异,前面已经演示过了。>>> b = int(a)>>> b250>>> type(b)<type 'int'>
提醒列位,如果你对int和str比较好奇,可以在交互模式中,使用
help(int)
,help(str)
查阅相关的更多资料。或许看不懂,不用担心,权当混个脸熟。
还有第三种:
>>> print b + repr(a) # 这是Python 2的写法,Python 3则为:>>> print(b + repr(a))free1989
这里repr()是一个函数,其实就是反引号的替代品,它能够把结果字符串转化为合法的Python表达式。
三种解决方法,有区别吗?
首先,repr()和反引号是一致的(Python 3弃绝了反引号的使用),就不用区别了。
然后区分repr()和str,不用消耗脑细胞,交给Google,查询到这样的描述:
- When should i use str() and when should i use repr() ?
Almost always use str when creating output for end users.
repr is mainly useful for debugging and exploring. For example, if you suspect a string has non printing characters in it, or a float has a small rounding error, repr will show you; str may not.
repr can also be useful for for generating literals to paste into your source code. It can also be used for persistence (with ast.literal_eval or eval), but this is rarely a good idea--if you want editable persisted values, something like JSON or YAML is much better, and if you don't plan to edit them, use pickle.
2.In which cases i can use either of them ?
Well, you can use them almost anywhere. You shouldn't generally use them except as described above.
3.What can str() do which repr() can't ?
Give you output fit for end-user consumption--not always (e.g., str(['spam', 'eggs']) isn't likely to be anything you want to put in a GUI), but more often than repr.
4.What can repr() do which str() can't
Give you output that's useful for debugging--again, not always (the default for instances of user-created classes is rarely helpful), but whenever possible.
And sometimes give you output that's a valid Python literal or other expression--but you rarely want to rely on that except for interactive exploration.
以上英文内容来源:http://stackoverflow.com/questions/19331404/str-vs-repr-functions-in-python-2-7-5
字符串中的困难,不仅在上面所述,还有更多,例如“转义符”,不少错误可能与此有关。
Python转义字符
转义符,已经小试牛刀,便显威力——What's your name?
。
在字符串中,总会有一些特殊的符号,就需要用转义符。所谓转义,就是不采用符号本来的含义,而采用另外一含义。下面表格中列出常用的转义符:
转义字符 | 描述 |
---|---|
\ | (在行尾时) 续行符 |
\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
以上所有转义符,都可以通过交互模式下print
来测试,感受实际上是什么样子的。例如:
Python 2:
>>> print "hello.I am qiwsir.\ #这里换行,下一行接续... My website is 'http://qiwsir.github.io'."hello.I am qiwsir.My website is 'http://qiwsir.github.io'.>>> print "you can connect me by qq\\weibo\\gmail" #\\是为了要后面那个\you can connect me by qq\weibo\gmail
Python 3:
>>> print("hello.I am qiwsir.\My website is 'http://qiwsir.github.io'.")hello.I am qiwsir.My website is 'http://qiwsir.github.io'.>>> print("you can connect me by qq\\weibo\\gmail")you can connect me by qq\weibo\gmail
自己动手,丰衣足食,试试吧。
print
或者print()
解决了显示问题,但是输入怎么办?这就需要raw_input()
或者input()
粉墨登场了。