欢迎回家
我们一直在改变

python-字符串(1)

计算机,当初是为了什么而发明的?

计算!

现如今,我们通常所见之范围内,都在用她做什么?

聊天!看视频!打游戏!处理文档!

显然,已经“忘记初心”,计算机再不是当初的计算机了,成为了“电脑”。也正是忘记初心,变成“电脑”,才成为大众的工具。而支持她作为“电脑”之用的,就是里面的软件。

电脑中的软件,只有少数是用来计算的,多数是不用于计算的。处理文档则是多数功能之一。

软件程序如何处理文档?要再看看自然语言。

如果对自然语言,有很多种,比如英语、法语、汉语等,这是对自然语言的分类。

我还有一种分类方法,固然尚未得到广泛认同,但“真理是掌握在少数人的手里”是我的信念,至少可以让自己成为“民科”。

来自“民科”的分类法:

  1. 语言中的两个元素(比如两个字)拼接在一起,出来一个新的元素(比如新的字),这是第一类;
  2. 两个元素并排摆放在一起,只是得到这两个元素的并列显示。比如“好”和“人”,两个元素拼接在一起是“好人”,这是第二类。

举例: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的用户,可以看到:

>>> 250
250
>>> 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
>>> a
5

其本质含义是变量a相当于一个标签,贴在了对象5上面。并且我们把这个语句叫做赋值语句。

整数是对象,通过赋值语句可以设置一个变量指向整数;

字符串是对象,显然也能够通过赋值语句,实现变量指向字符串。

所以字符串对象与某个变量联系在一起:

>>> b = "hello,world"
>>> b
'hello,world'
>>> print b         #Python 2
hello,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)
>>> b
250
>>> 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,查询到这样的描述:

  1. 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()粉墨登场了。

赞(0)
未经允许不得转载:91coding » python-字符串(1)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

立即登录   注册

91CODING 小白轻松上手,大牛稳健进步

关于我们免责声明