Python 核心编程(2)——起步
1.核心风格:在交互式解释器中显示变量的值
通常当你想看变量内容时,你会在代码中使用print 语句输出。不过在交互式解释器中,你可以用 print 语句显示变量的字符串表示,或者仅使用变量名查看该变量的原始值。在下面的例子中,我们把一个字符串赋值给变量myString,先用print 来显示变量的内容,之后用变量名称来显示。
>>> myString = 'Hello World!'
>>> print myString
Hello World!
>>> myString
'Hello World!'
注意:在仅用变量名时,输出的字符串是被用单引号括起来了的。这是为了让非字符串对象也能以字符串的方式显示在屏幕上--即它显示的是该对象的字符串表示,而不仅仅是字符串本身。引号表示你刚刚输入的变量的值是一个字符串。等你对Python 有了较深入的了解之后,你就知道print 语句调用str()函数显示对象,而交互式解释器则调用repr()函数来显示对象。
2.程序输入和内建函数raw_input()
a.下划线(_)在解释器中有特别的含义,表示最后一个表达式的值,ex:
>>>_
'Hello world!'
b.Python 的print 语句,与字符串格式运算符( % )结合使用,可实现字符串替换功能(%s 表示由一个字符串来替换,而%d 表示由一个整数来替换,另外一个很常用的就是%f, 它表示由一个浮点数来替换),ex:
>>> print "%s is number %d!" % ("Python", 1)
Python is number 1!
c.Print 语句也支持将输出重定向到文件(符号 >> 用来重定向输出),将输出重定向到日志文件的例子,ex:
logfile = open('/tmp/mylog.txt', 'a')
print >> logfile, 'Fatal error: invalid input!'
logfile.close()
d.从用户那里得到数据输入的最容易的方法是使用raw_input()内建函数。 它读取标准输入,并将读取到的数据赋值给指定的变量。ex:
>>> num = raw_input('Now enter a number: ')
Now enter a number: 1024
>>> print 'Doubling your number: %d' % (int(num) * 2)
Doubling your number: 2048 #内建函数int()将数值字符串转换成整数值
核心风格:在学习 Python 的过程中,如果需要得到一个生疏函数的帮助,只需要对它调用内建函数help()。
3.注释
Python 也使用 # 符号标示注释,从 # 开始,直到一行结束的内容都是注释。
4.运算符
Python 中的标准算术运算符以你熟悉的方式工作:+ - * /(,单斜杠用作传统除法) //(双斜杠用作浮点除法(对结果进行四舍五入)) % **(乘方运算符),传统除法是指如果两个操作数都是整数的话,它将执行是地板除(取比商小的最大整数),而浮点除法是真正的除法,不管操作数是什么类型,浮点除法总是执行真正的除法。
Python 当然也有标准比较运算符, 比较运算根据表达式的值的真假返回布尔值:< <= > >= == != <>,Python 目前支持两种“不等于”比较运算符, != 和 <>,目前后者慢慢地被淘汰了, 所以我们推荐使用前者。
Python 也提供了逻辑运算符:and or not 。
核心风格: 合理使用括号增强代码的可读性,在很多场合使用括号都是一个好主意,而没用括号的话,会使程序得到错误结果,或使代码可读性降低,引起阅读者困惑。
5.变量和赋值
变量名仅仅是一些字母开头的标识符--所谓字母开头--意指大写或小写字母,另外还包括下划线( _ ). 其它的字符可以是数字,字母, 或下划线。Python变量名是大小写敏感的。
Python 是动态类型语言,即不需要预先声明变量的类型,变量的类型和值在赋值那一刻被初始化。变量赋值通过等号来执行,等号(=)运算符左边是变量名,等号(=)运算符右边是存储在变量名中的值。
6.数字
Python 支持五种基本数字类型,其中有三种是整数类型。
int (有符号整数) #Python3 整型是没有限制大小的,可以当作 Long 类型使用;
long (长整数) #在Python3中已经没有BigInteger类型了;
bool (布尔值) #通常布尔值由常量 True 和 False 来表示,但在数值上下文环境中,True 会被当成 1, 而False则会被当成0。
float (浮点值)
complex (复数)
其实还有第六种数字类型 decimal, 用于十进制浮点数。但它并不是内建类型, 你必须先导入 decimal 模块才可以使用这种数值类型。
7.字符串
Python 中字符串被定义为引号之间的字符集合。Python 支持使用成对的单引号或双引号,三引号(三个连续的单引号或者双引号)可以用来包含特殊字符。使用索引运算符( [ ] )和切片运算符( [ : ] )可以得到子字符串。字符串有其特有的索引规则:第一个字符的索引是 0,最后一个字符的索引是 -1。加号( + )用于字符串连接运算,星号( * )则用于字符串重复。
8.列表和元组
可以将列表和元组当成普通的“数组”,它能保存任意数量任意类型的Python 对象。和数组一样,通过从0 开始的数字索引访问元素,但是列表和元组可以存储不同类型的对象。列表和元组有几处重要的区别:
a.列表元素用中括号( [ ])包裹,元素的个数及元素的值可以改变。元组元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以)。
b.元组可以看成是只读的列表。通过切片运算( [ ] 和 [ : ] )可以得到子集(得到的仍然是元组,不可被修改)。
9.字典
字典是Python 中的映射数据类型,工作原理类似Perl 中的关联数组或者哈希表,由键-值(key-value)对构成。几乎所有类型的Python 对象都可以用作键,不过一般还是以数字或者字符串最为常用。值可以是任意类型的Python 对象,字典元素用大括号({ })包裹。
10.代码块及缩进对齐
代码块通过缩进对齐表达代码逻辑而不是使用大括号,因为没有了额外的字符,程序的可读性更高,而且缩进完全能够清楚地表达一个语句属于哪个代码块。
11.if语句
标准if 条件语句的语法如下:
if expression: #表达示不需要使用括号括起来
if_suite
如果表达式的值非0 或者为布尔值True, 则代码组 if_suite 被执行; 否则就去执行下一条语句。
Python 当然也支持else 语句, 语法如下:
if expression: #表达示不需要使用括号括起来
if_suite
else:
else_suite
Python 还支持 elif (意指 “else-if ”)语句,语法如下:
if expression1: #表达示不需要使用括号括起来
if_suite
elif expression2: #表达示不需要使用括号括起来
elif_suite
else:
else_suite
12.while循环
标准while 条件循环语句的语法:
while expression: #表达示不需要使用括号括起来
while_suite
语句 while_suite 会被连续不断的循环执行, 直到表达式的值变成 0 或 False。
13.for循环和range()内建函数
for循环的语法:
for varible in list/string
为了输出清晰美观, 带逗号的print 语句输出的元素之间会自动添加一个空格。
ex:>>> who = 'knights'
>>> what = 'Ni!'
>>> print 'We are the', who, 'who say', what, what, what, what
We are the knights who say Ni! Ni! Ni! Ni!
>>> print 'We are the %s who say %s' % \
... (who, ((what + ' ') * 4))
We are the knights who say Ni! Ni! Ni! Ni!
Python 提供了一个range()内建函数来生成这种列表。它能接受一个数值范围, 生成一个列表。range()函数经常和len()函数一起用于字符串索引。ex:
>>> foo = 'abc'
>>> for i in range(len(foo)):
... print foo[i], '(%d)' % i
...
a (0)
b (1)
c (2)
14.列表解析
可以在一行中使用一个for 循环将所有值放到一个列表,ex:
>>> sqdEvens = [x ** 2 for x in range(8) if not x % 2] #输出8以内除以2无余数的数字的幂
>>> for i in sqdEvens:
... print i
0
4
16
36
15.文件和内建函数open()、file()
打开文件:open(file_name, access_mode = 'r');access_mode 中 'r' 表示读取,'w' 表示写入, 'a' 表示添加。其它可能用到的标声还有 '+' 表示读写, 'b'表示二进制访问,默认值为 'r'。
核心笔记:什么是属性?属性是与数据有关的项目, 属性可以是简单的数据值, 也可以是可执行对象, 比如函数和方法。哪些对象拥有属性呢? 很多。 类, 模块, 文件还有复数等等对象都拥有属性。我如何访问对象属性? 使用句点属性标识法。 也就是说在对象名和属性名之间加一个句点: object.attribute
ex:filename = raw_input('Enter file name: ')
fobj = open(filename, 'r')
for eachLine in fobj:
print eachLine,
fobj.close() #一次读入文件的所有行,然后关闭文件, 再迭代每一行输出。其是能够快速完整的访问文件。需注意文件的大小。
16.错误和异常
Python 允许在程序运行时检测错误。当检测到一个错误,Python 解释器就引发一个异常, 并显示异常的详细信息。要给你的代码添加错误检测及异常处理, 只要将它们封装在 try-except 语句当中。 try之后的代码组, 就是你打算管理的代码。 except 之后的代码组, 则是你处理错误的代码。
17.函数
Python 中的函数使用小括号( () )调用,函数在调用之前必须先定义。如果函数中没有 return 语句, 就会自动返回 None 对象。如何定义函数:
def function_name([arguments]): #定义一个函数的语法由 def 关键字及紧随其后的函数名再加上该函数需要的几个参数组成
"optional documentation string"
调用函数:>>>function_name([arguments]) #即使一个参数也没有, 小括号也不能省略。
默认参数:函数的参数可以有一个默认值, 如果提供有默认值,在函数定义中, 参数以赋值语句的形式提供。事实上这仅仅是提供默认参数的语法,它表示函数调用时如果没有提供这个参数, 它就取这个值做为默认值。
18.类
如何定义类?——使用 class 关键字定义类。可以提供一个可选的父类或者说基类; 如果没有合适的基类,那就使用 object 作为基类。
class ClassName(base_class[es]):
"optional documentation string" #可选的文档字符串
static_member_declarations #静态成员定义
method_declarations #方法定义
当一个类实例被创建时, __init__() 方法会自动执行, 在类实例创建完毕后执行。__init__() 可以被当成构建函数,。它的目的是执行一些该对象的必要的初始化工作。通过创建自己的 __init__() 方法, 你可以覆盖默认的 __init__()方法(默认的方法什么也不做),从而能够修饰刚刚创建的对象。什么是 self ? 它是类实例自身的引用。其他语言通常使用一个名为 this 的标识符。
如何创建类实例?——创建一个类实例就像调用一个函数, 它们确实拥有一样的语法。它们都是可调用对象。类实例使用同样的函数运算符调用一个函数或方法。
19.模块
模块是一种组织形式, 它将彼此有关系的Python 代码组织到一个个独立文件当中。模块可以包含可执行代码, 函数和类或者这些东西的组合。当你创建了一个 Python 源文件,模块的名字就是不带 .py 后缀的文件名。
如何导入模块?——import module_name
如何访问一个模块函数或访问一个模块变量?——一旦导入完成, 一个模块的属性(函数和变量)可以通过熟悉的 .句点属性标识法访问。ex:module.function() 和 module.variable。
标准输出的 write()方法,需要显式的在字符串中提供换行字符, 不同于print 语句, write()不会自动在字符串后面添加换行符号。
核心笔记:什么是“PEP”?——Python 增强提案(PythonEnhancement Proposal), 这也是在新版Python 中增加新特性的方式。 从初学者的角度看,它们是一些高级读物, 它们不但提供了新特性的完整描述, 还有添加这些新特性的理由, 如果需要的话, 还会提供新的语法、 技术实现细节、向后兼容信息等等。
20.实用的函数
对新Python 程序员有用的内建函数 | |
函数 | 描述 |
dir([obj]) | 显示对象的属性,如果没有提供参数, 则显示全局变量的名字 |
help([obj]) |
以一种整齐美观的形式显示对象的文档字符串, 如果没有提供任何参数, 则会进入交互式帮助。 |
int(obj) | 将一个对象转换为整数 |
len(obj) | 返回对象的长度 |
open(fn, mode) | 以 mode('r' = 读, 'w'= 写)方式打开一个文件名为 fn 的文件 |
range([[start,]stop[,step]) |
返回一个整数列表。起始值为 start, 结束值为 stop - 1; start |
raw_input(str) |
等待用户输入一个字符串, 可以提供一个可选的参数 str 用作提示信息。 |
str(obj) | 将一个对象转换为字符串 |
type(obj) | 返回对象的类型(返回值本身是一个type 对象!) |