Python 2 学习笔记
常用指令
- print 打印
- id 显示内存地址
- help 帮助
- div
- type
整数溢出
利用模块解决除法和编码格式(支持中文)的方法
引入模块
- import math
- from xxxx1 import xxxx2 // xxxx2是xxxx1大模块中的小模块
数和四则运算
divmod(5,2) 5 % 2 模
round(2.222) 四舍五入
字符串
1 | > "Py" + "thon" |
raw_input(…)
raw_input([prompt]) -> string
Read a string from standard input. The trailing newline is stripped.
If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.
On Unix, GNU readline is used if enabled. The prompt string, if given,
is printed without a trailing newline before reading.
基本操作
- len()
- in // return False or Ture
- max()
- min()
- cmp(str1,str2) // same is 0, less is -1 , bigger is 1
-
格式化输出
1 | > a = "grayland" |
常用方法
1 | > a = "my name is grayland" |
Python 避免中文是乱码
- # -- coding: utf-8 -- // -*- 没有用
- # coding:utf-8
- unicode_str = unicode(‘中文’, encoding=‘utf-8’) // 遇到字符(节)串,立刻转化为 unicode,不要用 str(),直接使用 unicode()
- import codecs
codecs.open(‘filename’, encoding=‘utf8’)
遇到字符(节)串,立刻转化为 unicode,不要用 str(),直接使用 unicode()
索引和切片
1 | > a = "python" |
列表 List
相当于 NSArray. 列表可以无限大.
- insert(index, obj)
- append 添加元素 listA.append(obj), obj必须是 iterable 可迭代的.
- extend 扩展 listA.extend(listB)
- remove(obj) only remove the first object, if obj not exist cause an error.
- pop(index) if index not exist , then remove the last.
- reverse()
- sort()
-
- same as extend
list str 转化:
- split
- join
判断对象是否可迭代:
判断其属性有 'iter’属性
hasattr(obj, ‘iter’) // Trure or False
元组 tuple
元组是用圆括号括起来的,其中的元素之间用逗号隔开。
元组中的元素类型是任意的 Python 数据。
元组不能修改, list 和 str 的融合产物
- tuple 操作比 list 快.
- 不能修改数据, 安全
- tuple 可以用作 key,list 不可以
- tuple 可以用在字符串格式化总
a = 111,222,‘ccc’ // then a is tuple
元组可以用于格式化:
“my name is %s, age is %d”%(“grayland”, 27)
字段 dict
创建字典:
1 | > dictA = {} |
访问字典:
1 | > D = {'name':'grayland, 'age':27} |
其他方法:
- len(dictX) // get the num of key-value.
- del d[key] // delete the key-value pair in the dict ‘d’.
- key in d
- copy // a = b.copy(), import copy, can use copy.deepcopy(obj)
- clear()->None // Remove all items
- get(key)
- get(key, default) // If key no exist, return default.
- setdefault() // as get(key,default), but if key not exist then add to de dict
- items() // return list[(tuple), (tuple), …]
- pop(key)
- popitems() // Random to pop 1 key-value pair
- update(dictX) // Cover with dictX
- has_key(key)
字符串格式化输出:
“my name is %(key)s” % {‘key’:‘value’} // >> ‘my name is value’
集合 Set
无序,不重复.
tuple 类似 list 和 str 的集合.
set 类似 list 和 dict 的集合.
1 | > s1 = set('abcdefff') |
其他:
add(obj)
pop()
remove(obj)
discard(obj) // same as remove(obj), but if not exist do nothing.
clear()
issubset(setB)
|
&
diffenece(setB) // 取反
语句
print obj, // 用在循环中, 不换行. 否则换行
import
1 | > import math |
赋值语句
1 | > x,y,z = 1,2,3 |
条件语句
1 | // If/else/elif |
while
1 | // while ... |
三元操作符
a = y if x else z // 如果 x is True return y else return z.
循环
1 | > for i in "hello": |
并行迭代
1 | > a = [1,2,3,4,5] |
enumerate(listA) -> (index, listA[index])
enumerate(listA, start=10) -> (index+10, listA[index])
list 解析
for i in range(1,4):
a.append(i**2)
> [1,4,9]
list 解析:
a = [x**2 for x in range(1,4)]
> a = [1,4,9]
打开文件
1 | > f = open("xxx.txt") |
文件状态
import os
os 模块中有 文件状态的方法 stat(path)
import time // 时间相关模块
read/readline/readlines
read:
read([size]) -> read at most size bytes, returned as a string.
If the size argument is negative or omitted, read until EOF is reached. Notice that when in non-blocking mode, less data than what was requested may be returned, even if no size parameter was given.
readline:
readline([size]) -> next line from the file, as a string.
Retain newline. A non-negative size argument limits the maximum number of bytes to return (an incomplete line may be returned then). Return an empty string at EOF.
readlines:
readlines([size]) -> list of strings, each a line from the file.
Call readline() repeatedly and return a list of the lines so read.
The optional size argument, if given, is an approximate bound on the total number of bytes in the lines returned.
- seek(offset, whence) // whence default = 0,
0 - offset from begin offset must be positive +
1 - offset from current, offset should be positive/nagative +/-
2 - offset from the end, offset must be nagative. - - tell() // get current position
迭代
逐个访问
1 | > lst = ['g', 'r', 'a', 'y', 'l', 'a', 'n', 'd'] |
文件迭代器
1 | > f = open(...) |
自省
- help() 进入 help 模式
- help(…)
- dir(…)
- __doc__
- __builtins__
- callable() 测试函数可调用性
- isinstance(‘strxxxxx’, str) -> True
- issubclass(classB, classA) -> BOOL
函数
f(x) = ax + b
…
变量本质上是一个占位符
定义
def func(inputA, inputB,…):
def func(X=default,Y=default):
*def func(a,arg): // *arg表示多个可变参数 (tuple 类型传递)
变量无类型,对象有类型
Python 中为对象编写接口,而不是为数据类型
命名
- 文件名:全小写,可以使用下划线
- 函数名:小写,可以用下划线风格增加可读性 或 类似myFunction这样的驼峰命名法
- 变量:全小写
文档
#: 注释
“”" … “”": 三个引号包围表示文档, 可以用 __doc__ 查看
传值方式
1 | > def funA(a,b): |
特殊函数
- filter(func, seq) // func(x)->bool
- map(func, seq) // excute func(x) in seq
- reduce(func, seq) // func(func(func(0,1),2),3),…
- lambda // lambda input:output
- yield
lambda:
1 | > nums = range(10) |
类 class
对象的相关定义:
- 对象
- 状态
- 行为
- 标识
简化后就是: 属性和方法
定义
旧类
深
1 | > class Person: |
新类
广
1 | > class NewPerson(object): |
(object) 表示继承自 object 类. Python3 中全部继承自 object 类.
初始化
1 | > def __init__(self, *args) // self 是必须的 |
类属性和实例属性
可以动态修改和增加
1 | > Person.propertyA = 'new value' |
命名空间
- 内置命名空间(Built-in Namespaces):Python 运行起来,它们就存在了。内置函数的命名空间都属于内 置命名空间,所以,我们可以在任何程序中直接运行它们,比如前面的 id(),不需要做什么操作,拿过来就直 接使用了。
- 全局命名空间(Module:Global Namespaces):每个模块创建它自己所拥有的全局命名空间,不同模块的全 局命名空间彼此独立,不同模块中相同名称的命名空间,也会因为模块的不同而不相互干扰。
- 本地命名空间(Function&Class: Local Namespaces):模块中有函数或者类,每个函数或者类所定义的命 名空间就是本地命名空间。如果函数返回了结果或者抛出异常,则本地命名空间也结束了。
查看命名空间:
print locals()
print golbals()
多重继承顺序
广度优先
1 | > def class A1(B1, B2): |
super 函数
super(Class, self).init()
绑定方法
def func() 就是绑定方法
非绑定方法
父类的方法都是非绑定方法
调用非绑定方法
super(BaseClass, self).function()
静态方法和类方法
- @staticmethod
- @classmethod
静态方法参数没有 self.
类方法参数没有 self. 但是有 cls.
封装和私有化
私有化:
方法数据名字前面加双下划线.
在方法前加 @property , obj.fun()-> obj.fun
特殊方法
1 | __dict__: |
迭代器
重写 __iter__ , next() -> raise StopIteration()
生成器
简单的生成器
把含有 yield 的语句函数称作生成器. 生成器是一种用普通函数语法定义的迭代器. 生成器也是迭代器, 使用 yield 语句,普通的函数就成了生成器,且具备迭代器功能特性.
1 | > a = (x*x for x in range(4)) # 迭代的, 遍历一遍后再输出就没有 |
生成器解析式是有很多用途的,在不少地方替代列表,是一个不错的选择。特别是针对大量值的时候,如上节所
说的,列表占内存较多,迭代器(生成器是迭代器)的优势就在于少占内存,因此无需将生成器(或者说是迭代
器)实例化为一个列表,直接对其进行操作,方显示出其迭代的优势。比如:
1 | > sum(i*i for i in range(10)) # 可以少写一个 () |
yiled
yiled 和 retur 的区别:
一般函数遇到 return 则返回并停止.
遇到 yield 则挂起, 再遇到则从挂起位置继续运行,直到结束抛出异常 StopIteration()
生成器方法
python2.5以后, 生成器可以在运行后给其提供新的值.
1 | > def r(n): |
调用一次 send(None)就是触发一次 参数是 None 的 next.
调用一次 next()就是触发一次 send(n),但 send(n)之后的 yield n -> None
- throw(type, value=None, traceback=None):用于在生成器内部(生成器的当前挂起处,或未启动时在定 义处)抛出一个异常(在 yield 表达式中)。
- close():调用时不用参数,用于关闭生成器。
错误和异常
错误
语法错误和逻辑错误, 遇到错误, 抛出异常.
异常
当 Python 抛出异常的时候,首先有“跟踪记录(Traceback)”,还可以给它取一个更优雅的名字“回溯”。后 面显示异常的详细信息。异常所在位置(文件、行、在某个模块)。
最后一行是错误类型以及导致异常的原因。
异常 | 描述 |
---|---|
NameError | 尝试访问一个没有申明的变量 |
ZeroDivisionError | 除数为 0 |
SyntaxError | 语法错误 |
IndexError | 索引超出序列范围 |
KeyError | 请求一个不存在的字典关键字 |
IOError | 输入输出错误(比如你要读的文件不存在) |
AttributeError | 尝试访问未知的对象属性 |
处理异常
try…except…(else…)(finally…)
try…except…except… 处理多个异常
try…except (Error1,Error2):…
try…except (Error1,Error2), e: …
try…except Exception,e
Python3.x:
try…except(Error1,Error2) as e: …
except 后面也可以没有任何异常类型,即无异常参数。如果这样,不论 try 部分发生什么异常,都会执行 excep t。
raise 将异常信息抛出
1 | > try: |
eval(…)
assert
assert 1 # Fine
assert 0 # Throw Error
- 防御性的编程
- 运行时对程序逻辑的检测
- 合约性检查(比如前置条件,后置条件)
- 程序中的常量
- 检查文档
模块
模块是程序 .py 文件.
自定义模块还需要 python 能找到你的文件.
1 | > import sys |
之后会增加 YourPythonModule.pyc 文件
如果是作为程序执行
1 | __name__ == "__main__" |
如果作为模块引入 1
2
3
4
5
6
7
8
9
10
11
12
13
在一般情况下,如果仅仅是用作模块引入,可以不写 ```if __name__ == "__main__"``` 。
### PYTHONPATH 环境变量
### \_\_init__.py 方法
是一个空文件,将它放在某个目录中,就可以将该目录中的其它 .py 文件作为模块被引用。
## 标准库
### 引用方式
import xxxxx
import pprint
pprint.pprint(xxxx)
from pprint import pprint
pprint(xxxx)
import pprint as p
p.pprint(xxxx)
1 |
|
import sys
sys.argv #入口参数 第一个一般是文件名
print "The file name: ", sys.argv[0]
print “The number of argument”, len(sys.argv)
print "The argument is: ", str(sys.argv)
1 |
|
f = open(path,‘w’)
sys.stdout = f
…
print ‘…’ # 写到文件中
…
f.close()
1 |
|
import os
os.system(browserPath + " www.baidu.com")
import webbrowser as w
w.open(url)
1 |
|
import urllib as T
data = T.urlopen(“http:…”)
print data.read()#data Is iterable
data.info()
data.getcode() # return status code - 200
data.geturl()
1 |
|
// 请求一个页面数据
req = urllib2.Request("…") #建立连接
response = urllib2.urlopen(req)
page = response.read()
print page
// 一个 POST 例子
url = ‘…’
userAgent = ‘Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/58.0.3029.110 Mobile/13B143 Safari/601.1.46’
headers = {‘User-Agent’:userAgent}
params = {key:value,…}data = urllib.urlencode(params) #编码
req = urllib2.Request(url,data,headers) #请求
response = urllib2.urlopen(req) #开始请求并接受返回信息
pagedata = response.read() #读取反馈内容
// 除此之外还可以设置:
// HTTP Proxy
// Timeout
// redirect
// cookit
1 |
|
// Python2.x
try:
import xml.etree.cElementTree as et
except ImportError:
import xml.etree.ElementTree as et
// Python3.x
import xml.etree.ElementTree as et
1 |
|
pip install requests
import requests
#get
r = requests.get(url)
r.cookies
r.headers
r.encoding # UTF-8
r.status_code # 200
print r.text # …
r.content
#post
params = {key:value,…}
r = requests.post(url, params)
#http header
r.headers[‘content-type’] # 不用区分大小写
1 |
|
import pickle
f = open(path, ‘wb’)
pickle.dump(listA/dictA, f, protocol=0) # protocol = 1 or True then use binary zip to achrive
f.close()
1 |
|
#write
import shelve
s = shelve.open(path, writeback=True) # writeback=True 才可以修改已有的值
s[‘name’] = ‘grayland’
…
s[‘data’] = {…}
…
s.close()
#read
s = shelve.open(path)
name = s[‘name’]
…
data = s[‘data’]
…
for k in s:
pass
…
1 |
|
配置
1 |
|
进入 mysql 之后,会看到>符号开头,这就是 mysql 的命令操作界面了。
设置密码:
1 |
|
$ mysql -u root -p Enter password:
1 |
mysql> show databases;
±-------------------+ | Database | ±-------------------+ | information_schema |
|
| |
| carstore | cutvideo | itdiffer
| mysql
|
| performance_schema |
| test | ±-------------------+
1 |
|
sudo apt-get install build-essential Python-dev libmysqlclient-dev
sudo apt-get install Python-MySQLdb
1 |
|
pip install mysql-Python
1 |
|
import MySQLdb
1 |
|
import sqlite3
conn = sqlite3.connect(“23302.db”)
1 |
|
cur = conn.cursor()
1 |
|
create_table = “create table book (title text, author text, lang text)”
cur.execute(create_table)
#添加数据
cur.execute(“insert in to books values(“BookName”,“GrayLand”, “Chinese”)”)
conn.commit()
cur.close()
conn.close()
1 |
|
conn = sqlite3.connect(path)
cur = conn.cursor()
cur.execute(“select * from books”)
print cur.fetchall()#批量插入
books = [tuple(xx,xx,xx),…]cur.executemany(“insert into book values (?,?,?)”, books)
conn.commit()#查询插入结果
rows = cur.execute(“select * from books”)
for row in rows:
print row…
#更新
cur.execute("update books set title=‘xxx’ where author=‘value’)
conn.commit()cur.fetchone()
…
cur.fetchall()
…#删除
cur.execute(“delete from books where author=‘xxx’”)
conn.commit()cur.close()
conn.close()
更多参考资料 : [http s://docs.Python.org/2/library/sqlite3.html](http s://docs.Python.org/2/library/sqlite3.html)