第二课 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'))






















原文地址:https://www.cnblogs.com/lzx11/p/8543294.html