Python 学习笔记之数字与字符串
Python 是解析型的语言,所以我首先需要一个 Python 解析器。我开始的时候傻乎乎地用 Ubuntu 执行了 apt-get install python, 结果它告诉我已经安装过了。
好吧,安装过就安装过了吧。开始的时候我们在交互模式 (interactive prompt) 下玩玩,方法是打开终端,输入 python 后按回车。之后,终端下就会出现提示符 >>> 。一开始我们可以把它当成表达式计算器来用,当我们输入一个数学表达式后,按下回车,这个表达式将被计算,计算结果将被顶格输出。
有趣的是,Python 还有复数的数据类型,表示的方法和我们在数学上表示的方法很类似,只不过 i 变成了 j, 也就是,在 Python 里的复数的虚部用后缀 j 表示,比如 1+2j 等。而且这个 j 是不区分大小写的。
复数还有另外一种表示方法,与 C++ 有些像,complex(0, 1) 即可。显然右边的那个参数是虚部。
现在应该来点代码了:
1 2 3 4 5 6 | >>> 1+1 2 >>> complex(0,1)+2 (2+1j) >>> 1j*1j (-1+0j) |
注意只有在提示符 >>> 之后的内容才是输入的,其它都是前一行输入对应的输出,此之谓交互模式……
然后,Python 的变量是不需要声明的,赋值的方式与 C 也是类似的,也可以使用“连等”的赋值方式。举例:
1 2 3 4 5 6 7 8 9 10 | >>> a=b=5 >>> a+b 10 >>> a=3+5j >>> a.real 3.0 >>> a.imag 5.0 >>> abs(a) 5.8309518948453007 |
注意上面的代码出现了复数的实部与虚部的获得,以及取模的操作。
Python 里有一个比较特殊的变量,叫做 _ . 这个下划线指的是上一次的输出结果,就好像我们中学计算器里的 ANS 变量似的。有个有趣的问题就是,如果你给这个下划线赋值,会发生什么。据说这会创建一个同名的局部变量,在某个作用域内覆盖这个特殊变量。相关代码:
1 2 3 4 5 6 7 8 | >>> 8 8 >>> _*2 16 >>> _*2 32 >>> _*2 64 |
Python 只有字符串的概念,没有“字符”的概念。字符串可以用单引号或双引号引起,若是用单引号引用的字符串,字符串中的双引号无需使用转义符;双引号亦然。
1 2 3 4 5 6 7 8 9 10 | >>> 'doesn\'t' "doesn't" >>> "doesn't" "doesn't" >>> '"Yes," he said.' '"Yes," he said.' >>> "\"Yes,\" he said." '"Yes," he said.' >>> '"Isn\'t," she said.' '"Isn\'t," she said.' |
字符串的行末可以加上反斜杠 (backslash) 来连接下一行,书上的原话是“这表示下一行是当前行的逻辑延续”。
1 2 3 4 5 6 7 | >>> hello="Something\n\ ... Example" >>> hello 'Something\n Example' >>> print hello Something Example |
两个字符串的字面常量写在一起可以将字符串连接,或者在两个字符串之间写上 + 号也可以连接,注意这里字面常量的意思。甚至可以让字符串乘以某个整数,意思是让这个字符串重复那么多遍。
1 2 3 4 5 6 | >>> s="hello " >>> t="python " 'world' >>> s*2+t 'hello hello python world' >>> 2*s+t 'hello hello python world' |
有个概念叫做“raw string”,是在引号之前加上一个 r, 这种模式下会跳过字符串中的转义符:
1 2 3 4 5 6 7 | >>> hello=r'Something\n\ ... "Example' >>> hello 'Something\\n\\\n "Example' >>> print hello Something\n\ "Example |
显然 raw string 是为了方便输入含有大量转义符或换行符的文字。当然这种方法也是有问题的,比如如果前引号使用了单引号,字符串中就不能包含“单独的单引号”,因为这种情况下单引号会被视为字符串结束的标志。如果你在前面加上了反斜杠,这个单引号居然就被认为是单引号了,但是此时那个反斜杠亦然存在,此之谓不能包含“单独的”单引号。代码:
1 2 3 4 5 6 | >>> hello=r'Something\'s fun' >>> print hello Something\'s fun >>> hello=r'\'' >>> print hello \' |
然后,这下面的代码产生了错误:
1 2 3 4 5 | >>> hello=r'\' File "<stdin>", line 1 hello=r'\' ^ SyntaxError: EOL while scanning string literal |
可见 Python 在这些细节上还是不够严谨。不过话说回来,这种不用转义符的字符串,本来就没有绝对的严谨。
在通常情况下,我们连续出现三个单引号或者双引号的概率的确是很小的,这样可以实现字符串内部换行,并且单引号和双引号都无需转义,但是其它的东西还是被转义了,所以这种东西也不是 raw string, 但是又类似:
1 2 3 4 5 6 7 8 9 10 | >>> hello=""" ... This funny thing'\\'\n\ ... '''\'\\' ... """ >>> print hello This funny thing'\' ''''\' >>> |
本文最后,说说字符串长度的获取……
1 2 | >>> len(hello) 28 |
