zoukankan      html  css  js  c++  java
  • python笔记(三)数据类型

    一、字符格式化输出

     1 name = input("名字:")
     2 age = input("年龄:")
     3 wage = input("工资:")
     4 if age.isdigit(): #判断age是否是数字
     5     age = int(age)
     6 else:
     7     exit("年龄输入错误")
     8 a1 = '''---------Your %s------------
     9 name:%s 
    10 age:%d
    11 wage:%s
    12 你还能活%s年
    13 -------------end-----------''' % (name,name,age,wage,80-age)
    14 #占位符%s  s = string
    15 #数字  %d  d=digit
    View Code

     二、数据类型出初识

    整数为整型和长整型,python3 里面已经不区分整型与长整型,统一都叫整型。

    布尔 只有2种状态,分别是
                真 True
                假 False

    计算机中, 一切皆为对象
                世界万物,皆为对象,一切对象皆可分类

    三 、列表(list)

    • 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字- 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
    • Python有6个序列的内置类型,但最常见的是列表和元组。
    • 序列都可以进行的操作包括索引,切片,加,乘,检查成员。
    • 此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。
    • 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。
    • 列表的数据项不需要具有相同的类型
    • 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。

    列表的创建

    1 num = ["a1","a2",2018,[2019,2020]] #可进行嵌套
    2 b = list(("a1","a2"))#用list直接创建

    列表一般操作

     1 num = ["a1","a2","a3",2018,[2019,2020],"a4"]#[]里面的为元素,列表里的元素数据类型可以不同,也可以是另一个列表
     2 num2 = ["a","b"]
     3 print(num)#输出["a1","a2","a3",2018,[2019,2020],"a4"]
     4 
     5 #使用下标索引来访问列表中的值,同样也可以使用方括号的形式截取字符,如下所示:
     6 print(num[1])#输出a2
     7 print(num[0],num[3])#输出为a1 2018
     8 print(num[-1],num[-3])#输出a4 2018
     9 #切片使用索引位置
    10 print(num[0:3])
    11 print(num[:3])#输出为['a1','a2','a3'],此操作顾头不顾尾
    12 print(num[-2:])#输出[[2019, 2020], 'a4']
    13 print(num[1:-2])#输出['a2', 'a3', 2018]
    14 print(num[1:-1:2])#['a2', 2018] 第三个数值为步长
    15 print(num[3:0:-1])#[2018, 'a3', 'a2'] 步长为负数时,怎从右往左取,依然顾头不顾尾
    16 #添加
    17 num.append("a5")#无法输出print(x.append("xx"))
    18 print(num)#输出['a1', 'a2', 'a3', 2018, [2019, 2020], 'a4', 'a5'] append为默认输入到最后
    19 num.insert(3,"2018a")#无法输出print(x.insert("xx"))
    20 print(num)#输出结果['a1', 'a2', 'a3', '2018a', 2018, [2019, 2020], 'a4', 'a5'] insert 可插入到某个具体的位置
    21 #删除
    22 num.remove("2018a")
    23 print(num)#输出结果为['a1', 'a2', 'a3', 2018, [2019, 2020], 'a4', 'a5'],可删除某一具体元素
    24 b = num.pop(6)#()无索引数值择默认删除最后一个元素
    25 print(num)#输出为['a1', 'a2', 'a3', 2018, [2019, 2020], 'a4']。可删除某一具体的索引
    26 print(b)#输出为a5 pop删除可直接输出删除的内容
    27 '''del num2[1]
    28 print(num2)['1']
    29 #输出为['a'] del 通过索引删除元素,也可以直接删除整个列表如:del num2'''
    30 
    31 #查找某一元素的索引数值
    32 print(num.index("a3"))#输出为2
    33 #查找某一元素出现的次数
    34 print(num.count(2018))#输出结果为1
    35 #反转列表
    36 num.reverse()
    37 print(num)#输出['a4', [2019, 2020], 2018, 'a3', 'a2', 'a1']
    38 # #排序
    39 num.sort()#按照ASISS 排序
    40 print(num)
    41 #列表合并
    42 num.extend(num2)
    43 print(num)#输出:['a4', [2019, 2020], 2018, 'a3', 'a2', 'a1', 'a', 'b']
    View Code

     补充

    1 b =  {"名字":["wangming","xiaoli"],"nianling":[25,20]}
    2 c=b.get("das","没有该键值对")  # 没有该键值对
    3 print(c)

    三、元组(tuple)

    元组也是存一组数据,只是一旦创建,便不能修改和删除,所以又叫只读列表。

    1 tup1 = (1,2,3,4,5)
    2 tup2 = ('frui', 27)
    3 tup3 = "a", "b", "c", "d";
    4 tup4 = () #创建空元组

    元组中只包含一个元素时,需要在元素后面添加逗号

    tuple5 = (50,) #元组中只包含一个元素时,需要在元素后面添加逗号
    tuple6 = (50)
    #如果不加逗号,则定义的不是tuple,是50这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算。

    购物车练习

     1 #__author:Mr. Zhang
     2 #date: 2018/6/30
     3 LB=[
     4     ("iphone6s",5800),
     5     ("mac_book",9000),
     6     ("coffee",32),
     7     ("python_book",80),
     8     ("bicyle",1500),
     9     ]#LB为商品列表
    10 GMLB = []#GMLB为已购买的商品,待用
    11 money = input("你有多少钱?")#引导用户输入自己拥有的钱
    12 if money.isdigit():#判断是否是数字
    13     money = int(money)#改变字符串为整数
    14     while True:
    15         for i,v in enumerate (LB,1):#注意enumerate用法
    16             print(i,">>>>",v)
    17         ids = input("你想要的商品编号:(输入q退出)")#打印出商品列表
    18         if ids.isdigit():#判断输入的商品编码是否为数字
    19             ids = int(ids)#如果是数字则将字符串转换为整数
    20             if ids > 0 and ids <= len(LB):#len(list)判断列表的长度
    21                 idss = LB[ids-1]#取出商品在列表中的索引
    22                 if money >= idss[1]:#判断商品金额是否大于用户余额
    23                     money -=idss[1]
    24                     GMLB.append(idss)#将购买的加入购物车
    25                 else:
    26                     print("余额不足,还剩%s"%money)
    27                 print(idss)
    28             else:
    29                 print("商品编码不存在")
    30         elif ids == "q":
    31             print("-----你已经购买了一下商品-----")
    32             print(GMLB)
    33             print("你还剩余%s"%money)
    34             break
    35         else:
    36             print("输入错误")
    37 else:
    38     exit("输入的格式错误")#如果输入的格式不是数字则会提示输入的格式错误
    View Code

    三、字典

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组。

    字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素通过键来存取,键不可修改,值可进行修改。

    创建字典

    num={“name”:1。“name2”:2,name3:[4,5,6]}#字典可进行嵌套
    
    num2= dict(((“ name”,1),("name2",2))) 通过dict创建

     基本操作

     1 num = {"名字":"小明","年龄":"36","职业":"学生"}
     2 print(num)#输出为{'名字': '小明', '年龄': '36', '职业': '学生'}
     3 #增加
     4 num["工资"] = 3500
     5 print(num)#{'名字': '小明', '年龄': '36', '职业': '学生', '工资': 3500}
     6 num.setdefault("名字","小红")
     7 print(num)#{'名字': '小明', '年龄': '36', '职业': '学生', '工资': 3500} 键存在怎不改动
     8 a=num.setdefault("身高","一米八")
     9 print(num)#输出{'名字': '小明', '年龄': '36', '职业': '学生', '工资': 3500, '身高': '一米八'} 键不存在在字典中中增加新的键值对
    10 print(a)#一米八 setdefault 可返回相应的值

     查

    1 num = {"名字":"小明","年龄":"36","职业":"学生"}
    2 print(num["名字"])#输出小明 通过键查找值
    3 print(num.keys())#输出 dict_keys(['名字', '年龄', '职业']) keys输出为字典的键
    4 print(num.items())#dict_items([('名字', '小明'), ('年龄', '36'), ('职业', '学生')]) items 为字典的键值对
    5 print(num.values())#ict_values(['小明', '36', '学生']) valuse 输出为字典的值
    6 print("名字" in num) #True 判断字典num中是否包含名字
    7 print(list(num.values()))#['小明', '36', '学生'] list 列表

    1 num = {"名字": "小明", "年龄": "36", "职业": "学生"}
    2 num["名字"] = "小红"
    3 print(num)# num = {"名字":"小明","年龄":"36","职业":"学生"}
    4 mun2 ={"性别":"男士"}
    5 num.update(mun2)
    6 print(num)#{'名字': '小红', '年龄': '36', '职业': '学生', '性别': '男士'} 可覆盖值

    num = {"名字": "小明", "年龄": "36", "职业": "学生"}
    # num.clear()#清空列表
    # print(num)#{}
    # del num["名字"]
    # print(num)#{'年龄': '36', '职业': '学生'}
    # num.pop("名字")#返回该键值对的值
    # print(num)#{'年龄': '36', '职业': '学生'} 返回该键值对的值
    a=num.popitem()#随机删除某组键值对,并以元组方式返回值
    print(num)#{'名字': '小明', '年龄': '36'}
    print(a)#('职业', '学生')

    字典的遍历

    dic = {'name': '小明', 'age': 18}
    
    for i in dic:
        print(i, dic[i])
    """输出为name 小明
    age 18"""
    
    for items in dic.items():
        print(items)
    """输出('name', '小明')
    ('age', 18)"""
    for keys, values in dic.items():
        print(keys, values)
    """输出为name 小明
    age 18
    """

    其他操作

    1 dic=dict.fromkeys(['host1','host2','host3'],'test')
    2 print(dic)#{'host3': 'test', 'host1': 'test', 'host2': 'test'}
    3 dic=dict.fromkeys(['host1','host2','host3'],['test1','tets2'])
    4 print(dic)#{'host2': ['test1', 'tets2'], 'host3': ['test1', 'tets2'], 'host1': ['test1', 'tets2']}
    5 dic['host2'][1]='test3'
    6 print(dic)#{'host3': ['test1', 'test3'], 'host2': ['test1', 'test3'], 'host1': ['test1', 'test3']}
    #sorted(dict) : 返回一个有序的包含字典所有key的列表
    dic={5:'555',2:'666',4:'444'}
    print(sorted(dic.items()))#输出[(2, '666'), (4, '444'), (5, '555')]

    四,字符串(string)

    字符串是以单引号'或双引号"括起来的任意文本,比如'abc'"123"等等。

    请注意,''""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有abc这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I'm,空格,OK这6个字符。

    字符串创建

    1 a = “1232 b = “abc”

    操作

     1 # 1   * 重复输出字符串
     2 print('hello'*2)
     3  
     4 # 2 [] ,[:] 通过索引获取字符串中字符,这里和列表的切片操作是相同的,具体内容见列表
     5 print('helloworld'[2:])
     6  
     7 # 3 in  成员运算符 - 如果字符串中包含给定的字符返回 True
     8 print('el' in 'hello')
     9  
    10 # 4 %   格式字符串
    11 print('alex is a good teacher')
    12 print('%s is a good teacher'%'alex')
    13  
    14  
    15 # 5 +   字符串拼接
    16 a='123'
    17 b='abc'
    18 c='789'
    19 d1=a+b+c
    20 print(d1)
    21 # +效率低,该用join 列表转换为字符串
    22 d2='>>'.join(["a","b","c"])23 print(d2)#a>>b>>c

    内置方法

     1 # string.capitalize()                                  把字符串的第一个字符大写
     2 # string.center(width)                                 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
     3 # string.count(str, beg=0, end=len(string))            返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
     4 # string.decode(encoding='UTF-8', errors='strict')     以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace'
     5 # string.encode(encoding='UTF-8', errors='strict')     以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'
     6 # string.endswith(obj, beg=0, end=len(string))         检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
     7 # string.expandtabs(tabsize=8)                         把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。
     8 # string.find(str, beg=0, end=len(string))             检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
     9 # string.index(str, beg=0, end=len(string))            跟find()方法一样,只不过如果str不在 string中会报一个异常.
    10 # string.isalnum()                                     如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
    11 # string.isalpha()                                     如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
    12 # string.isdecimal()                                   如果 string 只包含十进制数字则返回 True 否则返回 False.
    13 # string.isdigit()                                     如果 string 只包含数字则返回 True 否则返回 False.
    14 # string.islower()                                     如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
    15 # string.isnumeric()                                   如果 string 中只包含数字字符,则返回 True,否则返回 False
    16 # string.isspace()                                     如果 string 中只包含空格,则返回 True,否则返回 False.
    17 # string.istitle()                                     如果 string 是标题化的(见 title())则返回 True,否则返回 False
    18 # string.isupper()                                     如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
    19 # string.join(seq)                                     以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
    20 # string.ljust(width)                                  返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
    21 # string.lower()                                       转换 string 中所有大写字符为小写.
    22 # string.lstrip()                                      截掉 string 左边的空格
    23 # string.maketrans(intab, outtab])                     maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
    24 # max(str)                                             返回字符串 str 中最大的字母。
    25 # min(str)                                             返回字符串 str 中最小的字母。
    26 # string.partition(str)                                有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.
    27 # string.replace(str1, str2,  num=string.count(str1))  把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
    28 # string.rfind(str, beg=0,end=len(string) )            类似于 find()函数,不过是从右边开始查找.
    29 # string.rindex( str, beg=0,end=len(string))           类似于 index(),不过是从右边开始.
    30 # string.rjust(width)                                  返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
    31 # string.rpartition(str)                               类似于 partition()函数,不过是从右边开始查找.
    32 # string.rstrip()                                      删除 string 字符串末尾的空格.
    33 # string.split(str="", num=string.count(str))          以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串
    34 # string.splitlines(num=string.count('
    '))            按照行分隔,返回一个包含各行作为元素的列表,如果 num 指定则仅切片 num 个行.
    35 # string.startswith(obj, beg=0,end=len(string))        检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.
    36 # string.strip([obj])                                  在 string 上执行 lstrip()和 rstrip()
    37 # string.swapcase()                                    翻转 string 中的大小写
    38 # string.title()                                       返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
    39 # string.translate(str, del="")                        根据 str 给出的表(包含 256 个字符)转换 string 的字符,要过滤掉的字符放到 del 参数中
    40 # string.upper()                                       转换 string 中的小写字母为大写

    相对常用的内置

     1 #string.count(str, beg=0, end=len(string))            返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
     2 # string.center(width)                                 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
     3 # string.startswith(obj, beg=0,end=len(string))        检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.
     4 # string.find(str, beg=0, end=len(string))             检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
     5 # print(st.format(name='alex',age=37))  # 格式化输出的另一种方式   待定:?:{}
     6 # string.lower()                                       转换 string 中所有大写字符为小写.
     7 # string.upper()                                       转换 string 中的小写字母为大写
     8 # string.strip([obj])                                  在 string 上执行 lstrip()和 rstrip()
     9 # string.replace(str1, str2,  num=string.count(str1))  把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
    10 # string.split(str="", num=string.count(str))          以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串
     1 s = "name:xiao ming"
     2 # capitakize 首字母大写
     3 s1 = s.capitalize()
     4 print(s1)  # Name:xiao ming
     5 # upper 全部大写
     6 s2 = s.upper()
     7 print(s2)  # NAME:XIAO MING
     8 #lower 全部小写
     9 s3 = s.lower()
    10 print(s3)  # name:xiao ming
    11 #swapcase大小写翻转
    12 s4 = s.swapcase()
    13 print(s4)#NAME:XIAO MING
    14 # title 首字母大写
    15 s5 = s.title()
    16 print(s5)#Name:Xiao Ming
    17 # center 居中填充
    18 a = "wang"
    19 s6 = a.center(8,"*")
    20 print(s6)  # center
    21 # 公共方法
    22 s7 = len(s)
    23 print(s7)  # 14 查看元素的个数
    24 #以XXX开头 startswith
    25 b = 'alexWUsir'
    26 s8 = b.startswith('alex')#True
    27 s81 = b.startswith('e',2,5)#True,可以切片查找
    28 print(s8)
    29 print(s81)
    30 #find index 通过元素查看索引
    31 c = 'alexWUsir'
    32 s9 = c.find('a')
    33 s91 = c.index('a')
    34 print(s91,s9)  # find 通过元素找索引,找不到返回-1  index通过元素找索引,找不到报错
    35 #strip 删除前后空格
    36 d= " liming "
    37 s10 = d.strip()
    38 print(s10)  # liming  删除前面空格retrip lstrip
    39 #count 元素出现的次数
    40 s11 = d.count('li')
    41 print(s11)  # 1
    42 #字符串转列表 分割
    43 #split   str ---->list
    44 e  = 'alex wusir taibai'
    45 l = e.split()
    46 print(l)  # ['alex', 'wusir', 'taibai']
    47 
    48 #format的三种玩法 格式化输出
    49 q = '我叫{},今年{},爱好{},再说一下我叫{}'.format('小明',36,'读书','小明')
    50 print(q)
    51 q = '我叫{0},今年{1},爱好{2},再说一下我叫{0}'.format('小明',36,'小明') #注意要从0开始
    52 print(q)
    53 name = input('请输入名字:')
    54 q = '我叫{name},今年{age},爱好{hobby},再说一下我叫{name}'.format(age=18,name=name,hobby='girl')
    55 print(q)
    View Code

    五、集合

    集合的定义:

    集合是无序的,不重复的数据集合,集合本身不可哈希,里面的元素是可哈希的,所以无法做字典里的键

    集合的作用:

    去重,把一个列表变成集合,就自动去重了。

    关系测试,测试两组数据之前的交集、差集、并集等关系。

    1、集合的创建。

    1 set1 = set((1,2,3,4))
    2 set2 = {1,2,3,4}
    3 print(set1,set2)  # {1, 2, 3, 4} {1, 2, 3, 4}
    4 print(type(set1),type(set2))  # <class 'set'> <class 'set'>

    2、集合的增。

    1 set1 = {1, 2, 3, 4, 5}
    2 set1.add("sb")  # {1, 2, 3, 4, 5, 'sb'}
    3 print(set1)
    4 set1.update("ad")
    5 print(set1) # {1, 2, 3, 4, 5, 'a', '

    3、集合的删

    1 set1 = {1, 2, 3, 4, 5,6,7,8,8,9,10}
    2 set1.pop()  # pop 随机删除
    3 print(set1)
    4 set2 = {1, 2, 3, 4, 5,6,7,8,8,9,10}
    5 set2.remove(5)
    6 print(set2) # {1, 2, 3, 4, 6, 7, 8, 9, 10}

    4、集合的查

    set1 = {1, 2, 3, 4, 5,6,7,8,8,9,10}
    for i in set1:
        print(i)  # 只能for循环查

    5、集合的其他操作

      5.1、交集(&  或者 intersection)

    1 set1 = {1, 2, 3, 4, 5}
    2 set2 = {1, 2, 3, 4, 6, 7, 8}
    3 print(set1 & set2)  # {1, 2, 3, 4}
    4 print(set1.intersection(set2))  # {1, 2, 3, 4}

      5.2 并集。(| 或者 union)

    1 #两个集合合并到一起
    2 set1 = {1,2,3,4,5}
    3 set2 = {4,5,6,7,8}
    4 print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7}
    5 print(set2.union(set1))  # {1, 2, 3, 4, 5, 6, 7}

      5.3 差集。(- 或者 difference)

    1 #取出set1中set2不包含的数
    2 set1 = {1,2,3,4,5}
    3 set2 = {4,5,6,7,8}
    4 print(set1 - set2)  # {1, 2, 3}
    5 print(set1.difference(set2))  # {1, 2, 3}}
      5.4反交集。 (^ 或者 symmetric_difference)
    1 #取出相互不包含的数
    2 set1 = {1,2,3,4,5}
    3 set2 = {4,5,6,7,8}
    4 print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
    5 print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8} 

      5.5子集与超集

    1 set1 = {1,2,3}
    2 set2 = {1,2,3,4,5,6}
    3 
    4 print(set1 < set2)  # True
    5 print(set1.issubset(set2))  # True 这两个相同,都是说明set1是set2子集。
    6 
    7 print(set2 > set1)  # True
    8 print(set2.issuperset(set1))  # True 这两个相同,都是说明set2是set1超集。

    六、深浅(copy)

    浅copy

     1 # 对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
     2 l1 = [1, 2, 3, ['a', 'b']]
     3 l2 = l1.copy()
     4 
     5 print(l1, id(l1))  # [1, 2, 3, ['a', 'b']] 30171784
     6 print(l2, id(l2))  # [1, 2, 3, ['a', 'b']] 31195656
     7 
     8 l1[1] = 222
     9 print(l1, id(l1))  # [1, 222, 3, ['a', 'b']] 30171784
    10 print(l2, id(l2))  # [1, 2, 3, ['a', 'b']] 31195656
    11 
    12 l1[3][0] = 'c'
    13 print(l1, id(l1[3]))  # [1, 222, 3, ['c', 'b']] 30171720
    14 print(l2, id(l2[3]))  # [1, 2, 3, ['c', 'b']] 30171720

    深deepcopy

     1 #对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
     2 import copy
     3 l1 = [1,2,3,['a','b']]
     4 l2 = copy.deepcopy(l1)
     5 
     6 print(l1,id(l1))  # [1, 2, 3, ['a', 'b']] 35356232
     7 print(l2,id(l2))  # [1, 2, 3, ['a', 'b']] 35354888
     8 
     9 l1[1] = 222
    10 print(l1,id(l1))  # [1, 222, 3, ['a', 'b']] 35356232
    11 print(l2,id(l2))  # [1, 2, 3, ['a', 'b']] 35354888
    12 
    13 l1[3][0] = 'c'
    14 print(l1,id(l1[3]))  # [1, 222, 3, ['c', 'b']] 35578376
    15 print(l2,id(l2[3]))  # [1, 2, 3, ['a', 'b']] 35578696

    七、编码于解码

    ascii

    表示英文:八位一个字节(如00000001)

    unicode

    表示英文和表示英文一致为:三十二位四个字节(如00000000 00000001 00000010 00000100)

    UTF-8

    表示英文:八位一个字节(如00000001)

    表示中文:二十四位三个字节(如00000001 00000010 00000110)

    gbk:

    表示英文:八位一个字节(如00000001)

    表示中文:十六位两个字节(如00000010 00000110)

    性质:

    1,各个编码之间的二进制,是不能互相识别的,会产生乱码。

    2,文件的储存,传输,不能是unicode(只能是utf-8 utf-16 gbk,gb2312,asciid等)

    py3:
        str 在内存中是用unicode编码。
            bytes类型
            对于英文:
                 str  :表现形式:s = 'alex'
                        编码方式: 010101010  unicode
                bytes :表现形式:s = b'alex'
                        编码方式: 000101010  utf-8 gbk。。。。

            对于中文:
                 str  :表现形式:s = '中国'
                        编码方式: 010101010  unicode
                bytes :表现形式:s = b'xe91e91e01e21e31e32'
                        编码方式: 000101010  utf-8 gbk。。。。

    encode 编码

    1 #将str --> bytes, ()
    2 s1 = 'a'
    3 s11 = s1.encode('utf-8')
    4 s11 = s1.encode('gbk')
    5 print(s11)
    6 s2 = '中国'
    7 s22 = s2.encode('utf-8')
    8 # s22 = s2.encode('gbk')
    9 print(s22)

    decode 解码

    #str --->byte  encode 编码
    s = "中国"
    b = s.encode('utf-8')
    print(b)
    #byte --->str decode 解码
    s1 = b.decode('utf-8')
    print(s1)
    
    
    s = 'abf'
    b = s.encode('utf-8')
    print(b)
    # --->str decode 解码
    s1 = b.decode #byte('gbk')
    print(s1)

    练习三级菜单

    缺点:重复代码较多

     1 zone = {
     2     '山东' : {
     3         '青岛' : ['四方','黄岛','崂山','李沧','城阳'],
     4         '济南' : ['历城','槐荫','高新','长青','章丘'],
     5         '烟台' : ['龙口','莱山','牟平','蓬莱','招远']
     6     },
     7     '江苏' : {
     8         '苏州' : ['沧浪','相城','平江','吴中','昆山'],
     9         '南京' : ['白下','秦淮','浦口','栖霞','江宁'],
    10         '无锡' : ['崇安','南长','北塘','锡山','江阴']
    11     },
    12     '浙江' : {
    13         '杭州' : ['西湖','江干','下城','上城','滨江'],
    14         '宁波' : ['海曙','江东','江北','镇海','余姚'],
    15         '温州' : ['鹿城','龙湾','乐清','瑞安','永嘉']
    16     },
    17     '安徽' : {
    18         '合肥' : ['蜀山','庐阳','包河','经开','新站'],
    19         '芜湖' : ['镜湖','鸠江','无为','三山','南陵'],
    20         '蚌埠' : ['蚌山','龙子湖','淮上','怀远','固镇']
    21     },
    22     '广东' : {
    23         '深圳' : ['罗湖','福田','南山','宝安','布吉'],
    24         '广州' : ['天河','珠海','越秀','白云','黄埔'],
    25         '东莞' : ['莞城','长安','虎门','万江','大朗']
    26     }
    27 }
    28 LB = []
    29 while True:
    30     for i in zone:
    31         print(i) #打印省级菜单
    32     choice = input(">>>(输入b退出程序)")
    33     if choice in zone:#判断输入合法
    34         LB.append(choice) # 如果合法将数值加入列表
    35         while True:#将数值停留在第二层
    36             for k in zone[choice]:print(k) #打印市级菜单
    37             choice2 = input(">>>(输入q返回上一层,输入b退出程序) ")
    38             if choice2 in zone[choice]:#判断输入合法
    39                 LB.append(choice2)# 如果合法将数值加入列表
    40                 while True:
    41                     for v in zone[choice][choice2]:print(v)
    42                     choice3 = input(">>>(输入q返回上一层,输入b退出程序)")
    43                     if choice3 in zone[choice][choice2]:#判断输入合法
    44                         LB.append(choice3)# 如果合法将数值加入列表
    45                         print(LB) #打印列表
    46                         exit("结束")
    47                     elif choice3 == "q":
    48                         LB.pop()  #返回上一层时删除列表中的最后一个数值
    49                         break
    50                     elif choice3 == "b":exit(" 结束")
    51             elif choice2 == "q":
    52                     LB.pop()
    53                     break
    54             elif choice2 == "b":exit(" 结束")
    55     elif choice == "b":exit(" 结束")
    View Code

    有问题待解决

    1:最后打印列表问题

    2:最后一层输入完后会报错

    3:返回到第一层会报错

     1 zone = {
     2     '山东' : {
     3         '青岛' : ['四方','黄岛','崂山','李沧','城阳'],
     4         '济南' : ['历城','槐荫','高新','长青','章丘'],
     5         '烟台' : ['龙口','莱山','牟平','蓬莱','招远']
     6     },
     7     '江苏' : {
     8         '苏州' : ['沧浪','相城','平江','吴中','昆山'],
     9         '南京' : ['白下','秦淮','浦口','栖霞','江宁'],
    10         '无锡' : ['崇安','南长','北塘','锡山','江阴']
    11     },
    12     '浙江' : {
    13         '杭州' : ['西湖','江干','下城','上城','滨江'],
    14         '宁波' : ['海曙','江东','江北','镇海','余姚'],
    15         '温州' : ['鹿城','龙湾','乐清','瑞安','永嘉']
    16     },
    17     '安徽' : {
    18         '合肥' : ['蜀山','庐阳','包河','经开','新站'],
    19         '芜湖' : ['镜湖','鸠江','无为','三山','南陵'],
    20         '蚌埠' : ['蚌山','龙子湖','淮上','怀远','固镇']
    21     },
    22     '广东' : {
    23         '深圳' : ['罗湖','福田','南山','宝安','布吉'],
    24         '广州' : ['天河','珠海','越秀','白云','黄埔'],
    25         '东莞' : ['莞城','长安','虎门','万江','大朗']
    26     }
    27 }
    28 num = zone
    29 LB = []
    30 while True:
    31     for a in num:
    32         print(a)
    33     choice=input("<<<(输入q返回上一层:输出b退出)")
    34     if choice in num:
    35         LB.append(num)
    36         num = num[choice]
    37     elif choice == "q": num = LB.pop()
    38     elif choice == "b":
    39         exit("结束")
    40     else:
    41         print("请从新输入")
    View Code
  • 相关阅读:
    python种的builtin函数详解第三篇 C
    python中的buildin函数详解(第一篇) C
    python中的formatter的详细用法 C
    python中的builtin函数详解第二篇 C
    python中函数的默认参数陷阱问题 C
    介绍C++11标准的变长参数模板
    猜数字
    父类和子类
    矩形的面积
    水果类
  • 原文地址:https://www.cnblogs.com/zxq520921/p/9255709.html
Copyright © 2011-2022 走看看