如果对自然语言分类,有很多中分法,比如英语、法语、汉语等,这种分法是最常见的。在语言学里面,也有对语言的分类方法,比如什么什么语系之类的。我这里提出一种分法,这种分法尚未得到广大人民群众和研究者的广泛认同,但是,我相信那句“真理是掌握在少数人的手里”,至少在这里可以用来给自己壮壮胆。
我的分法:一种是语言中的两个元素(比如两个字)拼接在一起,出来一个新的元素(比如新的字);另外一种是两个元素拼接在一起,只是得到这两个元素的并列显示。比如“好”和“人”,两个元素拼接在一起是“好人”,而3和5拼接(就是整数求和)在一起是8,如果你认为是35,那就属于第二类了。
把我的这种分法抽象一下:
* 一种是:△ +□ = ○
* 另外一种是:△ +□ = △ □
我们的语言中,离不开以上两类,不是第一类就是第二类。
太天才了。请鼓掌。
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/106.md#字符串)字符串
在我洋洋自得的时候,我google了一下,才发现,自己没那么高明,看[维基百科的字符串词条](http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E4%B8%B2)是这么说的:
> 字符串(String),是由零个或多个字符组成的有限串行。一般记为s=a[1]a[2]...a[n]。
看到维基百科的伟大了吧,它已经把我所设想的一种情况取了一个形象的名称,叫做字符串,本质上就是一串字符。
根据这个定义,在前面两次让一个程序员感到伟大的"Hello,World",就是一个字符串。或者说不管用英文还是中文还是别的某种文,写出来的文字都可以做为字符串对待,当然,里面的特殊符号,也是可以做为字符串的,比如空格等。
严格地说,在python中的字符串是一种对象类型,这种类型用str表示,通常单引号`''`或者双引号`""`包裹起来。
> 字符串和前面讲过的数字一样,都是对象的类型,或者说都是值。当然,表示方式还是有区别的。
~~~
>>> "I love Python."
'I love Python.'
>>> 'I LOVE PYTHON.'
'I LOVE PYTHON.'
~~~
从这两个例子中可以看出来,不论使用单引号还是双引号,结果都是一样的。
~~~
>>> 250
250
>>> type(250)
<type 'int'>
>>> "250"
'250'
>>> type("250")
<type 'str'>
~~~
仔细观察上面的区别,同样是250,一个没有放在引号里面,一个放在了引号里面,用`type()`函数来检验一下,发现它们居然是两种不同的对象类型,前者是int类型,后者则是str类型,即字符串类型。所以,请大家务必注意,不是所有数字都是int(or float),必须要看看,它在什么地方,如果在引号里面,就是字符串了。如果搞不清楚是什么类型,就让`type()`来帮忙搞定。
操练一下字符串吧。
~~~
>>> print "good good study, day day up"
good good study, day day up
>>> print "----good---study---day----up"
----good---study---day----up
~~~
在print后面,打印的都是字符串。注意,是双引号里面的,引号不是字符串的组成部分。它是在告诉计算机,它里面包裹着的是一个字符串。
爱思考的看官肯定发现上面这句话有问题了。如果我要把下面这句话看做一个字符串,应该怎么做?
~~~
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?"
~~~
是不是看到转义符`\`的作用了。
本来单引号表示包括字符串,它不是字符串一部分,但是如果前面有转义符,那么它就失去了原来的含义,转化为字符串的一部分,相当于一个特殊字符了。
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/106.md#变量和字符串)变量和字符串
前面讲过**变量无类型,对象有类型**了,比如在数字中:
~~~
>>> a = 5
>>> a
5
~~~
其本质含义是变量a相当于一个标签,贴在了对象5上面。并且我们把这个语句叫做赋值语句。
同样,在对字符串类型的对象,也是这样,能够通过赋值语句,将对象与某个标签(变量)关联起来。
~~~
>>> b = "hello,world"
>>> b
'hello,world'
>>> print b
hello,world
~~~
还记得我们曾经用过一个type命令吗?现在它还有用,就是检验一个变量,到底跟什么类型联系着,是字符串还是数字?
~~~
>>> type(a)
<type 'int'>
>>> type(b)
<type 'str'>
~~~
有时候,你会听到一种说法:把a称之为数字型变量,把b叫做字符(串)型变量。这种说法,在某些语言中是成立的。某些语言,需要提前声明变量,然后变量就成为了一个筐,将值装到这个筐里面。但是,python不是这样的。要注意区别。
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/106.md#拼接字符串)拼接字符串
还记得我在本节开篇提出的那个伟大发现吗?就是将两个东西拼接起来。
对数字,如果拼接,就是对两个数字求和。如: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
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
~~~
> 这里引入了一个指令:`print`,意思就是打印后面的字符串(或者指向字符串的变量),上面是python2中的使用方式,在python3中,它变成了一个函数。应该用`print(b+a)`的样式了。
报错了,其错误原因已经打印出来了(一定要注意看打印出来的信息):`cannot concatenate 'str' and 'int' objects`。原来`a`对应的对象是一个`int`类型的,不能将它和`str`对象连接起来。怎么办?
原来,用`+`拼接起来的两个对象,必须是同一种类型的。如果两个都是数字,毫无疑问是正确的,就是求和;如果都是字符串,那么就得到一个新的字符串。
修改上面的错误,可以通过以下方法:
~~~
>>> print b + `a`
free1989
~~~
注意,` ` 是反引号,不是单引号,就是键盘中通常在数字1左边的那个,在英文半角状态下输入的符号。这种方法,在编程实践中比较少应用,特别是在python3中,已经把这种方式弃绝了。我想原因就是这个符号太容易和单引号混淆了。在编程中,也不容易看出来,可读性太差。
常言道:“困难只有一个,解决困难的方法不止一种”,既然反引号可读性不好,在编程实践中就尽量不要使用。于是乎就有了下面的方法,这是被广泛采用的。不但简单,更主要是直白,一看就懂什么意思了。
~~~
>>> print b + str(a)
free1989
~~~
用`str(a)`实现将整数对象转换为字符串对象。虽然str是一种对象类型,但是它也能够实现对象类型的转换,这就起到了一个函数的作用。其实前面已经讲过的int也有类似的作用。比如:
~~~
>>> a = "250"
>>> type(a)
<type 'str'>
>>> b = int(a)
>>> b
250
>>> type(b)
<type 'int'>
~~~
> 提醒列位,如果你对int和str比较好奇,可以在交互模式中,使用help(int),help(str)查阅相关的更多资料。
还有第三种:
~~~
>>> print b + repr(a) #repr(a)与上面的类似
free1989
~~~
这里repr()是一个函数,其实就是反引号的替代品,它能够把结果字符串转化为合法的python表达式。
可能看官看到这个,就要问它们三者之间的区别了。首先明确,repr()和``是一致的,就不用区别了。接下来需要区别的就是repr()和str,一个最简单的区别,repr是函数,str是跟int一样,一种对象类型。不过这么说是不能完全解惑的。幸亏有那么好的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](http://stackoverflow.com/questions/19331404/str-vs-repr-functions-in-python-2-7-5)
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/106.md#python转义字符)Python转义字符
在字符串中,有时需要输入一些特殊的符号,但是,某些符号不能直接输出,就需要用转义符。所谓转义,就是不采用符号本来的含义,而采用另外一含义了。下面表格中列出常用的转义符:
| 转义字符 | 描述 |
| --- | --- |
| \ | (在行尾时) 续行符 |
| \ | 反斜杠符号 |
| \' | 单引号 |
| \" | 双引号 |
| \a | 响铃 |
| \b | 退格(Backspace) |
| \e | 转义 |
| \000 | 空 |
| \n | 换行 |
| \v | 纵向制表符 |
| \t | 横向制表符 |
| \r | 回车 |
| \f | 换页 |
| \oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
| \xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
| \other | 其它的字符以普通格式输出 |
以上所有转义符,都可以通过交互模式下print来测试一下,感受实际上是什么样子的。例如:
~~~
>>> 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的故事
- 从小工到专家
- Python安装
- 集成开发环境
- 第壹章 基本数据类型
- 数和四则运算
- 除法
- 常用数学函数和运算优先级
- 写一个简单的程序
- 字符串(1)
- 字符串(2)
- 字符串(3)
- 字符串(4)
- 字符编码
- 列表(1)
- 列表(2)
- 列表(3)
- 回顾list和str
- 元组
- 字典(1)
- 字典(2)
- 集合(1)
- 集合(2)
- 第贰章 语句和文件
- 运算符
- 语句(1)
- 语句(2)
- 语句(3)
- 语句(4)
- 语句(5)
- 文件(1)
- 文件(2)
- 迭代
- 练习
- 自省
- 第叁章 函数
- 函数(1)
- 函数(2)
- 函数(3)
- 函数(4)
- 函数练习
- 第肆章 类
- 类(1)
- 类(2)
- 类(3)
- 类(4)
- 类(5)
- 多态和封装
- 特殊方法(1)
- 特殊方法(2)
- 迭代器
- 生成器
- 上下文管理器
- 第伍章 错误和异常
- 错误和异常(1)
- 错误和异常(2)
- 错误和异常(3)
- 第陆章 模块
- 编写模块
- 标准库(1)
- 标准库(2)
- 标准库(3)
- 标准库(4)
- 标准库(5)
- 标准库(6)
- 标准库(7)
- 标准库(8)
- 第三方库
- 第柒章 保存数据
- 将数据存入文件
- mysql数据库(1)
- MySQL数据库(2)
- mongodb数据库(1)
- SQLite数据库
- 电子表格
- 第捌章 用Tornado做网站
- 为做网站而准备
- 分析Hello
- 用tornado做网站(1)
- 用tornado做网站(2)
- 用tornado做网站(3)
- 用tornado做网站(4)
- 用tornado做网站(5)
- 用tornado做网站(6)
- 用tornado做网站(7)
- 第玖章 科学计算
- 为计算做准备
- Pandas使用(1)
- Pandas使用(2)
- 处理股票数据
- 附:网络文摘
- 如何成为Python高手
- ASCII、Unicode、GBK和UTF-8字符编码的区别联系