548 lines
12 KiB
Plaintext
548 lines
12 KiB
Plaintext
|
[TOC]
|
|||
|
|
|||
|
# 第 1 章 作为命令行脚本
|
|||
|
|
|||
|
第一行注释告诉 Linux/Unix 系统当执行程序的时候,它应该使用哪个解释器。
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python
|
|||
|
# Filename : helloworld.py
|
|||
|
print 'Hello World'
|
|||
|
```
|
|||
|
|
|||
|
需要先给脚本设置可执行的权限。
|
|||
|
|
|||
|
```html
|
|||
|
$ chmod a+x helloworld.py
|
|||
|
$ ./helloworld.py
|
|||
|
Hello World
|
|||
|
```
|
|||
|
|
|||
|
通过以下命令可以把一个文件夹下的脚本都添加到 PATH 目录下,则可以在任何地方运行该脚本。
|
|||
|
|
|||
|
```html
|
|||
|
PATH=$PATH:/home/username/dir
|
|||
|
```
|
|||
|
|
|||
|
print 函数会自动加换行符,可以在 print 之后加逗号 , 来取消换行。
|
|||
|
|
|||
|
# 第 2 章 基本概念
|
|||
|
|
|||
|
## 2.1 复数
|
|||
|
|
|||
|
(2.3-4.6j)
|
|||
|
|
|||
|
## 2.2 字符串
|
|||
|
|
|||
|
单引号和双引号表示的字符串完全相同,三引号表示的字符串中间可以有单引号和双引号,并且可以换行。
|
|||
|
|
|||
|
```html
|
|||
|
'''This is the first line.
|
|||
|
This is the second line.
|
|||
|
"What's your name?," I asked.
|
|||
|
He said "Bond, James Bond."
|
|||
|
'''
|
|||
|
```
|
|||
|
|
|||
|
字符串行末的反斜杠表示下一行继续。
|
|||
|
|
|||
|
```html
|
|||
|
"This is the first sentence.\
|
|||
|
This is the second sentence."
|
|||
|
```
|
|||
|
|
|||
|
自然字符串用 r 作为前缀,当不想让字符串中的内容转义时使用,比如正则表达式。
|
|||
|
|
|||
|
```html
|
|||
|
r"Newlines are indicated by \n"
|
|||
|
```
|
|||
|
|
|||
|
Unicode 是书写国际文本的标准方法。在处理文本文件的时候应该使用 Unicode 字符串,特别是这个文件含有用非英语的语言写的文本时使用。
|
|||
|
|
|||
|
```html
|
|||
|
u"This is a Unicode string."
|
|||
|
```
|
|||
|
|
|||
|
## 2.3 对象
|
|||
|
|
|||
|
Python 中用到的任何东西都被称为对象;
|
|||
|
|
|||
|
## 2.4 逻辑行与物理行
|
|||
|
|
|||
|
可以将多个逻辑行写在一个物理行中,需要用分号分割;可以将一个逻辑行写在多个物理行中,需要在行末加 \ 。
|
|||
|
|
|||
|
## 2.5 缩进
|
|||
|
|
|||
|
同一层次的语句必须拥有相同的缩进。
|
|||
|
|
|||
|
# 第 3 章 运算符
|
|||
|
|
|||
|
| 运算符 | 说明 |
|
|||
|
| --- | --- |
|
|||
|
| ** | 幂 |
|
|||
|
| // | 取整除 |
|
|||
|
| % | 取模,不取整 |
|
|||
|
| ~ | 按位翻转,-(x+1) |
|
|||
|
| and | 与 |
|
|||
|
| or | 或 |
|
|||
|
| not | 非 |
|
|||
|
|
|||
|
|
|||
|
# 第 4 章 控制流
|
|||
|
|
|||
|
## 4.1 条件语句
|
|||
|
|
|||
|
Java 中的 else if 在 Python 中对应的语句为:elif。
|
|||
|
|
|||
|
True False
|
|||
|
|
|||
|
## 4.2 控制台输入
|
|||
|
|
|||
|
从控制台中输入一行:
|
|||
|
|
|||
|
```
|
|||
|
guess = int(raw_input('Enter an integer : '))
|
|||
|
```
|
|||
|
|
|||
|
## 4.3 循环
|
|||
|
|
|||
|
range(m, n, step),返回一个从 m 到 n,步长为 stap 的序列,不包含 n 。
|
|||
|
|
|||
|
for 后面的 else 语句在 break 退出的情况下不会执行:
|
|||
|
```
|
|||
|
for i in range(1, 5):
|
|||
|
print i
|
|||
|
else:
|
|||
|
print 'The for loop is over
|
|||
|
```
|
|||
|
|
|||
|
len(str) 返回字符串的长度;
|
|||
|
|
|||
|
# 第 5 章 函数
|
|||
|
|
|||
|
```
|
|||
|
def sayHello():
|
|||
|
print 'hello world!'
|
|||
|
|
|||
|
sayHello()
|
|||
|
```
|
|||
|
|
|||
|
global 用来声明全局变量。
|
|||
|
|
|||
|
## 5.1 默认参数
|
|||
|
|
|||
|
```
|
|||
|
def say(message, times = 1):
|
|||
|
print message * times
|
|||
|
|
|||
|
say('Hello')
|
|||
|
say('World', 5)
|
|||
|
```
|
|||
|
|
|||
|
## 5.2 关键参数
|
|||
|
|
|||
|
使用名字而不是位置来指定参数
|
|||
|
|
|||
|
```
|
|||
|
def func(a, b=5, c=10):
|
|||
|
print 'a is', a, 'and b is', b, 'and c is', c
|
|||
|
|
|||
|
func(3, 7)
|
|||
|
func(25, c=24)
|
|||
|
func(c=50, a=100)
|
|||
|
```
|
|||
|
|
|||
|
## 5.3 return
|
|||
|
|
|||
|
没有 return 语句的函数默认 return None ,None 在 Python 中是指一个没有任何值的特殊类型。
|
|||
|
|
|||
|
## 5.4 DocStrings
|
|||
|
|
|||
|
使用函数的 \_\_doc\_\_ 属性可以返回函数中的文档字符串。
|
|||
|
|
|||
|
```
|
|||
|
def printMax(x, y):
|
|||
|
'''Prints the maximum of two numbers.
|
|||
|
The two values must be integers.'''
|
|||
|
x = int(x)
|
|||
|
y = int(y)
|
|||
|
if x > y:
|
|||
|
print x, 'is maximum'
|
|||
|
else:
|
|||
|
print y, 'is maximum'
|
|||
|
|
|||
|
printMax(3, 5)
|
|||
|
print printMax.__doc__
|
|||
|
```
|
|||
|
|
|||
|
# 第 6 章 模块
|
|||
|
|
|||
|
模块基本上就是一个包含定义函数和变量的文件,使用 import 语句导入一个模块;
|
|||
|
|
|||
|
```
|
|||
|
import sys
|
|||
|
```
|
|||
|
|
|||
|
.pyc 是字节文件,会比源文件快很多,而且与平台无关。
|
|||
|
|
|||
|
使用 from sys import argv 之后可以直接在代码中使用 argv ,而不用 sys.argv。但是为了易读性,最好不要用这种方式。
|
|||
|
|
|||
|
\_\_name\_\_ 属性为一个模块的名字。
|
|||
|
|
|||
|
```
|
|||
|
if __name__ == '__main__':
|
|||
|
print 'This program is being run by itself'
|
|||
|
else:
|
|||
|
print 'I am being imported from another module
|
|||
|
```
|
|||
|
|
|||
|
创建一个 python 文件之后,要使得另一个 python 文件可以使用它,需要把它放在这个文件的同目录下,或者把它放到 sys.path 目录下。
|
|||
|
|
|||
|
使用 . 运算符来引用模块中的成员。
|
|||
|
|
|||
|
dir() 函数可以列出一个模块的函数、变量和类。
|
|||
|
|
|||
|
# 第 7 章 数据结构
|
|||
|
|
|||
|
## 7.1 列表
|
|||
|
|
|||
|
列表是处理一组有序的集合,并不说排好序了,而是有顺序。使用 [ ] 来定义一个列表。
|
|||
|
|
|||
|
```python
|
|||
|
# This is my shopping list
|
|||
|
shoplist = ['apple', 'mango', 'carrot', 'banana']
|
|||
|
print 'I have', len(shoplist),'items to purchase.'
|
|||
|
print 'These items are:', # Notice the comma at end of the line
|
|||
|
for item in shoplist:
|
|||
|
print item,
|
|||
|
shoplist.append('rice')
|
|||
|
shoplist.sort()
|
|||
|
del shoplist[0]
|
|||
|
```
|
|||
|
|
|||
|
## 7.2 元组
|
|||
|
|
|||
|
元组不可变。
|
|||
|
|
|||
|
一个元组可以包含另一个元组。
|
|||
|
|
|||
|
使用 ( ) 定义一个元组。
|
|||
|
|
|||
|
```
|
|||
|
zoo = ('wolf', 'elephant', 'penguin')
|
|||
|
new_zoo = ('monkey', 'dolphin', zoo)
|
|||
|
print 'Last animal brought from old zoo is', new_zoo[2][2]
|
|||
|
```
|
|||
|
|
|||
|
元组可以用在打印语句中。
|
|||
|
|
|||
|
```
|
|||
|
age = 22
|
|||
|
name = 'Swaroop'
|
|||
|
print '%s is %d years old' % (name, age)
|
|||
|
print 'Why is %s playing with that python?' % name
|
|||
|
```
|
|||
|
|
|||
|
## 7.3 字典
|
|||
|
|
|||
|
必须使用不可变的对象作为键。
|
|||
|
|
|||
|
d = {key1 : value1, key2 : value2 } 定义一个字典。
|
|||
|
|
|||
|
items() 方法返回所有 key。
|
|||
|
|
|||
|
has_key() 方法判断是否含有一个 key。
|
|||
|
|
|||
|
## 7.4 序列
|
|||
|
|
|||
|
字符串,元组和列表都是序列,序列主要具有索引和切片操作;
|
|||
|
|
|||
|
简单复制语句不会创建拷贝,要拷贝一个序列时用切片操作
|
|||
|
|
|||
|
```
|
|||
|
mylist = shoplist[:]
|
|||
|
```
|
|||
|
|
|||
|
## 7.5 字符串
|
|||
|
|
|||
|
startwith()
|
|||
|
|
|||
|
in 操作符可以判断一个给定字符串是否在另一个字符串中。
|
|||
|
|
|||
|
find() 查找一个字符串在另一个字符串中的位置,如果查找失败返回 -1。
|
|||
|
|
|||
|
# 第 8 章 面向对象
|
|||
|
|
|||
|
## 8.1 self
|
|||
|
|
|||
|
self 类似于 java 中的 this 指针。
|
|||
|
|
|||
|
## 8.2 类
|
|||
|
|
|||
|
```
|
|||
|
class Person:
|
|||
|
pass # An empty block
|
|||
|
|
|||
|
p = Person()
|
|||
|
print p
|
|||
|
```
|
|||
|
|
|||
|
## 8.3 对象的方法
|
|||
|
|
|||
|
方法和函数最主要的区别是方法需要传入一个 self 变量。
|
|||
|
|
|||
|
```
|
|||
|
class Person:
|
|||
|
def sayHi(self):
|
|||
|
print 'Are you OK?'
|
|||
|
|
|||
|
leijun = Person()
|
|||
|
p.sayHi()
|
|||
|
```
|
|||
|
|
|||
|
## 8.4 \_\_init\_\_()
|
|||
|
|
|||
|
构造函数
|
|||
|
|
|||
|
```
|
|||
|
class Person:
|
|||
|
def __init__(self, name):
|
|||
|
self.name = name
|
|||
|
def sayHi(self):
|
|||
|
print 'Hello, my name is', self.name
|
|||
|
|
|||
|
p = Person('Swaroop')
|
|||
|
p.sayHi()
|
|||
|
```
|
|||
|
|
|||
|
## 8.5 类与对象的方法
|
|||
|
|
|||
|
成员名有双下划线前缀 \_\_ ,比如 \_\_init\_\_(),则为私有成员。如果自己定义的类中某个成员想定义为私有成员,则在该成员名前加单下划线 \_,虽然 Python 没有规定这样做可以把成员变成私有成员,但是可以作为一种编程约定来使用。
|
|||
|
|
|||
|
## 8.6 \_\_del\_\_()
|
|||
|
|
|||
|
析构函数
|
|||
|
|
|||
|
## 8.7 继承
|
|||
|
|
|||
|
```
|
|||
|
class Person:
|
|||
|
def __init__(self, name, age):
|
|||
|
self.__name = name
|
|||
|
self.__age = age
|
|||
|
|
|||
|
class Worker(Person):
|
|||
|
def __init__(self, name, age, salary):
|
|||
|
Person.__init__(self, name, age)
|
|||
|
self.salary = salary
|
|||
|
```
|
|||
|
|
|||
|
# 第 9 章 输入 / 输出
|
|||
|
|
|||
|
## 9.1 文件
|
|||
|
|
|||
|
```
|
|||
|
poem = '''\
|
|||
|
Programming is fun
|
|||
|
When the work is done
|
|||
|
if you wanna make your work also fun:
|
|||
|
use Python!
|
|||
|
'''
|
|||
|
f = file('poem.txt', 'w')
|
|||
|
f.write(poem)
|
|||
|
f.close()
|
|||
|
|
|||
|
f = file('poem.txt')
|
|||
|
while True:
|
|||
|
line = f.readline()
|
|||
|
if len(line) == 0:
|
|||
|
break
|
|||
|
print line
|
|||
|
f.close()
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
## 9.2 序列化
|
|||
|
|
|||
|
pickle 模块可以用于存取一个对象。
|
|||
|
|
|||
|
cPickle 功能完全相同,但是用 c 语言编写的,速度快 1000 倍;
|
|||
|
|
|||
|
```
|
|||
|
import cPickle as p
|
|||
|
|
|||
|
shoplistfile = 'shoplist.data'
|
|||
|
shoplist = ['apple', 'mango', 'carrot']
|
|||
|
|
|||
|
f = file(shoplistfile, 'w')
|
|||
|
p.dump(shoplist, f)
|
|||
|
f.close()
|
|||
|
|
|||
|
del shoplist
|
|||
|
|
|||
|
f = file(shoplistfile)
|
|||
|
storedlist = p.load(f)
|
|||
|
print storedlist
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
# 第 10 章 异常
|
|||
|
|
|||
|
## 10.1 try-except
|
|||
|
|
|||
|
可以跟上一个 else 从句,当没有异常发生时会执行;
|
|||
|
|
|||
|
```
|
|||
|
import sys
|
|||
|
try:
|
|||
|
s = raw_input('Enter something --> ')
|
|||
|
except EOFError:
|
|||
|
print '\nWhy did you do an EOF on me?'
|
|||
|
sys.exit() # exit the program
|
|||
|
except:
|
|||
|
print '\nSome error/exception occurred.'
|
|||
|
# here, we are not exiting the program
|
|||
|
print 'Done'
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
## 10.2 引发异常
|
|||
|
|
|||
|
raise 语句可以引发一个异常,引发的异常应该是 Error 或者 Exception 的类或者子类;
|
|||
|
|
|||
|
```
|
|||
|
class MyException(Exception):
|
|||
|
def __init__(self):
|
|||
|
self.name = 'MyException'
|
|||
|
|
|||
|
try:
|
|||
|
raise MyException
|
|||
|
except MyException, e:
|
|||
|
print e.name
|
|||
|
else:
|
|||
|
print 'nothing'
|
|||
|
```
|
|||
|
|
|||
|
## 10.3 finally
|
|||
|
|
|||
|
finally 可以保证一个语句块无论如何都会执行。
|
|||
|
|
|||
|
# 第 11 章 Python 标准库
|
|||
|
|
|||
|
## 11.1 sys 模块
|
|||
|
|
|||
|
sys.argv 参数列表。
|
|||
|
|
|||
|
sys.stdin sys.stdout sys.stderr。
|
|||
|
|
|||
|
## 11.2 os 模块
|
|||
|
|
|||
|
该模块包含了普遍的操作系统功能,使程序能够与平台无关;
|
|||
|
|
|||
|
os.name 字符串指示你正在使用的平台。比如对于 Windows,它是 'nt' ,而对于 Linux/Unix 用户,它是 'posix'。
|
|||
|
|
|||
|
os.getcwd() 函数得到当前工作目录,即当前 Python 脚本工作的目录路径。
|
|||
|
|
|||
|
os.getenv() 和 os.putenv() 函数分别用来读取和设置环境变量。
|
|||
|
|
|||
|
os.listdir() 返回指定目录下的所有文件和目录名。
|
|||
|
|
|||
|
os.remove() 函数用来删除一个文件。
|
|||
|
|
|||
|
os.system() 函数用来运行 shell 命令。
|
|||
|
|
|||
|
os.linesep 字符串给出当前平台使用的行终止符。例如,Windows 使用 '\r\n',Linux 用 '\n' 而 Mac 使用 '\r'。
|
|||
|
|
|||
|
os.path.split() 函数返回一个路径的目录名和文件名。
|
|||
|
|
|||
|
```
|
|||
|
os.path.split('/home/swaroop/byte/code/poem.txt')
|
|||
|
('/home/swaroop/byte/code', 'poem.txt')
|
|||
|
```
|
|||
|
|
|||
|
os.path.isfile() 和 os.path.isdir() 函数分别检验给出的路径是一个文件还是目录。类似地,os.path.exists() 函数用来检验给出的路径是否真地存在。
|
|||
|
|
|||
|
# 第 12 章 更多 Python 的内容
|
|||
|
|
|||
|
## 12.1 特殊的方法
|
|||
|
|
|||
|
特殊的方法主要用于模仿某个行为。
|
|||
|
|
|||
|
| 名称 | 说明 |
|
|||
|
| ------------ | ------------ |
|
|||
|
| __init__(self,...) | 这个方法在新建对象恰好要被返回使用之前被调用。 |
|
|||
|
| __del__(self) | 恰好在对象要被删除之前调用。 |
|
|||
|
| __str__(self) | 在我们对对象使用 print 语句或是使用 str() 的时候调用。 |
|
|||
|
| __lt__(self, other) | 当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,> 等等)都有特殊的方法。 |
|
|||
|
| __getitem__(self, key) | 使用 x[key] 索引操作符的时候调用。 |
|
|||
|
| __len__(self) | 对序列对象使用内建的 len() 函数的时候调用。 |
|
|||
|
|
|||
|
## 12.2 列表综合
|
|||
|
|
|||
|
```
|
|||
|
listone = [2, 3, 4]
|
|||
|
listtwo = [2*i for i in listone if i > 2]
|
|||
|
print listtwo
|
|||
|
```
|
|||
|
|
|||
|
## 12.3 在函数中接受元组和列表
|
|||
|
|
|||
|
```
|
|||
|
def powersum(power, *args):
|
|||
|
total = 0
|
|||
|
for i in args:
|
|||
|
total += pow(i, power)
|
|||
|
return tota
|
|||
|
```
|
|||
|
|
|||
|
由于在 args 变量前有 \* 前缀,所有多余的函数参数都会作为一个元组存储在 args 中。如果使用的是 \*\* 前缀,多余的参数则会被认为是一个字典的 键 / 值 对。
|
|||
|
|
|||
|
## 12.4 lambada 形式
|
|||
|
|
|||
|
lambda 语句被用来创建新的函数对象,并且在运行时返回它们。
|
|||
|
|
|||
|
```
|
|||
|
def make_repeater(n):
|
|||
|
return lambda s: s*n
|
|||
|
twice = make_repeater(2)
|
|||
|
print twice('word')
|
|||
|
print twice(5)
|
|||
|
|
|||
|
wordword
|
|||
|
10
|
|||
|
```
|
|||
|
|
|||
|
## 12.5 exec 和 eval()
|
|||
|
|
|||
|
```
|
|||
|
exec 'print "Hello World"'
|
|||
|
eval('2*3')
|
|||
|
```
|
|||
|
|
|||
|
## 12.6 assert 语句
|
|||
|
|
|||
|
asser t 断言在非真时会引发一个 AssertionErro。
|
|||
|
|
|||
|
```
|
|||
|
mylist = ['item']
|
|||
|
assert len(mylist) >= 1
|
|||
|
```
|
|||
|
|
|||
|
## 12.7 repr() 函数
|
|||
|
|
|||
|
repr() 函数和反引号用来获取对象的可打印的表示形式。
|
|||
|
|
|||
|
可以通过定义类的\_\_repr\_\_() 方法来控制你的对象在被 repr 函数调用的时候返回的内容。
|
|||
|
|
|||
|
```
|
|||
|
>>> i = []
|
|||
|
>>> i.append('item')
|
|||
|
>>> `i`
|
|||
|
"['item']"
|
|||
|
>>> repr(i)
|
|||
|
"['item']
|
|||
|
```
|
|||
|
|
|||
|
# 参考资料
|
|||
|
|
|||
|
1. 《简明 Python 教程》
|