疯狂的Python
2015-01-05 10:12:32 1 举报
AI智能生成
Python学习笔记
作者其他创作
大纲/内容
1,导论
高级动态编程语言
预编译
import py_compile
py_compile.compile("hello.py")
生成hello.pyc字节码
优化代码
python -O -m py_compile hello.py
生成hello.pyo
变量
id函数返回变量内存地址
a="123"
b="123"
id(a)
4416957416
id(b)
4416957416
可以看到变量a、变量b指向同一个内存空间
运算符和表达式
//
整除运算符
3.0/2
1.5
3.0//2
1.0
and
逻辑与
or
逻辑或
not
逻辑否
成员测试
in
not in
同一性测试
is
is not
2,数据类型
数字
int
范围:-2147483648~2147483647
long
任意大的整数均可存储
序列
字符串
a="abcde"
a[1:4]
"bcd"
a[-2:-5:-1]
"dcb"
切片结果默认从左往右,如果步长为负数,则结果从右往左
元组()
不可变
t=(1,2,3)
a,b,c=t
a,b,c=(1,2,3)
列表[]
添加
list.append()
删除
list.remove()
基本操作
len()
+
连接2个序列
*
重复序列元素
a="ab"
a*3
"ababab"
in
判断元素是否出现在序列中
a="abcde"
'c' in a
True
max()
返回最大值
min()
返回最小值
cmp(tuple1, tuple2)
比较2个序列的值是否相同
字典
key不可变
key可以是str, int, tuple,,,,不可以是list,因为list可变
dict.pop()
dict.clear()
深拷贝、浅拷贝
copy.copy
copy.deepcopy
3,流程控制
if-elif-else
for iterating_var in sequence
for k,v in dict.items()
4,函数
元组参数
def f(x,y):
print("%s : %s" % (x,y))
a=("name", "jane")
f(*a)
"name : jane"
如果元组元素个数与函数参数个数一致,
则可以在传递参数时在元组变量前加*,
这样元组元素的值就会按顺序赋值给函数参数
字典参数
def f(name,age):
print("name=%s,age=%s" % (name,age))
a={"age":20, "name":"jane"}
f(**a)
"name=jane,age=20"
如果字典元素的key值与函数的形参名是一一对应,
则可以在传递参数时在字典变量前加**,
这样字典元素的值就会按key的值赋值给对应函数的形参
冗余参数
def f(x, *tuple_args, **dict_args):
print(x)
print(tuple_args)
print(dict_args)
f(1)
1
()
{}
f(1,2,3)
1
(2,3)
{}
f(x=1,y=2,z=3)
1
()
{'y':2, 'z':3}
f(1,2,3,y=4,z=5)
1
(2,3)
{'y':4, 'z':5}
lambda
快速定义单行最小函数
从lisp借鉴而来
雏形
def f1(x,y):
return x*y
f2 = lambda x,y : x*y
def f(*args, **kwargs):
pass;
可以接收任意的参数
内置函数
id(变量名)
返回变量的内存地址
int(object)
把字符串或数字转换成整数
type(变量名)
返回变量的类型
zip
a=["name", "age"]
b=["jane", 20]
zip(a, b)
[("name", "jane"), ("age", 20)]
divmod(a,b)
得到a除b的商、余
divmod(5,2)
(2, 1)
callable(f)
返回True or False
用来判断参数是否是个函数
isinstance(var, type)
返回True or False
判断变量是否是某个类型的对象
序列处理函数
序列分类
list
tuple
string
filter
对序列元素进行过滤
filter(function or None, sequence) -> list, tuple, or string
把序列中的元素依次传到function中,
如果function返回True,则保留元素的值,否则丢弃
f = lambda x : x>5
a = range(10)
filter(f, a)
[6, 7, 8, 9]
zip
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
name=["koma","jane"]
age=[30,20]
addr=["chengdu","wuhan"]
tel=[110]
zip(name,age,addr)
[('koma', 30, 'chengdu'), ('jane', 20, 'wuhan')]
zip(name,age,addr,tel)
[('koma', 30, 'chengdu', 110)]
zip,以长度最短的序列为准
map(None,name,age,addr)
[('koma', 30, 'chengdu'), ('jane', 20, 'wuhan')]
map(None,name,age,addr,tel)
[('koma', 30, 'chengdu', 110), ('jane', 20, 'wuhan', None)]
map,以长度最长的序列为准
长度不够的以None补齐
map
map(function, sequence[, sequence, ...]) -> list
先把多个sequence组成一个sequence,长度不够的以None补齐
如果function为None,则返回新的sequence
否则把新的sequence中的每个元素传递给function
这样function返回的结果组成一个新的list作为最终结果
a=[1,3,5]
b=[2,4,6]
map(None, a, b)
[(1,2), (3,4), (5,6)]
map(lambda x,y : x*y, a, b)
[2, 12, 30]
reduce
reduce(function, sequence[, initial]) -> value
从sequence中依次取2个值传递到function中计算
把计算结果与sequence中下一个元素传递到function中计算
只到sequence中只剩下1个值
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
((((1+2)+3)+4)+5)
可以用来计算级数,阶乘...
级数
计算1+2+...+100
a=range(101)
reduce(lambda x,y : x+y, a)
5050
阶乘
计算5!
a=range(1,6)
reduce(lambda x,y : x*y, a)
120
模块
所有的.py文件都可称之为模块
__name__
模块名
当模块被直接执行,则__name__为__main__
当模块被其它模块调用,则__name__为模块文件名
包
python的模块可以按目录组织成包
步骤
创建一个名字为包名的文件夹
在该文件夹下创建一个__init__.py文件
根据需要在文件夹下存放脚本文件、已编译扩展及子包
import 包名.模块1 包名.模块2 包名.模块3
import as
from import
5,正则表达式
元字符
[]
常用来指定一个字符集
[abc]
[a-z]
[^ab]
import re
res=r"t[oc]p"
s="tbp tcp tip top tvp tsp"
re.findall(res, s)
['tcp', 'top']
r"..."表示是一个正则表达式规则字符串
^
行首
$
行尾
常用函数
compile编译
p_r=re.compile("t[oc]p",re.IGNORECASE)
s="tbp tcp tip top tvp tsp"
p_r.findall(s)
['tcp', 'top']
如果某个正则表达式要匹配很多次
则最好先进行编译,这样速度更快
re.IGNORECASE
忽略大小写匹配
match()
从字符串最开始的位置匹配
如果匹配到,则返回SRE_Match对象
否则返回空
p_r=re.compile("jane")
s="jane koma troy"
p_r.match(s)
<_sre.SRE_Match object at 0x107bf4b28>
s="koma jane troy"
p_r.match(s)
None
search()
扫描字符串
如果匹配到,则返回SRE_Match对象
否则返回空
p_r=re.compile("jane")
s="koma jane troy"
p_r.search(s)
<_sre.SRE_Match object at 0x107bf4b90>
findall()
找到匹配的所有字符串,并把它们作为列表返回
p_r=re.compile("jane")
s="jane koma jane troy"
p_r.findall(s)
['jane', 'jane']
finditer()
找到匹配的所有字符串,并把它们作为迭代器返回
sub()
字符串的正则表达式替换
str.replace()
不支持正则表达式
s="jane koma"
s.replace(r"j..e", "hello")
"jane koma"
sub(pattern, repl, string, count=0, flags=0)
s="jane koma"
p_r=re.compile("j..e")
re.sub(p_r, "helo", s)
或者写成:
re.sub(r"j..e","hello",s)
"hello koma"
split()
字符串的正则表达式分割
str.split()
不支持正则表达式
s="jane+koma-troy"
re.split(r"[\+\-]", s)
['jane', 'koma', 'troy']
编译标志
DOTALL, S
使 . 能匹配包括换行符等在内的所有字符
默认情况下 . 不能匹配换行符
p_r=re.compile("baidu.com")
p_r.findall("baidu\ncom")
[]
p_r=re.compile("baidu.com", re.S)
p_r.findall("baidu\ncom")
['baidu\ncom']
IGNORECASE, I
使匹配对大小写不敏感
MULTILINE, M
多行匹配,影响 ^ 和 $
找出字符串中所有以 jane 开头的行
注:默认情况下 . 不能匹配换行符
s="""
hello jane
jane hello
hello jene hello
jane hello hehe
"""
p_r=re.compile("^jane.+")
p_r.findall(s)
[]
p_r=re.compile("^jane.+", re.M)
p_r.findall(s)
['jane hello', 'jane hello hehe']
VERBOSE, X
正则表达式也可以换行,使用res的verbose状态,使正则表达式看起来更清晰
匹配电话号码
r="""
\d{3,4}
-?
\d{6,}
"""
p_r=re.compile(r, re.X)
s="abcd028-3546728abc"
p_r.findall(s)
['028-3546728']
分组"(" ")"
当正则表达式中有分组时
findall()会优先返回分组数据
正则表达式得到邮箱前缀
email="abc123@qq.com"
默认情况下
re.findall(r".+@.+", email)
['abc123@qq.com']
有分组时
re.findall(r"(.+)@.+", email)
['abc123']
小爬虫
拿到百度贴吧页面中的大图
关键点
urllib.urlopen(url).read()
得到html网页内容
大图都以
http://imgsrc.baidu.com/forum/
开头,利用re.findall()有分组时返回分组的数据
即可拿到大图的url
urllib.urlretrieve()可以下载图片文件到本地
code
import urllib
import re
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImageList(html):
r = r'src="(http://imgsrc.baidu.com/forum/.+?)"'
p_r = re.compile(r)
return p_r.findall(html)
def downloadImage(imgUrl, filename):
urllib.urlretrieve(imgUrl, filename)
url = "http://tieba.baidu.com/p/2579724416"
html = getHtml(url)
imgList = getImageList(html)
count = 0
for imgUrl in imgList:
downloadImage(imgUrl, "%s.jpg" % count)
count += 1
6,高级功能
文件与目录
文件读写
open()
fo=open(filepath)
fo.read()
fo.close()
file()
fo=file(filepath)
fo.read()
fo.close()
mode
r
只读
r+
读写
w
写入
先删除原文件,再重新写入
如果文件不存在则创建
w+
读写
先删除原文件,再重新写入
如果文件不存在则创建
a
写入
在文件末尾追加新的内容
如果文件不存在则创建
a+
读写
在文件末尾追加新的内容
如果文件不存在则创建
b
打开二进制文件
可以与r, w, a, + 结合使用
U
支持所有的换行符号
\r, \n, \r\n
文件对象方法
dir(file)
read()
读取所有数据
write()
writelines()
writelines(sequence_of_strings) -> None
Write the strings to the file.
close()
readline()
读取一行内容
readlines()
返回一个列表
列表中每个元素代表文件中的一行
next()
表明文件对象可被迭代
seek()
seek(offset[, whence]) -> None
Move to new file position.
offset表示偏移量
whence
0
相对文件开始位置偏移
1
相对文件当前位置偏移偏移
2
相对文件末尾位置偏移
seek(0, 0)
移动到文件开始位置
seek(0, 2)
移动到文件末尾
flush()
提交更新
os模块
dir(os)
os.mkdir("test")
os.mkdirs("a/b/c")
os.listdir(".")
os.getcwd()
ow.chdir("/")
os.path.isdir("")
os.path.isfile("")
os.path.join(a, *p)
把目录的绝对路径与文件名拼成文件的绝对路径
目录遍历
os.walk(path)
返回一个iterator
每个元素由3部分组成:
目录
子目录
文件名
[('/Users/jane/software', ['python'], ['.DS_Store']),
('/Users/jane/software/python', [], ['hello.py', 'hello.pyo', 'tieba_image.py'])]
异常处理
try:
...
except IOError, e:
pass
except NameError, e:
pass
finally:
pass
抛出异常
raise NameError("...")
MySQL
rpm -q MySQL-python
import MySQLdb
面向对象
定义
class Person(object):
age = 1
def __init__(self, name):
self.name = name
def sayHello(self):
print("Hello %s" % self.name)
p = Person("jane")
p.sayHello()
Hello jane
继承
class Student(Person):
def __init__(self, name):
Person.__init__(self, name)
def study(self):
print("%s is studing" % self.name)
s = Student("jane")
s.sayHello()
s.study()
Hello jane
jane is studing
0 条评论
下一页