• Python之路-python(set集合、文本操作、字符编码 )


    一、集合操作(set)                                                                                                                          

        1、定义:

          set集合,是一个无序且不重复的元素集合。

          集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合         的成员。但是因为集合本身是无序的,不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。

        2、特性:

          1、无序

          2、去重

          3、关系测试 

        3、常用操作:

          交集(&)(intersection):两者都存在的      

    1 >>>a = [1,2,3,4,5]
    2 >>>b = [4,5,6,7,8]
    3 >>>a_set = set(a)
    4 >>>b_set = set(b)
    5 >>>rint(a_set.intersection(b_set))
    6 >>>print(a_set.intersection(b_set),type(a_set.intersection(b_set)))
    7 >>>{4, 5} <class 'set'>#可以看出字典和集合都是{},先将a和b都转成集合,然后求出交集(它们两都有的)

          并集(|)(union):去重后所有元素放一起

    1 >>>a = [1,2,3,4,5]
    2 >>>b = [4,5,6,7,8]
    3 >>>a_set = set(a)
    4 >>>b_set = set(b)
    5 >>>print(a_set.union(b_set))

          差集(-)(difference):语法使用规则是你有我没有

    1 >>>a = [1,2,3,4,5]
    2 >>>b = [4,5,6,7,8]
    3 >>>a_set = set(a)
    4 >>>b_set = set(b)
    5 >>>print(a_set.difference(b_set))#(前后存在顺序问题,a里面有的b里面没有的(有---没有))
    6 >>>print(b_set.difference(a_set))#b里面有的a里面没有

          子集(issubset):a是不是b的子集和b是不是a的子集

    1 >>>a = [1,2,3,4,5]
    2 >>>b = [4,5,6,7,8]
    3 >>>a_set = set(a)
    4 >>>b_set = set(b)
    5 >>>print(a_set.issubset(b_set))
    6 >>>print(b_set.issubset(a_set))
    7 >>>False
    8 >>>False

         

            父集(issuperset):a是不是b的父集和b是不是a的子集

    1 >>>a = [1,2,3,4,5]
    2 >>>b = [4,5,6,7,8]
    3 >>>a_set = set(a)
    4 >>>b_set = set(b)
    5 >>>print(a_set.issuperset(b_set))
    6 >>>print(b_set.issuperset(a_set))
    7 >>>False
    8 >>>False

            

            对称差集(^)(symmetric_difference):a和b都互相都没有(去重后放到一起)

    1 >>>a = [1,2,3,4,5]
    2 >>>b = [4,5,6,7,8]
    3 >>>a_set = set(a)
    4 >>>b_set = set(b)
    5 >>>print(a_set.symmetric_difference(b_set))
    6 >>>{1, 2, 3, 6, 7, 8}
    a = [1,2,3,4,5]
    b = [4,5,6,7,8]
    a_set = set(a)
    b_set = set(b)
    print(a_set.isdisjoint(b_set))#前后两者存在交集就返回False,没有交集就打印True
    解释:
        isdisjoint是判断a和b是否存在交集,如果存在返回False,不存在交集返回Trun

            4、基本操作

        

          .add(增加)添加一项

    1 >>>a = [1,2,3,4,5]
    2 >>>a_set = set(a)
    3 >>>print(a_set)
    4 >>>a_set.add(55)#一次只能添加一个元素,否则会报错
    5 >>>print(a_set)

         

          .update([增加多项])

    1 >>>a = [1,2,3,4,5]
    2 >>>a_set = set(a)
    3 >>>print(a_set)
    4 >>>a_set.update('88','lei','lei')
    5 >>>print(a_set,type(a_set))
    6 >>>{1, 2, 3, 4, 5}
    7 >>>{1, 2, 3, 4, 5, '8', 'e', 'l', 'i'} <class 'set'>#通过结果不难看出集合天然去重

          .remove('删除')(没有的话报错)

    1 >>>a = [1,2,3,4,5]
    2 >>>a_set = set(a)
    3 >>>print(a_set)
    4 >>>a_set.remove(1)#一次只能删除一个,否则会报错
    5 >>>print(a_set,type(a_set))

          .copy(复制)

    >>>a = [1,2,3,4,5]
    >>>a_set = set(a)
    >>>b_set = a_set.copy()
    >>>print(a_set,type(a_set))
    >>>print(b_set,type(b_set))
    >>>{1, 2, 3, 4, 5} <class 'set'>
    >>>{1, 2, 3, 4, 5} <class 'set'>


          .pop(删除任意一个并返回这个元素)

    1 >>>a = [1,2,3,4,5]
    2 >>>a_set = set(a)
    3 >>>b_set = a_set.pop()#随机删除,并返回删除的元素
    4 >>>print(a_set,type(a_set))
    5 >>>print(b_set)
    6 >>>{2, 3, 4, 5} <class 'set'>
    7 >>>1


          .discard(删除)(没有不会报错)

    1 >>>a = [1,2,3,4,5]
    2 >>>a_set = set(a)
    3 >>>b_set = a_set.discard(5)
    4 >>>print(a_set)
    5 >>>print(b_set)
    6 >>>{1, 2, 3, 4}
    7 >>>None#有的话删除后并返回一个None
    8 >>>就算没有,不报错,也只会返回一个None

    二、文件操作                                                                                                                                       

           提示:2.7里面的file文件操作3.x没有

          1、标准操作:

    f = open("yesterday",'w',encoding="utf-8")#文件句柄(放到了内存什么位置)
    f.write("哈哈哈")#写入内容,如果没有该文件就自动创建
    f.close#(关闭文件)

          2、建议操作:

    >>>with open("yesterday","w",encoding='utf-8') as data:#读写完后自动关闭,因为windows上默认的编码是gbk,所以需要转换成utf-8
           data.write("哈哈哈")

         

          3、打开模式:

    r,只读模式(默认)。
    w,只写模式。(不可读;不存在就自动创建;存在则删除内容)
    a,追加模式。(可读;   不存在则创建;存在则只追加内容)
    "+" 表示可以同时读写某个文件
    
    r+,可读写文件。【可读;可写;可追加】
    w+,写读
    a+,同a
    "U"表示在读取时,可以将 
     
     
    自动转换成 
     (与 r 或 r+ 模式同使用)
    
    rU
    r+U
    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

      .readlines(读成一个列表,所有内容)#默认每行之间有空行因为有 ,用strip()就行
      .readline(默认一次只读一行)
      .seek#位置0是开始
      .tell#打印当前位置
      .encoding#当前编码
      .readable#文件是否可读
      .writeable#是否可写
      .flush#默认是等内存缓存满了才写入,强刷读一条直接写入硬盘

         

            小练习

    1 #!/usr/bin/env python
    2 #—*—coding:utf-8—*—
    3 with open("yesterday","r",encoding='utf-8') as data_1 , 
    4     open("yesterdaybak","w",encoding='utf-8') as data_2:#读写完后自动关闭
    5     for line in data_1.readlines():
    6         if "中国石油" in line:
    7             line = line.replace("中国石油","中国石化")
    8         data_2.write(line)
    yesterday#文件更改前
    新浪
    百度
    中国石油
    
    
    yesterdaybak#更改后文件内容
    新浪
    百度
    中国石化

    三、字符编码与转码                                                                                                                               

         

            1、python3练习

    打开文件yesterday(windows上),内容如下
    新浪
    百度
    中国石油
    >>>with open("yesterday","r") as data:
    >>>    for line in data:
    >>>        line = line.strip('
    ')
    >>>        print(line)
    报错:
    UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 18: illegal multibyte sequence
    解释:
          我们知道utf-8是unicode的扩展,windows上默认编码是gbk,按照上图所示打开文件的时候我们需要将gbk转码直接解码(encoding)成utf-8。
          如果是python2,.x的话,如果编码格式是gbk,我们首先需要将gbk转码成unicode,然后再将unicode解码(encoding)成utf-8。

    四、函数                                                                                                                                             

         

          1、定义:

            函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

          2、特性:

            1、减少重复性

            2、是程序扩展性好

            3、使程序更容易维护

          3、语法:

    1 >>>def func():
    2 >>>    print("你好中国!")
    3 >>>func()

          4、执行顺序:

    >>>def func():#1>>#3(首先python程序通过关键字发现这是个函数)(当执行完func()时候又到了这里)
    >>>    print("你好中国!")#4(最后才执行到这里)
    >>>func()#2(然后从上往下,这里执行了上面的函数)

          

          5、函数参数

    1 #默认参数
    2 def func(x,y):#这里的x和y只是形参(形式参数)
    3     print(x)
    4     print(y)
    5 func(1,2)#这里是实参(实际参数,就是真真切切要往函数体里面传的参数)
    6 #1对应x,2对应y,也就是说实参合形参是平行对应的,否则打印出的效果就相反了。形参和实参不能多也不能少,否则报错。
    1 #关键参数
    2 def func(x,y,z):
    3     print(x)
    4     print(y)
    5     print(z)
    6 func(x= "中国",y="北京",z = "海淀")
    7 #这样的话就没有了顺序的问题,只是要求形参和实参一定要对应,不能多,也不能少
    1 #默认参数和关键参数混用
    2 def func(x,y,z="22"):#默认参数和关键参数混合使用的时候,关键参数必须在最后
    3     print(x)
    4     print(y)
    5     print(z)
    6 
    7 func(1,2,z='33')#默认参数和关键参数混合使用的时候,关键参数必须在最后。
    8 #如上,z,如果如果没有给传实际参数,默认使用形式参数赋的值,如果实参给了就用实参的参数。

           

            万能参数一(*)

    1 #非固定参数(万能参数)
    2 def func(*args):#*是关键指定不可变,args是名称可以更改
    3     print(args[0])
    4     print(args,type(args))
    5 func(1,2,3,4)#通过结果可看出*传进去的是元祖
    6 >>>1
    7 >>>(1, 2, 3, 4) <class 'tuple'>

            万能参数二(**)

    1 #非固定参数(万能参数**kwargs)
    2 def func(**kwargs):
    3     print(kwargs,type(kwargs))
    4 func(Name = '中国',Age = '上下五千年')
    5 #**因为**输出的是字典,所以传值得时候一定是类似xxx = yyyy形式。

            局部变量和全局变量

    1 name = "china"
    2 def func(*args,**kwargs):
    3     name = "beijing"#注意,局部变量是存在于函数体内的变量,全局变量是不在任何一个函数体内的变量
    4     print(name)#如果局部变量和全局变量同时存在的话,优先使用局部变量
    5     print(args)
    6     print(kwargs)
    7 func(1,2,3,age = "上下五千年")
     1 #更改全局变量
     2 name = "china"
     3 def func(*args,**kwargs):
     4     global name#引用全局变量的name
     5     print(name)#打印结果肯定是china
     6     name = "Beijing"#修改,这里有点像如果引用一个变量,首先从函数体内找,如果函数体内没有就找全局变量
     7     print(name)
     8     print(args)
     9     print(kwargs)
    10 func(1,2,3,age = "上下五千年")
    11 >>>china
    12 >>>Beijing
    13 >>>(1, 2, 3)
    14 >>>{'age': '上下五千年'}

           

            6、函数返回值

    1 要想获取函数的执行结果,就可以用return语句把结果返回
    2 
    3 注意:
    4 
    5 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
    6 如果未在函数中指定return,那这个函数的返回值为None 

            

            7、函数的递归

    定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
    #函数的递归
    def info(n):
        print(n)
        if int(n/2) > 0:
            return  info(int(n/2))
        print(">>>>",n)
    info(10)
    结果:
    10
    5
    2
    1
    >>>> 1
    递归特性:
    
    1. 必须有一个明确的结束条件
    
    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    
    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

            8、高阶函数

            变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    def add(x,y,f):#实参将3和-6传给形参
        return f(x) + f(y)#返回值首先将3和-6取绝对值(那就是3和6),再相加,结果肯定是9
    
    res = add(3,-6,abs)#abs是内置函数,让的定义简单里面就是去绝对值
    print(res)
  • 相关阅读:
    【2020-02-13】内容变了,但计划本身没变
    【2020-02-12】新的工作计划方式
    【2020-02-10】煮饭那点家常
    【2020-02-10】生活需要不断地相互协调
    nacicat premium 快捷键
    python 爬虫之 正则的一些小例子
    Python爬虫之Cookie和Session
    Python爬虫之关于登录那些事
    爬虫常用库之pyquery 库
    day 39 jq 学习入门2
  • 原文地址:https://www.cnblogs.com/lei0213/p/5748756.html
Copyright © 2020-2023  润新知