简明Python3教程 6.基础
你肯定不满足于只打印"Hello World"吧? 你想要的更多 - 你希望得到一些输入,操纵它后再从中得到某些东西.
我们可以使用python中的常量和变量实现这些功能。
字面常量(literal constant)
字面常量的一个例子是数字诸如5, 1.23, 9.25e-3或字符串This is a string', "It's a string!".
顾名思义,字面常量的重点在于"字面", 你直接以字面的意义使用它们。数字2永远是数字2绝不会是别的东西。
而常量代表它们永远不会被改变,因此它们全被称为字面常量
数字
python3拥有3种数字类型 - 整数,浮点和复数(注: python3的整数类型已经被统一了,再没有短整数和长整数的分别)
• 例如,2是一个整数.
• 浮点数的例子如3.23, 52.3E-4. E代表10的幂,在这里52.3E-4等于52.3 * 10-4
• -5+4j, 2.3 - 4.6j属于复数
编程老鸟请注意
python3没有"long int"类型,事实上python的整数可以任意大(注: 只是理论上的,再咋地存储器也不是无限的)
字符串
字符串是一个字符序列,经常用来表示字词. 字词可以是英语也可以是Unicode标准支持下的任何语言.
而unicode支持世界上绝大多数语言(http://www.unicode.org/faq/basic_q.html#16).
编程老鸟请注意
在python3中不存在纯ASCII字符串,因为Unicode是ASCII的父集。
如果你真的需要一个纯ASCII字符串,则需调用字符串.encode("ascii")方法.
详见StackOverflow中的相关讨论
(http://stackoverflow.com/questions/175240/how-do-i-convert-a-files-format-from-unicode-to-ascii-using-python#175270).
(注: 没必要看了过时了,调用encode后产生一个bytes对象,它不是字符串对象,python3中的所有字符串都是unicode)
我几乎可以保证在你编写的每个程序中都会用到字符串,下面将教你如何使用字符串,你要特别留心点阿.
单引号
你可以将字符串放到单引号中,所有空白字符即空格和tab都回原封保留。
双引号
双引号和单引号的效果完全相同。
三引号
在指定多行字符串的时候可以利用三引号 - ("""或'''), 在三引号中还能自由的使用单引号和双引号. 一个例子:
'''This is a multi
This is the second
"What's your name?
He said "Bond, Jam
'''
转义字符
假设你想要一个带单引号(')的字符串,你会怎么写呢?例如What's your name?,
你不能写成'What's your name?', 因为python会搞不清字符串是从哪开始又是从哪结束.
所以你需要告诉python字符串中间的单引号并不是字符串的结束标志。利用转义字符可以做到这点.
将单引号替换成 /' - 注意反斜杠,这样字符串就变成'What/'s your name?'了.
另一个办法是使用双引号"What's your name?",
不过当你需要双引号的时候和单引号的情况类似,必须加上反斜杠 /", 而反斜杠也一样必须表示成//
如果你需要一个双行字符串呢? 一个办法是使用前面提到的三引号或者使用换行的转义字符/n开始新的一行,
还有一个有用的转义字符/t表示tab, 转义字符太多了我只说了常用的.
另一个值得注意的地方是在一个字符串末尾的反斜杠表示这个字符串将被合并到下一行, 例如:
"This is the first sentence./
This is the second sentence."
上面的字符串等价于"This is the first sentence. This is the second sentence.".
原始字符串
如果你不希望python对字符串进行特别处理, 比如取消转义字符, 可以为字符串加上前缀r或R.
例如r"Newlines are indicated by /n".
字符串是不可变类型
这意味着创建一个字符串对象后就无法改变它了. 这听起来很糟糕, 其实非也, 后面见分解.
字面字符串连接
如果你将两个字面字符串相邻, 它们会被python自动合并到一起.
例如'What/'s ' 'your name?'会变为"What's your name?"
C++程序员请注意
python没有单独的字符类型, 也没这个必要我保证你不会为此烦恼.
Perl/PHP程序员请注意
单引号和双引号字符串完全相同, 没有任何区别
正则表达式用户请注意
永远使用原始字符串编写正则表达式, 否则会需要大量的反斜杠, 例如反向引用可以表示为'//1'或r'/1'.
字符串的format方法
有时我们需要使用额外信息构造字符串, 这时format就很有用了.
#!/usr/bin/python
# Filename: str_format.py
age = 25
name = 'Swaroop'
print('{0} is {1} years old'.format(name, age))
print('Why is {0} playing with that python?'.format(name))
输出:
$ python str_format.py
Swaroop is 25 years old
Why is Swaroop playing with that python?
format如何工作?
一个string可以含有某些格式说明符, 随后调用的format将用你提供给它的参数替换对应的格式说明符.
观察上面的例子, {0}对应变量name它也是format的第1个参数. 与之类似{1}对应format的第2个参数age.
注意我们也可以使用字符串连接达到同样的目的: name + ' is ' + str(age) + ' years old'.
但是这种方式太乱啊, 很容易出错. 而且需要手动将变量转换为字符串而format可以为我们代劳.
最后, 使用format我们可以改变最终生成的字符串而不必修改传给format的变量, 反之一样.
format的本质就是将其参数替换到字符串中的格式说明符, 下面是一些更复杂的使用方式:
>>> '{0:.3}'.format(1/3) #小数点后保留3位
'0.333'
>>> '{0:_^11}'.format('hello') #以下划线填充字符串到11位长, hello中间对齐
'___hello___'
>>> '{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python')
# 关键字格式化
'Swaroop wrote A Byte of Python'
关于格式说明符的具体信息见Python增强提议No.3101(http://www.python.org/dev/peps/pep-3101/).
变量
只使用字面常量很快就会感到无聊 - 我们需要某种方式存储并操作任何信息,变量就是其主要手段。
正如其名 - 变量的值可以变化,即可以用它们存储任何数据。
变量实际上只是计算机存储器的一部分,用于存储你给出的信息。
与字面常量不同,你需要访问这些变量,因此需要你给它们起名字。
标识符命名
变量是标识符的一个例子,而标识符用于标识某些东西的名字。下面是一些命名标识符识必须遵守的规则:
• 标识符的第一个字符必须是字母(包括大小写ASCII字母或unicode字符)或下划线('_')(注: 没错,用中文试试哈)
• 后面的字符可以由字母(大小写ASCII字母或unicode字符),下划线('_')和数字组成.
• 标识符是大小写敏感的,例如myname和myName是不同的,前者小写后者大写.
• 一些合法标识符的例子i, __my_name, name_23, a1b2_c3,
resumé_count.(注: 不知道乱码还是某国语言...)
• 非法标识符的例子, 2things, my-name, "this_is_inquotes"
数据类型
变量能容纳不同类型的值,被称为数据类型. 基本数据类型包括我们刚才讨论过的数字和字符串.
在后面的章节中我们将看到如何利用类创建我们自己的数据类型。
对象
记住,在python中一切皆对象,因此从广义上我们不说"某物"而说"某对象"
面向对象编程用户请注意
python是很彻底的面向对象语言,它的一切包括数字,字符串和函数全是对象。
如何编写python程序
从现在开始,保存和运行一个python程序的过程如下:
1. 打开你钟爱的编辑器.
2. 输入本书的范例代码.
3. 用源文件注释中给出的名字保存文件。并且我遵循惯例为python文件加上py后缀名.
4. 以命令python program.py启动解释器执行程序或者使用IDLE. 当然你也可以使用前文介绍过的执行方法。
范例: 使用变量和字面常量
# Filename : var.py
i = 5
print(i)
i = i + 1
print(i)
s = '''This is a multi-line string
This is the second line.'''
print(s)
#输出:
$ python var.py
5
6
This is a multi-line stri
This is the second line.
范例工作流程:
首先,我们使用赋值运算符(=)为变量i赋值字面常量5,这行被称做一条语句,因为它表示需要完成某种操作,
这里是为变量名i绑定数值5. 接下来我们使用print语句打印i的值.
(注: py2k中print是条语句,说成"print语句"可以接受,但py3k中print是个地道的函数,因此说"调用print函数"更为恰当)
然后我们为i的值加1并存回i, 当打印它的值时得到意料中的6。
与之类似,我们又为变量S赋值字面字符串然后打印它。
静态语言程序员请注意
变量被赋值后即可使用,这里无需变量声明或数据类型定义.
逻辑行和物理行
你所看到的代码中的行即为物理行,而python将一条语言当作一个逻辑行。
python假设一个物理行对应一个逻辑行。
逻辑行的例子是形如print('Hello World')的单条语句,如果它独占一行(就象你在编辑器看到的),那么它也是一个物理行.
python本身鼓励每条语句占一行,这样可读性更强。
如果你希望在一个物理行包含多个逻辑行,则必须使用分号(;)显式一个逻辑行/语句的结束. 例,
i = 5
print(i)
与下面的等效
i = 5;
print(i);
这样写的效果也一样
i = 5; print(i);
甚至可以这样写
i = 5; print(i)
虽然有多种写法,但我强烈建议你一个物理行只包含一个逻辑行. 不过当逻辑行太长,也可以把它写成多个物理行。
这些办法都是为了尽可能避免分号,使得代码的可读性更强。事实上我从不使用甚至都没在python程序中看到过分号。
下面是一个将逻辑行扩展为多个物理行的例子,它被称做显式行合并(explicit line joining)
s = 'This is a string. /
This continues the string.'
print(s)
相应的输出为:
This is a string. This continues the string.
与之类似的,
print
/(i)
相当于
print(i)
另外某些情况下会导致隐式行合并(implicit line joining),比如逻辑行使用了大中小括号,此时无需反斜杠。
在后面的章节我们会使用列表编写程序,届时你会看到这种用法。
缩进
在python中空白字符是非常重要的,更具体的说是每行开头的空白字符十分重要。这被称作缩进。
逻辑行开头的空白字符(空格和tab)用于确定逻辑行的缩进级别,依此按顺序将语句分组。
也就是说同组的语句必须拥有相同的缩进级别,而这些语句组被称作块。下一章我们会看到块的重要性。
现在你需要牢记的是错误的缩进会导致程序出错, 举个例子:
i = 5
print('Value is ', i) #错误! 注意本行的开头多了一个空格.
print('I repeat, the value is ', i)
运行上面代码会得到下面的错误信息:
File "whitespace.py", line 4
print('Value is ', i) # Error! Notice a single space at the start of the line
^
IndentationError: unexpected indent
你可能注意到了程序的第2行的开头多了一个空格. 错误信息告诉我们程序的语法是非法的, 即程序的编写有问题.
这也意味着你不能随便开始新的语句块(除了主块, 我们一直在主快内编写). 那么要如何开始新的块呢? 后面的章节会有详解, 比如控制流.
如何缩进
不要混用空格和tab, 否则在不同的平台可能无法正常工作.
我强烈建议你使用tab或4个空格进行缩进, 谨记两者则其一然后一直用下去.
静态语言程序员请注意
python总是使用缩紧表达语句块, 这里没有括号啥事. 运行代码Run from __future__ import braces了解更多
(注: 表运行了, 过时了无视吧, 不过前句话没过时啊!)
小结
本章涉及到很多核心知识, 下面会接触到更有趣的东东, 比如控制流语句.
在此之前请确定你已经对本章的内容有足够的理解了.
本文来自博客园,作者:方倍工作室,转载请注明原文链接:https://www.cnblogs.com/txw1958/archive/2012/12/10/A_Byte_of_Python3_Basics.html