python
|--数据类型
|--整型,长整型,浮点型,字符串,布尔型,空值
|--浮点型
当有一个为浮点,结果必为浮点
|--字符串
与Java不同,‘’和“”在python中是一个意思,哪个被用过了就用另一个 当字符串中还有标点符号时,可以在前面加\转义。 也可以在字符串前面加r即r'xxx'
当有很多符号,且多行时可以这样r''' xxx,xxxx!|||sss ''',不加r的话里面都要加\,ur的话字符串可以有中文
|--注释
在前面加#即可
|--数组
|--list
|--访问索引
依据下标如:L[1],下标由0开始,当为-1时表示最后一个,-2位倒数第二个,以此类推
|--添加
L.append()表示在数组最后一位加数据
L.insert(n)表示在数组固定下标插入,后面的元素自当往后移动下标
|--删除pop
L.pop()删除最后一个
L.pop(n)删除指定下标数组元素
|--tuple
|--与list区别
list是动态的括号用中括号【】,tuple是静态的无法更改括号用(),一旦设定好久无法改
|--实现假“动态”
在tuple中加入list数组如L=('A','B',['X','Y'])
取出来只需A=L(2)
更改时只需A(0)=xxx
|--条件判断和循环
|--if else 和elif
if后面不用加(),但是条件结束后一定要加:
python在同一排表示一个代码语句块,不需要花括号{ }
因此写完条件后,当要写循环执行体时要换行然后空四格(规定)
|--for
类似Java中的foreach语句
如 for 变量 in 数组:
|--dict和set
|--dict
|--含义
类比java中的哈希表 key-value
|--用法
d{
xx:xx,
yy:yy
}
|--增删查改
查: d.get(xx) 括号内看是什么值 若xx没有则返回none
or d[xx] 若xx不存在则报错 因此要先判断是否存在 if xx in d ........
增:d[xx]=xx
|--遍历for
for key in d
prinf key
prinf 后面输出值+是用于连接字符串用 ,加上变量用“,”就行了
|--set |--含义
set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的, 与dict差不多区别在于没有value
|--用法
s=set([(xx,yy),(xx1,yy1),(xx2,yy2)])
打印时for x in s
print x[0],x[1] x随便取,在【】中的每一个括号()代表一个元素 一个元素可以有1个或者多个值,所有会有下标打印
|--加
s.add(5),若set中存在则没有变化
|--删
s.remove(2),若set中不存在则报错 需要判定在写remove
for if语句别忘记加:!!!
|--函数
|--查询
可以直接从Python的官方网站查看文档:
http://docs.python.org/2/library/functions.html#abs
python中没有x++
|--切片
|--用处
可以用于对list ,打印不需要用循环 只需要在里面加:
|--实例
L[:] 打印所有
L[:3] 若从下标0开始 则可以省略 到索引3不包括3
类似于列表函数range(x)
for i range(10)
打印i0-9
|--倒序切片
记住倒数第一个元素的索引是0。倒序切片包含起始索引,不包含结束索引。
L[-2:]表示倒数第一个和第二个
|--python中如何将两个list合并成一个list,不用for语句
1, add
2, 用list的extend方法,L1.extend(L2),该方法将参数L2的全部元素添加到L1的尾部,例如:
3, 用切片(slice)操作,L1[len(L1):len(L1)] = L2和上面的方法等价,
|--但切片方法用起来更灵活,可以插入到头部,或其他任意部位,也可以加到中间.
|--注意: 集合是指包含一组元素的数据结构,我们已经介绍的包括:
1. 有序集合:list,tuple,str和unicode;
2. 无序集合:set
3. 无序集合并且具有 key-value 对:dict
|--索引迭代
|--含义:迭代永远是取出元素本身,而非元素的索引。想在 for 循环中拿到索引,怎么办?方法是使用 enumerate() 函数:
在enumerate下的list中每一个元素都隐藏着一个tuple 即值前有一个索引
|--实例 for index, name in enumerate(L):
print index, '-', name
|--拓展
zip()函数可以把两个 list 变成一个 list:>>> zip([10, 20, 30], ['A', 'B', 'C'])
[(10, 'A'), (20, 'B'), (30, 'C')]
|--dict 的value迭代
|--dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.values()
# [85, 95, 59]
for v in d.values():
print v
|--类同
还有一个 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一样:
|--不同
1. values() 方法实际上把一个 dict 转换成了包含 value 的list。
2. 但是 itervalues() 方法不会转换,它会在迭代过程中依次从 dict 中取出 value,所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存。
3. 打印 itervalues() 发现它返回一个 <dictionary-valueiterator> 对象,这说明在Python中,for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等,任何可迭代对象都可以作用于for循环 ,而内部如何迭代我们通常并不用关心。
如果一个对象说自己可迭代,那我们就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。
|--求容易 长度
x=[xx,yy,zz]
len(x)
|--dict 的items()
首先,我们看看 dict 对象的 items() 方法返回的值:
>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
>>> print d.items()
[('Lisa', 85), ('Adam', 95), ('Bart', 59)]
可以看到,items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value
>>> for key, value in d.items():
print key, ':', value
Lisa : 85
Adam : 95
Bart : 59
|--列表
列表生成式的 for 循环后面还可以加上 if 判断。例如:
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
如果我们只想要偶数的平方,不改动 range()的情况下,可以加上 if 来筛选:
>>> [x * x for x in range(1, 11) if x % 2 == 0] //在修改range的情况下是这样的 [x * x for x in range(2, 11,2) ]
[4, 16, 36, 64, 100]
|--列表实例
L = []
for m in 'ABC':
for n in '123':
L.append(m + n)
列表:
>>> [m + n for m in 'ABC' for n in '123']
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
|--爬虫
|--组成
URL管理器
|-实现方式
1.python本内存 set()适用于较小存储
2.关系数据库mysql
3.缓存数据库 set
网页下载器
|--种类
1.urllib2 python官方基础模块
|--urllib2的三种使用方法
|--1最简洁方法:
url='http://www.baidu.com'
print 'url管理器 第一种方法:'
response1=urllib2.urlopen(url)
print response1.getcode()
print len(response1.read())
|--2可以添加data、http header伪装的方法
print 'url管理器 第二种方法:'
request=urllib2.Request(url)
request.add_header("user-agent", "Mozilla/5.0")//添加数据的时候为 request.add_data('x','y')
response2=urllib2.urlopen(request)
print response2.getcode()
print len(response2.read())
|--3添加特殊情景的处理器 四种:HTTPCookieProcessor 、ProxyHandler、HTTPHandler、HTTPRedirectHandler
print 'url管理器 第三种方法:'
cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
response3=urllib2.urlopen(url)
print response3.getcode()
print cj
print response3.read()
2.requests 第三方包
网页解析器
|--常见四种解析器 :正则表达式(模糊匹配)、html.parser、Beautiful Soup(主要用这个)、lxml (后三个为结构化解析)
|--Beautiful Soup4
1.创建对象
from bs4 import BeautifulSoup
#根据HTML网页字符串创建BeautifulSoup对象
soup =BeautifulSoup(
html_doc, #HTML文档的字符串
'html.parser' , #HTML的解析器
from_encoding='utf-8' #HTML的文档编码
)
|--搜索方法
|--1.find_all(name,attrs,string)
#查找所有标签为div,class为abc,文字为Python的节点,因为class为关键字所有要变成classs_
soup.find_all('div',class_='abc',string='Python')
|--2.find
|--访问方法(获取节点信息)
|--1node.name
|--2node['href'] #注意没有点
|--3node.get_text()
|--用法
1首先可以先快速获取网页代码来实验 进入文档获取html_doc
2.创建对象soup
3.用find_all或者find来获取所需要的标签、属性、文本内容
4.print 出三个访问方法(上面有)
|--代码实例
from bs4 import BeautifulSoup
import re
html_doc = """
获取的网页代码内容省略。。。。。
"""
soup=BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8')
print '获取所有链接'
links=soup.find_all('a')
for link in links:
print link.name,link['href'],link.get_text()
print '获取href="http://example.com/lacie"链接'
link_node=soup.find('a', href="http://example.com/lacie")
print link_node.name,link_node['href'],link_node.get_text()
print '正则匹配'
link_node=soup.find('a', href=re.compile(r"ill"))
print link_node.name,link_node['href'],link_node.get_text()
print '获取p段落文字'
p_node=soup.find('p', class_="title")
print p_node.name,p_node.get_text()
爬虫项目:
入口页:
https://baike.baidu.com/item/Python/407313
URL格式:
/item/%s+%d+.htm
数据格式:
标题:
<dd class="lemmaWgt-lemmaTitle-title">
<h1>Python</h1>
</dd>
简介:
<div class="lemma-summary" label-module="lemmaSummary">
</div>
<div class="para" label-module="para">如果您需要安装, 您不妨下载最近稳定的版本。 就是那个以没有被标记作为alpha或Beta发行的最高的版本。目前最稳定的版本是Python3.0以上<sup class="sup--normal" data-sup="2" data-ctrmap=":2,">
[2]</sup><a class="sup-anchor" name="ref_[2]_21087"> </a>
</div>
|--if __name__="__main__":
添加if __name__ == "__main__"
我们看到const.py中的main函数也被运行了,实际上我们不希望它被运行,因为const.py提供的main函数只是为了测试常量定义。这时if __name__ == '__main__'派上了用场,我们把const.py改一下,添加if __name__ == "__main__":
————————————————
版权声明:本文为CSDN博主「anshuai_aw1」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/anshuai_aw1/article/details/82344884