Python进阶

python进阶

数据类型内置方法

数字 int float

  • 数据类型转换:

    res = int('18')
    res = float(18.1)
    
  • 常用操作和内置方法:算数运算,比较运算

复数 complex

# 了解即可
x = 1-2j
print(x.real)  # 打印实部
print(x.imag)  # 打印虚部

字符串 str

  • 数据类型转换:可以将任意类型转换成字符串

  • 循环:字符串是一个可迭代对象,可以被for循环使用

  • 常用操作+需要掌握的内置方法

    1、按索引取值(正反都可,但只能取不能改)
        msg = 'hello world'
        print(msg[1])  # e
        print(msg[-1])  # d
    2、切片(顾头不顾尾,步长)[起始:结束:步长]
    	msg = 'hello world'
        print(msg[0:5])  # hello
        print(msg[0:5:2])  # hlo
        print(msg[::-1])  # 将字符串倒过来
    3、统计长度  len()
    	print(len('h 你'))  # 3
    4、成员运算  in和not in
    	用于判断字符或字符串是否存在于目标字符串中,返回True或False
    5、移除空白  strip()
    	用于去除字符串两端的空格,也可以指定去除的字符
        res = '  hello****'
        print(res.strip())  # 默认去除空格
        print(res.strip('*'))  # 去除*号 
        去除左边的指定字符:lstrip
        去除右边的指定字符:rstrip
    6、转换成全大写或全小写:lower 全小写,upper 全大写
    	print('Hello'.lower())  # hello
        print('Hello'.upper())  # HELLO
    7、开头结尾判断:startswith 开头,endswith 结尾
    	判断是否以指定字符开头或结尾,返回真或假
        msg = 'hello world'
        print(msg.startswith('he'))  # True
        print(msg.endswith('ld'))  # True
    8、格式化输出 format的三种用法
    print('my name is {x} my age is {y}'.format(y=18,x='zheng'))  # 按照关键字进行传值
        print('my name is {} my age is {}'.format('zheng',18))  # 按照位置顺序进行传值
        print("my name is my age is {0}{0}{1}{0}".format(18,"egon"))  # 指定选取那个位置的值来传入
    9、切分 split 按照指定字符对目标字符进行切分,可以设置切分次数
    	msg = 'x:y:a:b'
        print(msg.split(':',1))  # ['x', 'y:z:a:b']
        print(msg.rsplit(":",1))  # 从右往左切 ['x:y:z:a', 'b']
    10、拼接 join 按照指定字符将可迭代对象进行拼接,结果为字符串
    	 print(":".join(["a","b","c"]))  # a:b:c
    11、字符替换 replace 用指定的字符去替换目标字符串内的在指定字符,可以设置替换次数
    	msg = 'xx zhengasdsadzheng asas zheng'
        print(msg.replace('zheng','ZHENG'))  # xx ZHENGasdsadZHENG asas ZHENG
    	print(msg.replace('zheng','ZHENG',1))  # xx ZHENGasdsadzheng asas zheng
    12、纯数字判断 isdigit 返回真或假
    	msg = '123'
        print(msg.isdigit())  # True
    
  • 需要了解的方法

    1、查找字符 find,rfind,index,rindex,count
    	1.1 find 从指定范围内查找指定字符串,找到了返回1,找不到返回-1
            msg = 'tony'
            print(msg.find('o',1,3))  # 1
    	1.2 rfind 查找最后一次出现的位置,返回出现的位置
        	msg = 'tonoy'
            print(msg.rind('o'))  # 3
        1.3 index,rindex 与 find,rfind用法相同,不过找不到会报错
        1.4 count 统计出现的次数
        	msg = 'tonoy'
            print(msg.count('o'))  # 2
    2、指定字符串长度 center,ljust,rjust.zjust
    	2.1 center 设置字符串为指定指定长度,居中显示,可指定填充字符
        2.2 ljust 设置字符串为指定指定长度,左对齐显示,可指定填充字符
        2.3 rjust 设置字符串为指定指定长度,右对齐显示,可指定填充字符
        2.4 zjust 设置字符串为指定指定长度,右对齐显示,用0填充
    3、大小写转换 captalize,swapcase,title
    	3.1 captalize 将整个字符串的开头字母转成大写,其他转小写
      3.2 swapcase 对字符串进行大小写转换
        3.3 title 将字符串里的每个单词首字母转大写,其他小写
    4、is 判断数字
            num1=b'4' #bytes
            num2=u'4' #unicode,python3中无需加u就是unicode
            num3='四' #中文数字
            num4='Ⅳ' #罗马数字
    	4.1 isdigit 判断是否只有阿拉伯数字
        	print(num1.isdigit()) #True
            print(num2.isdigit()) #True
            print(num3.isdigit()) #False
            print(num4.isdigit()) #False
        4.2 isdecimal 判断是否只有十进制阿拉伯数字
        	#bytes类型无isdecimal方法
            print(num2.isdecimal()) #True
            print(num3.isdecimal()) #False
            print(num4.isdecimal()) #False
        4.3  isnumeric 判断是否由阿拉伯数字,中文数字,罗马数字组成
        	print(num2.isnumeric()) #True
            print(num3.isnumeric()) #True
            print(num4.isnumeric()) #True
    5、is的其他判断
        5.1 isalnum 符串由字母或数字组成 结果为真
        5.2 isalpha 字符串只由字母组成 结果为真
        5.3 islower 判断字符串是否都是小写
        5.4isupper 判断字符串是否都是大写
        5.5 isspace 判断字符串是否只有空白字符
        5.6 istitle 判断字符串里的单词是否是首字母大写其他小写的格式
    

