• 第二课 python基础2(列表,字符串,集合,字典,文件,编码与解码,转换)


     1.列表,元祖操作

     2.字符串操作

     3.字典操作

     4.集合操作

     5.文件操作

     6.字符编码与转码

     7.内置函数

    1.列表,元祖操作

      列表操作:

      

      

    COPY:

      

    结果:

    可以看出,copy是个浅copy,它copy的是这个列表指针指向的地址,把每一个元素看成一个地址,所以'lzx‘ 改变了以后,list;b 也跟着改变了,所以’lz’没有改变 

       

          

    结果:

    这个结果表示了a 和 b 这两个列表,其实指向的都是同一个地址,并没有又重新复制一列表给 b ,如果要复制一份单独的列表给 b ,就需要  import copy  ,用这个库里的 deepcopy() 这个函数。

    写一个小程序:

         1.启动程序后,让用户输入工资,然后打印商品列表

       2.允许用户根据商品编号购买商品

      3.用户选择商品后,检测余额是否足够,够就直接扣款,不够就提醒

      4.可随时退出,退出时,打印已购买的商品和余额

    commodity = [
        ('Iphone',5800),
        ('Mac_Pro',9800),
        ('bike',800),
        ('watch',10600),
        ('coffee',60),
        ('kola',10),
    ]
    shopping_list = []
    salary = input('input your salary:')
    if salary.isdigit():#判断输入的是否是一个整数
        salary = int(salary)
        while True:
            for index,item in enumerate(commodity):
                print(index,item)#打印出商品和下标
            user_choice = input('please choose your commodity:')
            if user_choice.isdigit():#判断输入的是否是一个整数
                user_choice = int(user_choice)#把输入的字符串转化成一个整数
                if user_choice < len(commodity) and user_choice > -1: #判断商品
                    p_item = commodity[user_choice]
                    if p_item[1] <= salary:#买得起
                        shopping_list.append(p_item)
                        salary -= p_item[1]
                        print('added %s in shopping car,your current balance is33[31;1m%s33[0m'%(p_item,salary))
                    else:
                        print('33[41;1m你的余额只剩[%s]啦,还买个毛线33[0m'%salary)
                else:
                    print('product code [%s] is not exist'%user_choice)
            elif user_choice == 'q':
                print('------shopping list------------')
                for p in shopping_list:
                    print(p)
                print('your current balance:',salary)
                exit()
            else:
                print('invalid optiob')
    购物车小程序

    2.字符串操作:
      常用的为例:

    3.字典操作

      字典:无序的,没有下标,可以嵌套多层,多级操作

      常用操作:

     小程序:三级菜单:

    data = {
        '北京':{
            "昌平":{
                "沙河":["oldboy","test"],
                "天通苑":["链家地产","我爱我家"]
            },
            "朝阳":{
                "望京":["奔驰","陌陌"],
                "国贸":{"CICC","HP"},
                "东直门":{"Advent","飞信"},
            },
            "海淀":{},
        },
        '山东':{
            "德州":{},
            "青岛":{},
            "济南":{}
        },
        '广东':{
            "东莞":{},
            "常熟":{},
            "佛山":{},
        },
    }
    
    enit_flag = False
    
    while not enit_flag:
        for i in data:
            print(i)
        choice1 = input('choice1:')
        if choice1 in data:
            while not enit_flag:
                for i2 in data[choice1]:
                     print(i2)
                choice2 = input('choice2')
                if choice2 in data[choice1]:
                    while not enit_flag:
                        for i3 in data[choice1][choice2]:
                            print(i3)
                        choice3 = input('choice3:')
                        if choice3 in data[choice1][choice2]:
                            while not enit_flag:
                                for i4 in data[choice1][choice2][choice3]:
                                    print(i4)
                                choice4 = input('这是最后一层,返回请按b')
                                if choice4 == 'b':
                                    break
                                elif choice4 == 'q':
                                    enit_flag = True
                        if choice3 == 'b':
                            break
                        elif choice3 == 'q':
                            enit_flag = True
                if choice2 == 'b':
                    break
                elif choice2 == 'q':
                    enit_flag = True
    省 市 县三级菜单

    后面学了函数以后可以用函数将重复的代码封装成一个函数,然后调用,看起来就会简洁很多了。

     4.集合(set)

      在集合中,所有的元素都是唯一的,无序的,主要操做:去重,关系测试

    print(a.intersection(b))#求交集
    print(a & b)
    求交集(intersection)
    print(a.union(b))#求并集
    print(a | b)
    求并集(union)
    print(a.difference(b))#求差集,取a里有,b里没有的
    print(a - b)
    求差集(difference)
    print(a.symmetric_difference(b))#对称差集,去除两边共有的,剩下的元素的集合
    print(a ^ b)
    对称差集(symmetric_difference)
    print(a.issubset(b))#a是b的子集吗?返回t/f
    print(a.issuperset(b))#a是b的父集吗?
    父集子集
    c.add((10))#在c的集合里添加一个10
    print(c)
    添加(add)
    c.update([11,12,13])#在c的集合里添加多项
    print(c)
    添加多项 (epdate)
    c.discard(12)#在集合c里删除一个12,如果12没有在C中,则返回None,不报错
    print(c)
    删除(discard)
    c.remove(11)#在集合c里删除一个11,如果11没有在c中,则会报错
    print(c)
    删除(remove)
    print(len(a))#返回的a的长度
    len()

    1.文件存储

      (1)文件

      我们大多数人可能都有相似的经历:在编写代码写的正起劲时,系统突然蓝屏崩溃,重启电脑后发现之前写过的代码全部不见了,这时候就会吐槽这破系统或者后悔之前没保存等等。

      在你编写代码的时候,操作系统为了更快的做出响应,把当前所有的数据都放在内存中,因为内存和CPU的传输速度要比硬盘和CPU之间的传输速度快很多倍,但内存有一个天生的不足,就是一旦断电,没保存的数据就没有了,因此我们在编写代码时,应养成一个随时用快捷键Ctrl+S保存数据。

      Windows是以扩展名来指出文件的类型的,一般比较常见的类型有: .exe,是可执行文件;.txt 是文本文件,还有.ppt ; .jpg ; .avi 等等,这些都被称为文件。

      (2) 打开文件  

      Python中,用open()这个函数来打开文件并返回文件对象:

      open(file , mode = 'r' , buffering = -1 , encoding = None , newline = None , closefd = True , opener = None )

      open()有很多参数,除了第一个参数,后面的都有默认值,我们现在先只看第一个和第二个参数。第一个是传入文件名,要带路径,若不带路径,那么Python就会在当前文件夹去打开,第二个参数指定打开模式:

    打开一个E盘下的 test.txt文件:

      f = open(E: \ test.txt )

    没有消息说明文件已经被打开,可以对其进行操作,没有注明操作,默认是以只读的模式打开。

    实例:

    此段代码,就将“你好啊”写入了E盘 测试文件 文件夹中的a.txt文件中了。

    文件对象方法:

    close()方法用于关闭文件,文件的关闭非常重要,在对文件的操作之后定要记得关闭文件。

    seek(offset,from) 方法有两个参数,表示从from(0代表文件的起始位置,1代表当前位置,2代表文件的末尾)偏移offset字节。

    文件的读取和定位:

      文件对象自身是可迭代的,可以直接用 for 迭代读取出来。

    文件的写入:

      如要写入文件,要确保文件的打开模式中有‘r’ 或 ‘a’ ,否则会出错。

    文件补充:

      .flash()  强制刷新。当要将一段数据写入文件的时候,运行这个程序,但是这段数据并没有马上存入文件,而是存入了缓存区,等到这个缓存满了以后再一起存入文件,在这个过程中,如果电脑蓝屏或死机了,那么这段数据就丢失了,而   . flash()这个函数,可以让数据直接存储到文件中

    使用规则:

      f = ('new','w',encoding = 'utf-8')

      f.write('abc')#此时运行,这段数据并没有出现在文件中,在它的缓存中

      f.flash()#此时运行,数据已经在new 的文件中了。

    打印类似进度条程序:

    import sys,time
    for i in range(20)
        sys.stdout.write('#')
        sys.stdout.flush()每次刷新
        time.sleep(0.1)#等待0.1s
    进度条

      .truncate(): 截断文件

      r+:读写,可以读可以以追加的方式写入

      w+:写读,创建一个文件在写,若源文件有数据,则清空数据

      a+:追加写读

      rb:二进制读

      wb:二进制写:

               f.write('hello word'.encode())#hello word 是字符串格式的,所以要经过encode()编码,才可以二进制写入

      ab:二进制追加写

     网络传输必须用二进制的形式传输。

    二进制的文件如果以字符串的格式打开可能会导致文件损坏,要用二进制的格式打开

    文件修改:

      文件中内容的修改:1.vim:先把文件全部加载到内存里,再修改

                2.把改完的之后的内容放到一个新的文件中,源文件不变。  

    f = open('timian','r',encoding= 'utf-8')
    f2 = open('new','w',encoding = 'utf-8')
    for line in f:
        if '字符串1' in line:
            line = line.replace('字符串1','字符串2')
        f2.write(line)
    f.close()
    f2.close()

    with语句:

        f = open('文件名',‘r’,encoding = 'utf-8')

        f2 = open('文件名2',‘r’,encoding = 'utf-8')

    等同于:  with open('文件名',‘r’,encoding = 'utf-8') as f ,

               open('文件名2',‘r’,encoding = 'utf-8')  as f2:

          for i in f:

            print(i)

    执行完后,文件会自动关闭,不用输f.close()去关闭了

    6.字符的编码与转码

      ASCII:
    
        记住一句话:计算机中的所有数据,不论是文字、图片、视频、还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的。
    再说简单点,计算机只懂二进制数字! 所以,目的明确了:如何将我们能识别的符号唯一的与一组二进制数字对应上?于是美利坚的同志想到通过一个电平的高低状态来代指0或1,
    八个电平做为一组就可以表示出 256种不同状态,每种状态就唯一对应一个字符,比如A--->00010001,而英文只有26个字符,算上一些特殊字符和数字,128个状态也够
    用了;每个电平称为一个比特为,约定8个比特位构成一个字节,这样计算机就可以用127个不同字节来存储英语的文字了。这就是ASCII编码。

      
      UNICODE编码:
    
        很多其它国家都搞出自己的编码标准,彼此间却相互不支持。这就带来了很多问题。于是,国际标谁化组织为了统一编码:提出了标准编码准
    则:UNICODE 。 UNICODE是用两个字节来表示为一个字符,它总共可以组合出65535不同的字符,这足以覆盖世界上所有符号(包括甲骨文)

      
    utf8:
    
        unicode都一统天下了,为什么还要有一个utf8的编码呢?
        大家想,对于英文世界的人们来讲,一个字节完全够了,比如要存储A,本来00010001就可以了,现在吃上了unicode的大锅饭,
        得用两个字节:00000000 00010001才行,浪费太严重!
        基于此,美利坚的科学家们提出了天才的想法:utf8.
        UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,它可以使用1~4个字节表示一个符号,根据
    不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,所以是兼容ASCII编码的。 这样显著的好处是,虽然在我们内存中的数据都是unicode,但当数据要保存到磁盘或者用于网络传输时,直接使用unicode就远不如utf8省空间啦! 这也是为什么utf8是我们的推荐编码方式。 Unicode与utf8的关系: 一言以蔽之:Unicode是内存编码表示方案(是规范),而UTF是如何保存和传输Unicode的方案(是实现)这也是UTF与Unicode的区别。


    所以的转换,都是要通过unicode过度的。如果一个 gbk 转换成一个gb2312,就要先转换成unicode,再转换成 gb2312,可以看下面的例子:

    #print(s.decode('utf-8').encode('gb2312'))#python2中是这样的,2中程序默认是ascii格式的,3中默认就是unicode格式的了
    #print(s.encode('gb2312'))#所以不用decode(‘utf-8’)了
    #print(s.encode('utf-8'))
    s ='你好'#本身是unicode类型的
    s1 = s.encode('gb2312')
    print(s1)
    print(s1.decode('gb2312').encode('utf-8').decode('gbk'))#s1原来是gb2312格式的,先转换解码成unicode的,然后再转换成gbk格式的
    print(s1.decode('gb2312').encode('utf-8'))






















  • 相关阅读:
    turtle库笔记
    使用turtle库绘制一个红色五角星图形‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪
    postgresql更新sequence的起始值
    es启动报错-系统设置
    mybatis批量update
    postgresql数据库连接数查询
    org.postgresql.util.PSQLException: 栏位索引超过许可范围:1,栏位数:0。
    postgresql创建SEQUENCE
    unzip解压所有zip格式
    jdk8中map的merge方法介绍
  • 原文地址:https://www.cnblogs.com/lzx11/p/8543294.html
Copyright © 2020-2023  润新知