Python笔记

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">&nbsp;</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
原文地址:https://www.cnblogs.com/fafafa123/p/11705549.html