列表 list

  • 数据转换:能将所有可迭代对象转换列表,字典遍历key值

  • 循环:列表本身作为一个可迭代对象,可以被for循环遍历

  • 常用操作和内置方法

    1. 按索引取值,可正反取,可存可取,不能用不存在的索引取值
    2.切片(顾头不顾尾,步长)[起始:结束:步长]
        list1 = [111,222,333,444,555]
        print(list1[0:3:2])  # [111, 333]
    	l = list1[:]  # 浅拷贝
        print(list1[::-1])  # 倒序输出
    3.长度计算 len
    4.成员运算 in和not in
    5.append 追加 只能在末尾加
    	list1 = [111,222,333,444,555]
        list1.append(666)
        print(list1)  # [111,222,333,444,555,666]
    6.insert 插入 在指定位置插入对象
    	list1 = [111,222,333,444,555]
        list1.insert(2,666)
        print(list1)  # [111, 222, 666, 333, 444, 555]
    7.del 删除,无返回值
    8.pop 取走,返回取走的值 默认取走最后一个
    9.count 查询对象在列表中出现的次数,可以指定范围
    10.reverse 反向连表内的值
    11.clear 清空列表
    12.extend 在列表后一次性追加多个值
    13.copy 浅拷贝
    14.index 查询出对象在列表中匹配的第一个索引值,不存在则抛出异常
    15.sort 对列表进行排序reverse=False 升序(默认) True降序
    

元组 tuple

  • 与列表类似,但不可更改值

  • 类型转换:任何能可迭代对象都能转换成元组类型

  • 循环:元组也是一个可迭代对象,也可以被for循环遍历

  • 常用操作和内置方法

    1.按索引取值
    2.切片
    3.长度计算 len
    4.成员运算in和not in
    5.count 查询对象在元组中出现的次数,可以指定范围
    6.index 查询对象在元组中首次的匹配到的索引,不存在则抛出异常
    

字典 dict

  • 字典内有多个元素,每个元素的都是key : value的格式,key必须是不可变类型,通常是str类型,key不能重复,value可以是任意类型

  • 循环:字典在循环遍历时,遍历的是字典的key值

    1.长度计算 len  计算的是key的数量
    2.成员运算 in和not in  以key为准
    3.取值 键keys()  值values()  键值对items()  可以用到循环中,让遍历的不仅仅是key值
    4.del 删除
    5.pop 取走,需要给出key值,返回取走的value值
    6.popitem()删除并返回最后一对kv
    7.get(key, default=None) 返回key对应的value值,若key不存在则返回None,也可以自己设置返回值
    8.updata(dict) 将参数中的字典更新到目标字典中,若key存在则替换value值
    9.setdefault(key, default=None) 返回key对应的value值,若key不存在则将key:default添加到字典中
    10.fromkeys(seq, value)  用列表seq中的值为key值,value为所有key对应的value值,不写默认value值为None
    	list1 = [1, 2, 3, 4]
        dict = dict.fromkeys(list1)
        print(dict)  # {1: None, 2: None, 3: None, 4: None}
    

集合 set

定义:在{}内用逗号分割开多个元素,需要注意的是集合的元素是不可变类型,无序且没有重复
set()定义空集合,{}定义的是空字典
类型转换:
    s=set("123asda")
    print(type(s))
    print(s)
关系运算
    交集(同时存在于两个集合内):&  intersection
    并集(俩个集合内的所有元素):|  union
    差集(只存在于一个集合中的元素): -  difference
    对称差集(没用同时存在于两个集合的元素): ^  symmetric_difference
    父子集(包含和被包含的关系): <=  >=

深浅拷贝

  • 浅拷贝 copy
    • 针对于可变对象,浅拷贝的时候会开辟一块内存空间,仅仅是最顶层开辟了,里层元素的地址是相同的。
    • 针对于不可变对象,浅拷贝的时候仅仅是拷贝了引用,并不会开辟新的内存空间
    • 浅拷贝之后,改变拷贝之后的对象中的不可变对象,并不会影响原始对象中的元素,但是,如果改变拷贝之后的对象中的可变对象, 会同时影响原始对象中的元素。
  • 深拷贝: from copy import deepcopy
    deepcopy
    • 深拷贝除了顶层拷贝以外,还对子元素进行了拷贝,本质就是递归浅拷贝

