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

python学习回顾

**python 是脚本语言,面向对象,解释型语言
有两个版本 python2 和 python 3 (有所不同) (官网有2-to-3 工具,对python2和3 代码进行转换)
本文重点: 数据处理, GUI学习**

**python(x,y) 软件包
包含许多常用的包**

标准数据类型

整型、浮点型、复数型、字符串、元组、字典、列表、布尔型

函数和模块、包

  1. 函数

函数:abs(x) type(x) round(x) 四舍五入函数

内建函数:
cmp() dir() raw_input()输入的是字符串….
input()输入的是数

dir(builtins)
查看内建变量
helf()
查看帮助信息

  1. 模块
    非内建函数 需要导入

import math
math.pi
就可以使用 math.py 中的函数


  1. 有层次的文件目录结构
    模块和子包组成的应用程序执行环境

import test.first.reptile
test.first.reptile.XXX()

from test.first.reptile import XXX
XXX()

包> 模块或库>函数或方法

循环

  1. range 和 xrange
    range(start, end, step = 1)

print ragne(0,20,2)

生成一个列表 值的个数: (end - start) / step

  1. 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]

自定义函数

  1. 自定义函数创建

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

可以获取网页信息,但需要进一步处理,才能得到想要的内容。 需要学习正则表达式

视频参考
正则表达式
处理数据经常用到

  1. 基础规则
    存在于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’]
“`

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值