• 笔记--Day2--python基础2


    一、鸡汤

    1.提高自我修养

    2.人丑就要多读书

    3.多走走,开拓眼界

    二、目录:

    1.列表、元组操作

    2.字符串操作

    3.字典操作

    • dict是无序的
    • key必须是唯一的

    4.集合操作

    集合是一个无序的,不重复的数据组合,它的主要作用如下:

    • 去重,把一个列表变成集合,就自动去重了
    • 关系测试,测试两组数据之前的交集、差集、并集、子集、对称差集(反向差集)等关系

    5.文件操作

     文件操作流程:

    1. 打开文件,得到文件句柄并赋值给一个变量
    2. 通过句柄对文件进行操作
    3. 关闭文件 

     文件操作模式:

    • r,只读模式(默认)。
    • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
    • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

    "+" 表示可以同时读写某个文件

    • r+,可读写文件。【可读;可写;可追加】
    • w+,写读
    • a+,同a

    "U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)

    • rU
    • r+U

    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

    • rb
    • wb
    • ab

    6.字符编码与转码

    Python2中的字符串进行字符编码转换过程是:

    •    字节串-->decode('原来的字符编码')-->Unicode字符串-->encode('新的字符编码')-->字节串

    Python3中定义的字符串默认就是unicode,因此不需要先解码,可以直接编码成新的字符编码:

    • 字符串-->encode('新的字符编码')-->字节串

    
    

    三、练习

    1.列表元组操作练习

    #pycharm 5.0.3(python3.6)
    #定义一个空列表
    names = []
    print('打印空列表names:',names)
    #定义一个班级人员的列表
    names = ['Alex','Felix','Fion','Susan']
    #按下标取列表中的数据下标从0开始
    print("取'Felix':",names[1])
    #截取中间位置的人员 ,切片所取的位置包含其实位置,不包含结束位置(顾头不顾尾)
    print('切片_方法1_明确位置:',names[1:3])
    print('切片_方法2_取末尾:',names[-1]) #从右开始往左数是-1,-2.。。
    print('切片_方法3_取最后边:',names[-3:-1]) #如果要取后3个的话,写-1就不行了,只能取2个:
    print('切片_方法4_取最后边:',names[-3:]) #可以省略不写,这样就可以取多个了
    print('切片_方法5_取前3:',names[0:3]) #起始位置可以写0,也可以忽略
    print('切片_方法5_取前3:',names[:3])  #同上
    print('切片_方法6_按步长:',names[0:-1:2])
    print('列表的增删改查:'.center(40,'#'))
    names.append('Bob') #追加_末位最佳
    print('追加_末位追加:',names)
    names.insert(1,'Jack') #追加_任意位置
    print('追加_任意位置:',names)
    names[2] = 'Wulin' #修改,将列表下边是2的名称修改掉
    print('修改:',names)
    names.remove('Wulin') #删除
    print('删除_remove方式',names)
    del names[1]
    print('删除_del方式',names)
    print(names.pop())  #不带下标,删除最后一个并返回删除的值
    print('删除_pop方式',names) #删除后的结果
    print('查找_找下标:',names.index('Fion'))#查找人员索引位置,没有回报错
    print('查找_找下标_借下标打印出名称:',names[names.index('Fion')]) #看似多此一举
    names.insert(1,'Fion')#班级姓名重复的情况,可以统计重复的个数
    print('统计重复个数:',names.count('Fion'))
    #清除列表clear name.clear
    names.reverse()#反转
    print('反转:',names)
    names.insert(3,'4zhang') #插入数字开头的
    names.insert(3,'!#woaini') #插入特殊字符开始的
    names.sort()#排序
    print('排序',names)
    names2 = [12,34,5]
    names.extend(names2)#将names2并入到name
    print('打印合并后的两个列表:',names)
    print('以下为浅复制相关'.center(50,'-'))#以下浅复制相关,需要记住这个特性,尽管用的较少
    #列表中可以包含列表
    names.insert(0,['age','grade']) #向列表中插入一个列表 #print('打印包含列表的列表:',names)
    names3 = names.copy()#后边用到,浅copy,复制一个列表出来
    print('打印copy前的列表:',names)
    print('打印copy后的列表:',names3)
    names[0][0] ='sex' #修改列表中列表的值
    names[5] ='Wo' #修改names列表中Susan的名称为Wo,然后对比复制前复制后列表值的变化
    print('打印修改后的列表:',names)
    print('打印copy后的列表:',names3)
    #对比以上4个打印结果可以发现,列表中列表的值names和names3都被修改了,但是列表中的值只有names里边被修改了,这个叫浅copy
    #即只copy了第一层,由于列表中的列表只是个内存地址,所以修改names的列表中的列表的值后names3中的也跟着变了。
    print('以下为深copy相关'.center(50,'-'))#一下深复制相关,不随便用,通常不需要随便复制一份(比如数据比较大的情况)
    import copy #此时需要用到copy模块
    print('打印深copy前的列表:',names)
    names4 = copy.deepcopy(names) #调用copy模块的深copy
    names[0][0] = 'home' #修改列表中列表的值
    print('打印深copy后的列表:',names)
    print('打印深copy后的列表:',names4) #可以发现列表没有变化
    print('以下为列表的循环'.center(50,'-')) #
    for i in names:
        print(i)
    print('以下为浅复制的一个场景'.center(50,'-'))
    person = ['name',['saving',100]]
    '''
    #3中浅copy方式
    p1 = copy.copy(person) #
    p2 = person[:] #切片
    p3 = list(person) #工厂函数
    #浅copy什么情况下比较有用
    '''
    #有以下两个人,都基于person复制过来,两人有一个共同账号,如果一个少了50则另一个发现也少了50
    p1 = person[:]
    p2 = person[:]
    p1[0]='Felix'
    p2[0]='Fiona'
    p1[1][1] =50  #公共账号少了50,那么两个人发现都少了50
    print(p1)
    print(p2)
    列表代码
    元组代码

    2.字符串操作练习

    #pycharm 5.0.3(python3.6)
    name = 'my 	name is felix {first},my age is {age}'
    #pycharm有提醒功能,当输入name.的时候就会提醒字符串都有哪些操作,有两个下划线开始结尾的不用管
    print('首字母大写:',name.capitalize())
    print('统计个数',name.count('i'))
    print('总共50个字符,不够的用-补齐:',name.center(50,'-'))
    print('以什么结尾,匹配上则为真:',name.endswith('x'))
    print('将tab转为多少个空格:',name.expandtabs(tabsize=20)) #在变量值中插入一个tab
    print('查找,返回值所在的位置',name.find('is'))
    #字符串的切片
    print('字符串的切片:',name[name.find('is'):11])
    print('格式化字符串,向{}中传值:',name.format(first='Song',age=23))
    print('格式化字符串,传字典形式的值:',name.format_map({'first':'Song','age':12}))
    print('ab23!'.isalnum()) #'是否是阿拉伯数字,如果里边有特殊字符返回false
    print('ab'.isalpha())#是否是存英文字符
    print('1A'.isdecimal())#是否是十进制
    print('10'.isdigit())#是否是整数
    print('1A'.isidentifier()) #是否是一个合法的标识符 关注变量的命名规则,不符合的则为False
    print('A'.islower()) #判断是不是小写
    print('22'.isnumeric()) #判断是不是一个数字,只识别整数
    print(' '.isspace())#是否是空格
    print('my name is '.istitle()) #判断一个字符串是不是title,每个首字母大写
    print(''.isprintable())#是否可以打印,字符串不用考虑,比如还是tty文件
    print('s'.isupper())#判断是不是大写
    print('+'.join(['1','2','3','4']))#将列表中的字符串用某一个字符连接
    print(name.ljust(50,'*')) #和center类似,50个字符,不够的用*号补齐
    print(name.rjust(50,'*'))
    print('FELIX'.lower())#把大写变成小写
    print('felix'.upper())#把大写变成小写
    print('
    Felix'.lstrip())# strip默认会去除两边默认的空格回车 ,lstrip是去除左边的空格回车
    print('Felix
    '.rstrip())
    print('Felix
    '.strip())# strip默认会去除两边默认的空格回车
    print('------')
    p = str.maketrans('abcdef','123456') # 做映射,可以做随机密码来玩
    print('Felix'.translate(p))#
    str = 'http://www.baidu.com/index'
    print(str.partition('://'))#从左边找指定的分隔符将字符串进行分割
    #返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。
    print('Felix'.replace('i','I'))
    print('felix songi'.rfind('i')) #从做往右,找到最右边那个值的下标返回
    print('123'.rindex('3'))#返回子字符串 str 在字符串中最后出现的位置,如果没有匹配的字符串会报异常
    str = 'http://www.baidu.com/index'
    print(str.rpartition('/'))##从右边找指定的分隔符将字符串进行分割
    print('fe li xl'.split(' '))
    print('fe li
     xl'.splitlines()) #按换行来分
    print('felix'.startswith('f')) #判断是否是什么开头的
    print('Felix Song'.swapcase()) #大写边小写,小写边大写
    print('Felix Song'.zfill(50)) #50个字符不够数的用0填充
    练习代码

    3.字典操作练习

    #pycharm 5.0.3(python3.6)
    #定义一个字段(key-value格式)
    info = {
        'stu1101':'TengLan Wu',
        'stu1102':'LonZe Luola',
        'stu1103':'XiaoZe Maliya',
            }
    print(info) #字典是无序的
    #查,方法1,如果key不存在的话会出错
    print('取字典中某一个key对应的值:',info['stu1101'])
    #查,方法2,有就返回,没有就返回none,这是一种安排的方法
    print(info.get('stu1104'))
    #查,方法3,判断key在不在,不在就返回False
    print('stu1104' in info)
    #
    info['stu1101'] = '武藤兰'
    #增,当key值不存在的时候会增加
    info['stu1104'] ='Cangjingkong'
    print(info)
    #删除 del是python中的一个通用方法
    del info['stu1101']
    print(info)
    #删除,pop删除,
    info.pop('stu1102')
    print(info)
    #删除,popitem,随机删除
    info.popitem()
    print(info)
    #更新update,
    b = {
        'stu1101':'Felix',
        1:3,
        2:5
    }
    info.update(b) #合并两个字段,有交叉则更新,没有则创建
    print(info)
    #fromkeys与info没什么关系,初始化一个列表,这个地方有个坑
    c = info.fromkeys([6,7,8],[1,{'name':'alex'},444]) #相当于创建了一个字典
    print(c)
    c[7][1]['name'] = 'Fiona'#修改的时候会把fromkeys值都修改,类似于一个浅copy
    print(info.items()) #将字典变成了大的列表
    基本操作
    #字典可以多级嵌套字典
    China ={
        '北京':{
            '昌平':{
                '沙河':['oldboy','test'],
                '天通苑':['链家地产','我爱我家'],
            },
            '朝阳':{
                '望京':['奔驰','陌陌'],
                '国贸':['CICC','HP'],
                '东直门':['Adent','wwo']
            },
         '广东':{
            '东莞':{},
            '佛山':{},
            '广州':{},
        },
        }
    }
    #修改东直门下的公司名称(key尽量不要写中文)
    China['北京']['朝阳']['东直门'][1] = 'Kaitong'
    print(China)
    #打印所有不包含key的值
    print(China.values())
    #打印所有key值
    print(China.keys())
    #setdefault 如果字典不存在可以新增,存在则返回key所对应的值
    China.setdefault('陕西',{'宝鸡':{}})
    China.setdefault('北京',{})
    print(China)
    print(China.setdefault('北京',{}))
    多级嵌套
    #pycharm 5.0.3(python3.6)
    
    info = {
        'stu1101':'TengLan Wu',
        'stu1102':'LonZe Luola',
        'stu1103':'XiaoZe Maliya',
            }
    for i in info:
        print(i) #只是打印了key
    for i in info:
        print(i,info[i]) #打印key和value,建议的循环方式
    #上边的效果和下边的一致,但是上边的效果高,因为有一个字典转变为列表的过程
    for k,v in info.items():
        print(k,v)
    字典的循环

    4.集合操作练习

    #pycharm 5.0.3(python3.6)
    #定义列表,集合;列表转变为集合的方式就是用set()框起来
    list_1 = [20,1,4,5,7,3,6,7,9]
    list_1 = set(list_1)
    
    list_2 = set([2,6,0,66,22,8,4])
    print(list_1,type(list_1))
    print(list_2,type(list_2))
    
    #交集
    print('交集:',list_1.intersection(list_2))
    print('交集运算符',list_1 & list_2)
    #并集
    print('并集:',list_1.union(list_2))
    print('并集运算符:',list_1 | list_2)
    #差集
    print('差集(1有2没有):',list_1.difference(list_2))
    print('差集(2有1没有)',list_2.difference(list_1))
    print('差集运算符(1有2没有)',list_1 - list_2)
    print('差集运算符(2有1没有)',list_2 - list_1)
    list_3 = set([1,3,7])
    #子集 (前边的是不是后边的子集或者父集),子集没有专门的运算符
    print('子集(1是不是2的子集):',list_1.issubset(list_2))
    #父集
    print('父集(1是不是2的父集):',list_1.issuperset(list_2))
    print('子集(1是不是3的子集):',list_1.issubset(list_3))
    print('父集(1是不是3的父集):',list_1.issuperset(list_3))
    
    #对称差集(反向差集):把两个都有的去掉
    print('对称差集',list_1.symmetric_difference(list_2))
    print('对称差集运算符',list_1 ^ list_2)
    print('遗漏'.center(50,'#'))
    #判断两个是否有交集,有返回fase,没有返回true
    list_4 = set([5,6,8])
    print(list_4.isdisjoint(list_3))
    print(list_1.isdisjoint(list_2))
    
    #pop 任意删除一个,并返回一个值
    print('删除任意一个并返回其值:',list_1.pop())
    print('删除任意一个并返回其值:',list_1.pop())
    #discard删除一个值,如果值有则删除,如果没有返回空不报错,remove会报错
    list_1.discard(7) #discard删除一个值
    print('discard删除一个值后list_1结果:',list_1)
    list_1.discard(1000)#删除一个不存在的值,这里什么也不做也不会报错
    print('discard删除一个值list_1结果::',list_1)
    
    print('集合的增删改查'.center(30,'-'))
    #增加
    list_1.add(2000)
    print('增加一个:',list_1)
    #增加多项
    list_1.update([20,40,555])
    print('增加多个:',list_1)
    #删除,值不存在的时候会报错
    list_1.remove(2000)
    print('移除:',list_1)
    #长度判断
    print('长度',len(list_1))
    #成员判断:判断20是否在list_1中
    print('成员判断:',20 in list_1)
    print('成员判断:',1000 not in list_1)
    #copy:浅复制
    集合代码

    5.文件操作

    #pycharm 5.0.3(python3.6)
    #文件的打开、读写操作
    #读:
    '''
    f = open('yesterday2','r',encoding='utf-8') #打开文件 (此处如果不加编码格式,windows默认编码是gbk,而python默认是utf8
    #的)所以需要指定编码用utf-8打开文件
    data = f.read() #文件打开了只是一个内存对象,所以需要赋变量的形式进行操作
    data2 = f.read() #上边读完了,此时在读的话是从末行开始读,所以这里读的内容是空的。
    print(data)
    print('data2:',data2) #打印内容为空理解(读文件的时候相当于是有个光标的东东,python会记录光标的位置,我们要想从任意位置
    #读取的话就可以通过操作光标实现)
    '''
    
    
    
    #
    '''
    f = open('yesterday2','w',encoding='utf-8') #写的话需要在open中加上打开文件的模式'w'(默认读模式)
    f.write('I love you Fiona,
    ') #open模式中只写‘w’相当于是创建一个文件*慎用*,会把原文件清空
    f.write('very much')  #第一行内容不带
    的话会写在同一行
    '''
    
    '''
    #'a' 追加的话需要在open中加上打开文件的模式(默认读模式),相当于append(在末尾增加)
    f = open('yesterday2','a',encoding='utf-8')
    f.write('hahhhhhhh
    ')
    f.write('luhaluhaluha')
    f.close() #写完文件要把文件关闭
    '''
    
    #读2行
    '''
    #readlin默认读文件中的一行
    f = open('yesterday','r',encoding='utf-8')
    print(f.readline())
    print(f.readline())
    '''
    #读5行,可以用循环
    '''
    f = open('yesterday','r',encoding='utf-8')
    for i in range(5):
        print(f.readline().strip()) #strip可以去除两边的换行和空格
    '''
    
    #需求:读多行,readlines读所有的文件,在第10行的位置打印一个分割线
    '''
    f = open('yesterday','r',encoding='utf-8')
    #print(f.readlines()) #读所有的行放到一个列表
    #print(list(enumerate(f.readlines())))
    
    #解决:通过for循环可以把这个列表的数据取出来,通过enumerate将列表的下标和值存成元组形式,然后在赋两个值
    for index,line in enumerate(f.readlines()):
         if index ==9:
             print('我是分割线')
             continue
         print(line.strip())
    '''
    
    #需求,readlines只适合读小文件,读大文件怎么办 :读一行删一行,内存只存一行
    #此时文件变成了一个迭代器,无法通过枚举取下标了
    '''
    f = open('yesterday','r',encoding='utf-8')
    count = 0
    for line in f:
        if count == 9:
            print('我是分割线')
            count += 1
            continue
        print(line)
    f.close()
    '''
    文件操作
    #pycharm 5.0.3(python3.6)
    #需求:怎么将光标移动,获取想要打印的内容呢?
    f = open('yesterday','r',encoding='utf-8')
    print(f.tell()) #打印光标位置 ,按字符的个数计数
    print(f.readline())
    print(f.readline())
    print(f.readline())
    print('总共读了几个字符:',f.tell())
    print('光标返回到第几个字符:',f.seek(0)) #一般是0,回到头,像tty等设备是无法移动
    print(f.readline())
    print('判断光标是否可移动:',f.seekable())
    print('打印文件的编码:',f.encoding)
    print('反应文件句柄在内存的编号:',f.fileno()) #返回文件句柄在内存中的编号
    print('打印文件名称:',f.name)
    print('是不是终端设备:',f.isatty())
    print('判断文件是否可读:',f.readable())
    print('判断文件是否可写:',f.writable())
    
    print('强制刷新:',f.flush()) #将缓存中的数据立马写入硬盘,系统默认会等到缓存满了才写到硬盘中
    print('判断文件是否关闭:',f.closed)
    print('关闭文件',f.close())
    print('判断文件是否关闭:',f.closed)
    #print('清空',f.truncate()) 打开文件模式‘a’ 从头开始截断,
    基本操作
    #进度条实现
    import  sys,time #导入系统和时间模块
    
    for i in range(20):
        sys.stdout.write('#')
        sys.stdout.flush() #刷到内存上
        time.sleep(0.1) #隔01秒打印1次
    进度条
    #pycharm 5.0.3(python3.6)
    #文件的读写
    '''
    f = open('yesterday','r+',encoding='utf-8')
    print(f.readline())
    print(f.readline())
    print(f.readline())
    f.write('====================')#只能写到最后
    print(f.readline())
    '''
    #文件的写读
    '''
    f = open('yesterday3','w+',encoding='utf-8')
    f.write('=========wo==========
    ')
    f.write('=========wo==========
    ')
    f.write('=========wo==========
    ')
    f.write('=========wo==========
    ')
    print(f.tell())
    f.seek(10)
    print(f.readline())
    f.write('ninini') #只能写在末尾,与硬盘存储机制有关
    f.close()
    '''
    #追加读 a+
    
    #以二进制方式读[FTP传输、网络传输、视频文件]
    '''
    f = open('yesterday3','rb')
    print(f.readline())
    '''
    #以二进制方式写
    f = open('yesterday3','wb')
    f.write('hello world
    '.encode())
    f.closed
    
    #追加二进制,ab
    文件的修改
    #pycharm 5.0.3(python3.6)
    #方式一、vim的方式,将文件全部加载到内存,然后全部保存到内存中
    #方式二、修改好以后写到新的文件
    # (边读边写),需要打开两个文件
    f = open('yesterday','r',encoding='utf-8')
    f_new = open('yesterday.bak','w',encoding='utf-8')
    
    for line in f:
        if 'me' in line:
            line = line.replace('me','Felix')
        f_new.write(line)
    f.closed()
    f_new.closed()
    文件的修改2

    四、参考

    http://www.cnblogs.com/apff/p/7455410.html

    http://www.cnblogs.com/alex3714/articles/5717620.html  <博主博客记录>

    http://www.runoob.com/

    注:本笔记基于“老男孩python14期百度传课视频”,地址:https://chuanke.baidu.com/v3628575-182242-1134376.html

  • 相关阅读:
    采用[ICONIX] 方法实践BLOG设计之二 [用例建模]
    Java平台AOP技术研究
    AOP技术基础
    使用 Windows Vista 的凭据提供程序创造自定义的登录体验
    采用[ICONIX] 方法实践BLOG设计之一 [问题域建模]
    软件工程知识体系全景图
    .Net平台AOP技术研究
    采用[ICONIX] 方法实践BLOG设计之四 [健壮性分析]
    采用[ICONIX] 方法实践BLOG设计之三 [需求复核]
    AOP——引言
  • 原文地址:https://www.cnblogs.com/apff/p/7467937.html
Copyright © 2020-2023  润新知