oldboy eighth day.I love Python. is 和 == 区别, set集合,

时间:2022-09-03 07:38:39

因为昨天 没有发博客, 今天是把昨天写的代码 充当昨天的内容了,但是剩下的内容,准备在今天 好好的补补,下面 就把 昨天和今天的两天的笔记都来一波:

一, 上节课内容回顾
  dict 字典{ key: value } 无序的, key 必须是可哈希的( 不可变的 ) value 随便放
    增:dict[key]=value key不存在的时候增加 value 如果key不存在则更改原来的value
      dict.setdefault()
    删: dict.pop(key)返回value
       dict.popitem() 随机删除
    改: dict.update()更新
    查: dict.get()
  解构:

二, 作业

 

三, 今日主要内容
  1, is 和 == 的区别
    id(变量) 返回 变量的内存地址
    小数据池(常量池): 只能放 str 和 int 对于int 范围是-5~256, 超过这个范围 会产生一个新的 id

    is 比较的是内存地址
    == 比较的是具体的值,不是内存地址.
  2, 编码的问题
    ASCII 8bit 1byte
    GBK 16bit 2byte 兼容 ASCII
    UNICODE 32bit 4byte 兼容一切一切一切的 编码类型
    utf-8 unicode的升级版 英文 1byte 中文 3byte
  传输过程中一般用 utf-8或者GBK 一般不用UICODE 浪费资源
  内存中, 我们程序运行的过程中, 编码是Unicode
  转换的时候 GBK 不能和UTF-8 互相转换.
    在程序中, 字符穿可以编码成bytes类型的数据.
      encode() 编码: 编码之后的结果和原来的结果其实是一样的东西,只是看着不一样

四, 前两天作业回顾
1, 今天没有作业,只有一点练习,

 


 

 

一, 昨日内容回顾:
  id() 返回对象的内存地址
  小数锯池, str int 可能会被添加的小数锯池里面
  ==和 is 的区别: ==比较的是值,is比较的内存地址.
  编码的问题: encode('编码集') 得到结果 bytes
二,作业

 


三, 今日主要内容:
  1, for 循环 后面也可以用 else,也可以用 break,continue . 用法跟while 和if 的一样.
  2, int和str
    s= ''.join(可迭代元素)
    迭代括号里面的内容把每一项用前面的东西进行拼接.
    join() 把列表变成字符串
    split() 把字符串变成列表
    tuple 和 list 可以互相转换
  3, list的删除问题:
    删除列表的时候,list的索引一直在动 所以用for 循环的时候容易出错
    删除列表最安全的方法: 把要删除的东西,存到一个新列表里面,然后循环新列表,再去用remove删除老列表里面的东西,最后打印老列表.
  4, set 集合
    set中的元素是 不重复的,无序的, 并且,里面的元素必须是可哈希的(不可变的) 也就是说 set集合 就是 dict中的key的集合
    set 本身是 不可哈希的(可变的)
    特点: 去重
    1, 增: set的空集用 s=set({}) 表示
      set.add()
      set.updat()迭代更新
    2, 删
      set.pop() 随机删除. 并返回删除的值
      set.remov() 直接删除 某个元素
      set.clear() 清空
    3, 改: 因为set没有索引,所以不能直接更改, 需要,先把原来的remove了,在add新的
    4, 查 for 循环
    5, 常用操作:
      & 求交集 ∩ (求两set一样的set)
      | 求并集 ∪(把俩set并到一起)
      set2 -set1 求差集( 求本身(set2)和set1不同的元素的集)
      frozenset(set) 冻结set,把set变成可哈希的(不可变的) 数据类型

  5, 深浅拷贝
    = 不是拷贝
    浅拷贝: 只会拷贝第一层的内容,第二层的内容不会被拷贝:方法: copy() 或者 切片
    深度拷贝: import copy 导入 copy 模块, 用 deepcopy() 深拷贝

  6, dict小问题:fromkeys,是 字典的静态方法, 需要用 dict 来调用fromkeys 这个方法
    dict.fromkeys(参数1,参数2 ) 把第一项的参数里的所有元素,全部拿出来,和第二个参数组成一个键值对.   生成的键,所指向的value是同一个id的对象,改变其中一个的时候,剩下的键所指向的值也会改变.
dict中的元素在迭代中是不允许删除的,会直接报错
    
    dict直接循环,循环的是key
   删除的时候,要把想要删除的key放到列表里面,循环列表,删除字典

 

 

以上就是两天的笔记, 昨天的东西很少, id() 的用法是 用来查数据的内存地址,  is 和 ==的区别. is 是判断两边的 内存地址是否一样,  == 是判断两边的值是否一样,  在了就讲了讲编码的问题, 需要注意的一个是 encode() 的用法, 是用来转换编码形式的.

