您的位置:首页 > 编程语言 > Python开发

python---基础回顾(爬虫)

2016-06-10 14:08 465 查看

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’]

“`

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python