python学习回顾
**python 是脚本语言,面向对象,解释型语言
有两个版本 python2 和 python 3 (有所不同) (官网有2-to-3 工具,对python2和3 代码进行转换)
本文重点: 数据处理, GUI学习**
**python(x,y) 软件包
包含许多常用的包**
标准数据类型
整型、浮点型、复数型、字符串、元组、字典、列表、布尔型
函数和模块、包
- 函数
函数:abs(x) type(x) round(x) 四舍五入函数
内建函数:
cmp() dir() raw_input()输入的是字符串….
input()输入的是数
dir(builtins)
查看内建变量
helf()
查看帮助信息
- 模块
非内建函数 需要导入
import math
math.pi
就可以使用 math.py 中的函数
- 包
有层次的文件目录结构
模块和子包组成的应用程序执行环境
import test.first.reptile
test.first.reptile.XXX()from test.first.reptile import XXX
XXX()
包> 模块或库>函数或方法
循环
- range 和 xrange
range(start, end, step = 1)
print ragne(0,20,2)
生成一个列表 值的个数: (end - start) / step
- xrange() 用多少生成多少
内存处理效率高
循环中使用较多
for 变量 in 可迭代对象
可迭代对象: 字符串、列表、元组、字典、文件
for用于遍历数据集内部成员,列表解析,生成器表达
遍历数据集内部成员
str = "Hello world !"
for x in str:
print x
for y in range(2,20,1):
print y,
注意:后者y, 打印后表示在同一行。前者x打印会有换行。
列表解析的语法
[i+1 for i in range(0,10) if i % 2 == 0]
自定义函数
- 自定义函数创建
def addMe2Me(x):
‘apply operation + to argument’
return (x + x)
第二行代码: 函数注释 DocString
查看方式: print 函数名.doc
输出1–100内的素数
from math import sqrt
def Isprime(x):
if x == 1:
return False
k = int(sqrt(x))
for j in range(2, k+1):
if x % j == 0:
return False
return True
for i in range(2,101):
if Isprime(i):
print i,
默认参数:
def fun(x, y = False):
print x
if y :
print "No,It is " + y
关键字参数(所有保持统一,主要目的改变参数顺序)
def fun(x=1, y = 2)
print x
print y
传递函数
def add2(x):
return (x+x)
def self(f,y):
print f(y)
self(add2,11)
22
lambda函数
def add2(x):
return x + x
#功能相同
r = lambda x : x + x
print add2(5)
print r(5)
优点:匿名函数,没有return。没有定义函数的过程,无需函数名,但使用的时候要有个名字,例如r
递归
斐波那契数列
1
def fib(n):
a,b = 0,1
count = 1
while count < n:
a,b = b, a+b
count += 1
print a
2
def fib(n):
if n == 0 or n == 1:
return n
else:
return (fib(n-1) + fib(n-2))
后者内存占用大,执行效率不高
汉诺塔问题解决
递归解决具有优势。
def hanoi(a,b,c,n):
if n == 1:
print a,'->',c
else:
hanoi(a,c,b,n-1)
print a,'->',c
hanoi(b,a,c,n-1)
hanoi('a','b','c',4)
#注意递归的出口条件一定要有
#考虑问题的时候,将后续递归当做一个整体,不去思考内部是怎样的。例如把(n-1)就当做一个盘子考虑。
变量作用域
python 中在那里定义,作用域就在那
global_str = 'hello'
def foo():
local_str = 'world'
return global_str + local_str
#global_str:全局变量
#local_str:局部变量 函数中定义的
x = 3
def f():
global y
x = 6
print a ** 2
y = 1
#global 定义全局变量,函数外可更改
#答案是36 , 内层屏蔽外层
本地数据获取
f = open(r'd:\\11.txt')
f2 = open(r'd:\\11.txt','w')
#r 读, w 写, a 追加
#rb wb ab 二进制打开
文件相关函数
函数很多,一般形式
f.read()
对象.方法(参数)
文件读写:
#将一个文件t中字符,编号存储到文件s中
t = open(r't.txt','r+')
p1 = t.readlines()
for i in range(0,len(p1)):
p1[i] = str(i + 1) + ' ' + p1[i]
t.close()
s = open(r's.txt','w')
s.writelines(p1)
s.close()
s = open(r's.txt','r')
p2 = s.read()
s.close()
print p2
f.seek(offset, whence = 0)
whence = 0 表示文件头部 , 1 表示当前位置,2 表示文件尾部
offset偏移的字节
s.writelines(p1)
s.seek(0,0)
#之前要将指针指向文件开头
s.read()
s.close()
获取网络资源
import urllib
r = urllib.urlopen(r'http://kan.sogou.com/dongman/')
html = r.read()
print html
可以获取网页信息,但需要进一步处理,才能得到想要的内容。 需要学习正则表达式
视频参考
正则表达式
处理数据经常用到
- 基础规则
存在于re模块中,一种小型的高度专业化的编程语言,内嵌在python中,其实是一门独立的语言。
-匹配字符串
-单词语句、地址、目录等等,进行匹配。
-修改分割字符串
-用C编写的匹配引擎上执行
-功能有限
字符匹配
大多数字母字符都和自身匹配
例如: hello 会和‘hello’匹配元字符
. ^ $ * + ? {} [] \ | ()
#1. [] 用来指定一个字符集,【或集】 其中的任何一个都符合
找到符合的字符串
import re
s = r'abc'
re.findall(s, "aaa abc ssd")
结果 :['abc']
#这种方式,可以得到需要的内容,进行完全匹配
#### [] 出场 ###
import re
希望得到abc 或者 adc
s = r’a[bd]c’
re.findall(s,”abc acc adc asd cda”)
结果:['abc', 'adc']
取反(除了方括号中的其他的) s = r’a[^bd]c’
结果: [‘acc’, ‘asd’, ‘cda’]
注意:元字符,在[]里面不起作用
还可以,[0123456789] 等价于 [0-9]
[abcdefghijklmnopqrstuvwxyz] 等价于 [a-z] 大写同理,方便简单啊。
r = r”[a-zA-Z0-9]”
大小写字母加数字的匹配
#2. ^ 行首匹配
r = r”^adc” 行首匹配
s = “adc asd sad adc”
[“adc”]
s = “adad asd sad adc”
[]
#3.$ 行尾匹配
r = r'adc$'
s = "adf adf adc"
>["adc"]
#4. \ 转义字符
r = r'\^abc'
r = r'[0-9]'
等价于
r = r'\d'
其他:
\d 等价于 [0-9]
\D … [^0-9]
\s … [\t\n\r\f\v]
\S … [^\t\n\r\f\v]
\w … [a-zA-Z0-9_]
\W … [^a-zA-Z0-9_]
#5. 重复 {}
s = '010-12345678'
r = r'^010-/d/d/d/d/d/d/d/d'
re.findall(r,s)
结果: ['010-12345678']
还可以,
r = r'^010-/d{8}$'
{}里面表示重复次数
* + ?
*把前面字符重复0(没有)或多次
+至少出现一次或多次
.任意一个字符
?可有可无,一次或0次 (最小匹配) 加在重复后面,
r =r'ab+'
s = 'abbbbbbbbbb' #贪婪模式
结果:['abbbbbbbbbb']
r = r'ab+?' # 非贪婪模式
s = 'abbbbbbbbbbb'
结果:['ab']
r = r"ab*"
r = r"ab+"
以上 ,
r = r'^010-?/d{8}$'
加上? 表示 - 可有可无
{}重复的次数
r = r'a{1,3}'
最少一次,最多三次
{m,n} 最少m,最多n次
**re模块**
提供正则表达式引擎接口,将REstring编译成对象,进行匹配。 以上都是使用直接解释型的方式使用,编译效率更快。
> 编译正则表达式
r = r’\d{3,4}-?\d{8}$’
p_tel = re.compile(r)
p_tel.findall(‘010-12345678’)
不区分大小写:
cctv_re = re.compile(r'cctv', re.I)
详细内容函数很多 具体可查看资料 dir(re) help(re)
**小爬虫**
例子:
# -- coding: utf-8 --
import urllib
import re
#电影天堂
r = urllib.urlopen(r’http://www.dytt8.net/‘)
html = r.read()
s = r”href=.+.html”
count = 0
result = re.findall(s, html)
for i in result:
count += 1
print “No.” + str(count)+’* ’ + i
#print html
#print result
print count
**转换工厂函数**
list(‘Hello’)
[‘H’,’e’,’l’,’l’,’o’]
“`