今天的内容, 看起来很多很多, 实际上的难点, 只有列表的删除的问题上, 如果想用for 循环来删除列表里的元素的时候,需要主要, 在for循环里面, 删除完list里面的元素后,剩下的元素的位置,和索引都会发生变化,所以 往往用for循环来删除list 会出现问题,  我建议 最好还是用del 删除的多, 还不用循环,  如果非要 用for 循环来删除的话, 最好, 新建一个列表,里面装你想删除的原来列表的元素, 然后在 循环新列表,用新列表里面的每个元素,去删除,老列表里面的内容. 一般正常情况下 都不会出问题.

 

同样字典dict也是, 不过,dict在循环的过程中,是不允许删除的,如果强行删除, Python会报错, 想在循环里面删除dict的话, 还是需要用新的去删除旧的.

同时 dict 还讲了一个 静态方法, fromkeys(参数1, 参数2). 在这里先解释静态方法的意思,  因为 dict 本身那是一个类, fromkeys() 是在这个类里面定义的方法, 只能由 dict.fromkeys() 来调用,所以说他是静态方法. 用起来的方法那, 是由参数1里面的每个元素分别作为key 来指向后面的参数2 , 所以, 参数1 必须是可哈希(不可变的)的数据类型. 而且, 因为, 所有的key 都是指向的 同样的参数2 所以,随便的一个的key所指向的参数2 做出改变, 其他key 所指向的参数2 也会发生变化.

 

在还有一点 是join的一个用法, 他怎么说呢,跟别的字符串的用法,不太一样,    s= '_'.join.(参数)  join 里面的参数需要装的,可迭代的东西,  他会把参数里面的每个元素的后面都加上下划线,到最后一个元素为止, 很神奇的一个用法.

在就是讲了讲 浅拷贝,和深拷贝的 区别:  首先 = 不是拷贝,  浅拷贝的方法 有两个, 1️⃣, copy(), 2️⃣用切片, 这两个是只拷贝 第一层的数据,里面的数据不进行拷贝,只指向里面的更深的可变的数据,

  而 深拷贝, 是把所有层次里的数据都进行拷贝,比较安全. 但是方法,需要, import copy 调用 copy .然后去copy.deepcopy().   

  推荐一般拷贝的时候 最好用深拷贝, 避免以后发生高并发的事情:

  在科普一下, 高并发 就是很多方,同时使用一个相同的类型

最后 还有一个 set集合,  在我眼里,set 是一个比较废物的东西, 但还是说一下: 增删改查: 因为set跟字典的表示方式一样都是用到大括号{} 所以为了避免 误解, set的 空集合 用 set({})表示.,或者 set() 都一样. set实际上就是一个 字典的key的集合, 所以,他有字典key 的所有特点, 1, 必须是可哈希的(不可变的)数据类型,2 无序的, 3, 没有重复的.  但是他本身是以个不可哈希(可变的)数据类型. 如果想让他变的可哈希(可变) 可以用 frozenset(). 然后他还有数学上的集合 ∪ ∩ 的所有特点.  暂时想不到啥地方是 必须用这个东西的.... 除了去重, 而且就算是去重,如果数据里面有了不可哈希(可变的)数据类型, 还不能用, 比较鸡肋 - - 

 

这大概就是这两天的东西了, 明天学习 os

 

 

 


 

 

 

  今天下午的时候看了会视频, 因为今天没作业, 老师还是让做 头几天的作业,但是我昨天从下午3点写到晚上就已经写完了, 所以就没有再去写, 然后就看了会 崔庆才的 爬虫视频, 简单了解下, 看的我是相当无聊且 懵逼,大概听他 分析了下, 审查元素 里面的 notwork 就去查自己的代码了, 是一个 爬 煎蛋网 妹子图的 小虫子, 但是不知道问题在哪, 总是爬不下来,  费劲- - 头疼- - .....下面放一波原代码, 大神有时间的话,帮忙审审.  妹子图很帮的 - - 

import urllib.request
import os

def url_open(url):
    req = urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36')
    response = urllib.request.urlopen(url)
    html = response.read()

    return html

'''
def get_page(url):
    html = url_open(url).decode('utf-8')

    a = html.find('//jandan.net/ooxx/page-') + 23
    b = html.find('#comments', a)

    return html[a:b]
'''
def find_imgs(url):
    html = url_open(url).decode('utf-8')
    img_addrs = []

    a = html.find('img src=')

    while a != -1:
        b = html.find('.jpg', a, a+255)
        if b != -1:
            img_addrs.append(html[a+9:b+4])
 #       else:
  #          b = a + 9

        a = html.find('img src=', b)

    return img_addrs
        
            

def save_imgs(folder, img_addrs):
    for each in img_addrs:
        filename = each.split('/')[-1]
        with open(filenname, 'wb') as f:
            img = url_open(each)
            f.write(img)

            
def download_mm(folder='ox',pages=10):
    os.mkdir(folder)
    os.chdir(folder)

    url = 'http://jandan.net/ooxx/'
    
    page_num = 50689530 

    for i in range(pages):
        page_num -= i
        page_url = url +'page-50689530#comments'
        img_addrs = find_imgs(page_url)
        save_imgs(folder, img_addrs)


if __name__ == '__main__':
    download_mm()

求大神 解答, 有红包- -