字符编码

编码表:ASCII(英文) GBK(中文和英文)shift-JLS(日文和英文)
    unicode 万国编码表,一个字符对应两个字节
    utf-8  把unicode做了优化,一个英文字符对应一个字节,一个中文字符对应三个字节
存字符
                        内存                        硬盘
    万国字符-------》unicode格式的二进制数------》utf-8格式的二进制数
保证不乱码:
    1、存不乱:存时的编码要与要存的字符对应,最好统一用utf-8
    2、取不乱:编码与解码用的是同一张字符编码表

文件处理

  • 文件处理是操作系统提供给用户或者应用程序的一种操作硬盘的机制/功能

  • 文件操作的基本流程

    1. 应用程序打开文件,拿到一个文件句柄/文件对象
    2. 调用文件句柄下的读写操作
    3. 关闭文件,回收操作系统资源
  • python里文件操作的基本流程

    f = open('a.txt',mode='rt',encoding='utf-8')  # Windows默认编码GBK
    print(f.read())
    f.close()
    
  • 上下文管理 with

  • 文件的mode

    • 控制文件读或则写
      • r 只读(默认):文件不存在则报错,文件存在则文件指针调到文件开头
      • w 只写:文件不存在则创建空文档,文件指针在文件开头,文件存在会清文件内容
      • a 追加:文件不存在会创建文件,文件存在则指针处于文件末尾
    • 控制文件读写方式
      • t 文本模式(默认):无论读写都是以字符为单位,必须指定encoding字符编码,只能针对文本文件
      • b 二进制模式:读写是以二进制为单位的,不能指定encoding参数,可以针对所有文件类型
    • 额外:r+ a+ w+ 可读可写
  • 文件操作方式

    f.read()  # 读取所有文件内容,执行完该操作,文件指针会移动到文件末尾
    f.readline()  # 读取一行文件内容,文件指针移动到第二行首部
    f.readlines()  # 读取每一行内容,将读取的内容存放于列表中
    # 一行一行的读取文件:
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        for line in f:
            print(line)
    
    f.write('1a2b3c\n')  # 针对文本模式,需要自己加换行符
    f.writh('11\n').encode('utf-8')  # 针对b模式,需要自己加换行符
    f.writelines('111')  
    f.writelines('111\n').encode('utf-8')  
    # 两者的区别,write只能转入字符串,而writelines可传入列表,字典等可迭代对象
    
    • 其他操作
    f.readable  # 文件是否可读
    f.writable  # 文件是否可写
    f.closed    # 文件是否关闭
    f.encoding  # 文以指定的编码格式编码字符串
    f.flush     # 立即将文件从内存刷到硬盘
    f.name      # 返回文件名
    
  • 文件指针的移动

    • 控制文件呢指针移动的单位:只有t模式下的read(n)代表的是字符个数,除此之外的全部都是字节个数
    • 主动控制文件指针移动的三种模式
      • 只有0模式可以在t模式下使用,1和2模式都只能在b模式下使用
    # 0模式:参照文件开头移动n个字节
    f.seeck(3,0)  # 指针从0移动到3
    f.seeck(6,0)  # 指针从0移动到6
    # 1模式:参照当前所在位置移动n个字节
    f.seeck(3,1)  # 指针从0移动到3
    f.seeck(3,1)  # 指针从3移动到6
    # 2模式:参照文件末尾移动n个字节
    f.seeck(-3,2)  # 指针从文件末尾往前移动3个字节
    
    # 监听日志信息
    import time
    with open('access.log',mode='rb') as f:
        f.seek(0,2)
        while True:
            line = f.readline()
            if len(line) == 0:
                time.sleep(3)
            else:
                print(line.decode('utf-8'),end='')
    
  • 修改文件的两种方式

    • 方式一:
      1. 将文件内容一次性全部读入到内存
      2. 在内存中将内容修改完毕
      3. 将新内容写回原文件
    with open('a.txt',mode='rt',encoding='utf-8') as f1:
        data = f1.read()
        res = data.replace('旧内容','新内容')
    with open('a.txt',mode='wt',encoding='utf-8') as f2:
        f2.write(res)
    
    • 方式二:
      1. 以读的方式打开原文件,以写的方式打开一个临时文件
      2. 从原文件中一行一行的读取,修改,写入到临时文件中,知道全部读取完毕
      3. 删除原文件,将临时文件名修改为原文件名
    with open('b.txt',mode='rt',encoding='utf-8') as src_f,open('.b.txt.swp',mode='wt',encoding='utf-8') as dst_f:
    	for line in src_f:
    		dst_f.write(line.replace('旧内容','新内容'))
    os.remove('b.txt')
    os.rename('.b.txt.swp','b.txt')
    

posted @ 2021-07-02 19:47  zheng-sn  阅读(107)  评论(0)    收藏  举报