数据类型

(一)概述

  本篇文章主要对基础的数据类型继续进行介绍,介绍主要分以下几个部分:

  1. 格式化输出
  2. 初识运算符
  3. 编码的初识
  4. 基础数据类型之int、bool
  5. 基础数据类型之str
  6. for循环
  7. 基础数据类型之list
  8. 基础数据类型之tuple
  9. 基础数据类型之dic
  10. 基础数据类型之可能遇到的坑

(二)内容详解

      1.格式化输出

  • 格式化输出的形式:%+数据类型
  • 数据类型包括 s:字符串 d:整数 f:浮点型 r:内置函数
  • 格式化输出的三种形式:
    • 形式1:采用手动输入的方式进行格式化输出
    • name = input('请输入你的姓名:')
      age = input('请输入你的年龄:')
      job = input('请输入你的工作:')
      hobbly = input('请输入你的爱好:')
      msg = '''
      ----------info of %s------------
      Name:%s
      Age:%d
      Job:%s
      Hobbly:%s
      -----------end------------------
      ''' % (name, name, int(age), job, hobbly)
      print(msg)

       

    • 形式2:通过字典自动匹配输出,可以只选择字典中的部分进行输出
    • dic = {'name': '马玉刚', 'age': 31, 'job': 'IT', 'hobbly': '篮球', 'sex': ''}
      msg = '''
      ------------info of %(name)s-------------
      Name:%(name)s
      Job:%(job)s
      Hobbly:%(hobbly)s
      Age:%(age)s
      --------------end--------------------------
      ''' % dic #%dic 不能忘记,此处是通过key与字典进行关联。
      print(msg)

       

    • 形式3:通过format进行格式化输出
    • res = '{} {} {}'.format('egon', 18, 'male')
      print(res)
      res = '{1} {2} {1}'.format('egon', 18, 'male')   # 根据指定的索引进行格式化输出
      print(res)
      res = '{name} {age} {sex}'.format(sex='male', name='egon', age=18)
      print(res)

       

  • 注意:在格式化输出时,如果只是单纯的表示%,要写成%%。
  • msg = '我叫%s,今年%d,学习进度为5%%' % ('马玉刚', 31)
    print(msg)

     

      2.初识运算符

  • 运算符的分类包括算数运算符、比较运算符、逻辑运算符、成员运算符等。
  • # -*- encoding:utf-8 -*-
    
    '''算数运算:+ - * / % ** //'''
    # a = 10
    # b = 3
    # print(a % b)  # 求a除以b的余数,通常用于除以2来判断数字的奇偶性
    # print(a ** b)  # a的b次幂
    # print(a // b)  # a除以b的商
    
    '''比较运算:== != > < >= <='''
    # 比较运算输出的是bool值
    # print(3 != 2)  # True
    
    '''逻辑运算 not and or'''
    #优先级顺序,从高到低:()not and or
    #同一优先级,从左到右依次执行
    
    # 1、逻辑运算两边都是比较:根据优先级进行计算,输出的值为bool值。
    print(3 > 2 and 3 < 4 or 5 > 6 and 2 < 5)  # True
    print(1 > 1 and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6)  # False
    print(True or False)  # True
    
    # 2、逻辑运算两边都是数字
    x or y,if x is True,return x,else retuen y.
    x and y,if x is True,return y,else return x.
    print(1 or 3)  # 1
    print(100 or 3)  # 100
    print(-10 or 3)  # -10
    print(0 or 3)  # 3
    print(1 and 3 or 4)  # 3
    print(0 and 3 or 5)  # 5
    
    #补充 int<->bool间的转换
    int---->bool:非0即True
    print(bool(100))  # True
    bool--->int True 1,False 0
    print(int(True)) # 1
    print(int(False)) # 0
    
    # 3、逻辑运算两边是数字或者是比较
    print(1 and 4 < 6 or 5) # True  # 逻辑运算符优先于比较运算符
    
    '''成员运算:判断某些元素在不在一个序列中 str tuple list dict set'''
    in not in
    
    s1 = 'ab'
    s11 = 'ak'
    s2 = 'abkcdcekengeh'
    print(s1 in s2)  # True
    print(s11 in s2) # False
    
    #示例:作业题会应用到一下示例,即用户输入一个内容,判断输入的内容是否在序列中。
    content = input('请输入你需要购买的商品:')
    s1 = {'01':'苹果手机','02':'小米耳机','03':'三星手机'}
    if content in s1.keys():
        print('恭喜您,您购买的货品充足')
    else:
        print('抱歉,您购买的货物不存在,请您重新输入,谢谢!')

      3.编码的初识

  • 目前,公认的有4种编码方式即ASCII编码、Unincode编码、UTF-8编码、GBK编码。
  • 01  ASCII编码方式:美国根据美国的26个字符和其他字符的需求定义的一套编码方式,只能表示256个字符,其中一个字符用一个字节表示。
        8bit == 1bytes
        bit - 位
        bytes - 字节
        0000 0001 共计256种可能,代表256个不同的字符。
        举例:ABC用ASCII编码方式如下:
        A -  01000001
        B -  01000010
        C -  01000011
        所以ABC的编码输出为:010000010100001001000011
        'hello':5个字节。
        缺点:代表的字符有限,无法涵盖其他国家的字符。
    02  Unicode编码方式:又称万国码,将世界所有国家的文字都涵盖。
        起初;16位,即两个字节表示一个字符。举例如下(示意):
            a: 01000001 01000001
            中:01000101 01000001
        升级:32位,即用4个字节表示一个字符。举例如下(示意):
            a: 01000001 01000001 01000101 01000001
            中:01000101 01000001 01000101 01000001
        缺点:浪费资源和空间。
    03  Utf-8编码方式:最少用8位,即一个字节表示一个字符,根据每个国家的字符的实际个数用不同的字节数显示,举例如下(示意):
               a:01000001 (一个字节)
        欧洲文字:01000001 01000001 (两个字节)
        亚洲  中:01000001 01000001 01000001 (三个字节)
        说明:由于节省资源和空间,所以,通常在编码的时候采用utf-8的编码方式进行编码。
    04  GBK的编码方式:即国标,只包含ASCII编码和中文,举例如下(示意):
          a:01000001 (一个字节)
         中:01000001 01000001 (两个字节)
  • 单位转换公式
  •     8bit == 1bytes
        1024bytes == 1kb
        1024kb == 1MB
        1024MB == 1GB
        1024GB == 1TB
        1024TB == 1PB

 

  4.基础数据类型之int、bool

  • '''01 int'''
    # bit_length():计算10进制转化成为二进制的有效位数
    i = 10
    i1 = 6
    print(i.bit_length(), i1.bit_length())
    
    '''示例如下:
    十进制       二进制
      1        0000 0001
      3        0000 0011
      6        0000 0110
    '''
    
    '''02 bool'''
    
    # str--->bool:非空即True
    s1 = 'Alex'
    s2 = ' '
    s3 = ''
    print(bool(s1))  # True
    print(bool(s2))  # True
    print(bool(s3))  # False

 

      5.基础数据类型之str

  • 字符串数据类型主要是切片、索引以及15种有关字符串运算的方法
  • # -*- encoding:utf-8 -*-
    '''索引'''
    s = 'python24期'
    # 索引:字符串中每个字符都有一个索引,索引从左至右计数,并且从0开始计数。
    s1 = s[0]
    print(s1, type(s1)) # p <class 'str'>
    print(s, s1) # python24期 p
    s2 = s[8]
    s3 = s[-1]  # 索引为‘-1’指的是字符串的最后一个字符的索引。
    print(s2)  #
    print(s3)  #
    # 结论:对字符串操作都会形成新的字符串,与原来的字符串无关
    
    '''切片'''
    # 切片的原则:顾头不顾尾,即相当于输出的切片实际长度为'结束索引-1'
    # 切片方法:s[起始索引:'结束索引+1':步长],如果结束索引为"-1",则方法中的加1变成减1,即从左往右数'+1',从右往左数'-1'.
    # 省略说明:起始索引可以省略,默认为0;步长可以省略,默认为1;起始索引、结束索引和步长都可以省略,直接打印整个字符串。
    s = 'python24期'
    print(s[:2]) # py
    print(s[:])  # python24期
    print(s[:6:2])  # pto
    print(s[-1:-4:-1])  # 期42,如果是从右往左,一定要加上步长,并且步长是负数,比如'-1'
    
    '''字符串常用的方法'''
    
    # 方法1:capitalize() 首字母大写,其他字母小写  *
    s = 'oldBoy'
    print(s.capitalize())  # Oldboy
    
    # 方法2:swapcase() 大小写反转 *
    s = 'oldBoy'
    print(s.swapcase())  # OLDbOY
    
    # 方法3:center 居中 设置宽度 *
    s = 'oldBoy'
    print(s.center(20, '-'))  # 20是指整个输出字符的长度,'-'用于填充空白区域。
    
    # 方法4:title() 非字母隔开的'单词'首字母大写 *
    s = 'alex wusir2taibai*ritian'
    print(s.title()) # Alex Wusir2Taibai*Ritian
    
    # 方法5:upper() 全大写    **
    s = 'oldBoy'
    print(s.upper())    # OLDBOY
    
    # 方法6:lower() 全小写    **
    s = 'oldBoy'
    print(s.lower())     # oldboy
    
    '''举例:通过校验验证码进行模拟验证登录'''
    usrname = input('请输入用户名:')
    password = int(input('请输入密码:'))  # 如果密码定义的数字,需要进行一下字符串与数字的转换,因为input的输入的字符串类型
    your_code = input('请输入正确的验证码:')
    code = 'abcdeFgh'
    if usrname == '马玉刚' and password == 123456:
        if your_code.upper() == code.upper():
            print('登录成功')
    
    username = input('请输入账号:')
    password = input('请输入密码:')
    code = 'QerAg'.upper()
    your_code = input('请输入验证码:').upper() # QERAG,Qerag.....
    if username == 'alex' and password == 'SB':
        if your_code == code:
            print('登录成功')
    
    # 方法7:startswith() 判断以什么开头  **
    s = 'oldBoy'
    print(s.startswith('o'))  # True
    print(s.startswith('old'))  # True
    
    # 方法8:endswith() 判断以什么结尾 **
    s = 'oldBoy'
    print(s.endswith('B'))  # False
    print(s.endswith('y'))  # True
    print(s.endswith('B',0,4))  # 索引0-4进行切片,切片后进行判断。
    
    # 方法9:strip() 默认去除str前后两端换行符(\n),制表符(\t)-相当于tab,空格。***
    s = '   \noldBoy\t'
    print(s.strip())   # oldBoy
    print(s.lstrip())  #  只去除左边的空格
    print(s.rsplit())   # 只去除右边的制表符
    
    '''strip()方法示例:由于在输入用户名和密码有时会带有换行符和制表符,所以在登录验证的时候利用该方法可以自动去除换行符合制表符'''
    usrname = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    if usrname == '马玉刚'and password == '123456':
        print('恭喜你,登录成功!')
    # 方法10:split()  将str转换为list,默认是按照空格进行分割,也可以进行指定分割符号 ***
    s = 'alex wusir barry'
    s1 = 'alex,wusir,barry'
    s2 = ',alex,wusir,barry,'
    print(s.split())
    print(s1.split(','))  # 指定分割符号为',',实际分割的个数:“字符串中分割符号总数+1”  #['alex', 'wusir', 'barry']
    print(s2.split(','))  # 指定分割符号为',',实际分割的个数:“字符串中分割符号总数+1”  #['', 'alex', 'wusir', 'barry', '']
    print(s2.split(','))  # 指定分割符号为',',实际分割的个数:“字符串中分割符号总数+1”  #['', 'alex', 'wusir', 'barry', '']
    
    # 方法11:join:将字符串中的字符间用指定的字符进行两两连接,用途之一是将list转换为str ***
    s = 'oldBoy'
    print('_'.join(s))
    print('Alex'.join(s))
    
    list-->str:将list转换为str
    l1 = ['alex', 'wusir', 'barry']
    s = ''.join(l1)
    s1 = ' '.join(l1)
    print(s)  # alexwusirbarry
    print(s1)  # alex wusir barry
    
    # 方法12: replace:将字符串中的某个元素进行替换,如果不指定次数替换字符串中所有的该元素,如果指定次数,则按照指定次数进行替换***
    s = 'alex,alex, wusir, barry'
    print(s.replace('alex', '太白'))  # 太白,太白, wusir, barry
    print(s.replace('alex', '太白', 1))  # 太白,alex, wusir, barry
    
    # 方法13:is 系列 ***
    age = '31'
    print(age.isalnum()) #字符串由字母或数字组成
    print(age.isalpha()) #字符串只由字母组成
    print(age.isdigit()) #字符串只由数字组成 str ---> int 可以作为一个判断条件  ***
    
    # 方法14:find:通过元素找索引,找不到返回为 -1  ***
    s = 'oldBoy'
    print(s.find('d'))   # 2
    print(s.find('A'))  # 可切片  -1
    
    # 方法15:index:通过元素找索引,找不到报错  ***
    s = 'oldBoy'
    print(s.index('d'))  # 2
    print(s.inedex('A'))  # 报错
    
    # 公共方法  ***
    # len:统计元素的总个数
    s = 'fjsdaklfjsdklafjsadf'
    print(len(s))
    # count:测试某个元素出现的个数
    s = 'fjsdaklfjsdklafjsadf'
    print(s.count('s'))

  6.for循环

  • # 形式:for 变量 in iterable:
    # 输出:输出的元素个数为字符串s的个数。
    # 说明:只要循环被break打断,则不执行else程序。
    s = 'fdksj'
    for i in s:
        print(i+'Alex')  # 依次与'Alex拼接'之后打印输出,输出的元素个数为字符串s的个数
    
    #只要循环被break打断,则不执行else程序,否则循环执行完成后,执行else语句。
    s = 'fdksj'
    for i in s:
        print(i)
        if i == 'f':
            break
    else:
        print(666)

       7.基础数据类型之list

  • # -*- encoding:utf-8 -*-
    
    '''列表的说明:
    01 list可以存储各种数据类型,同时支持存储大量的数据。# li = ['alex', 123, True, (1, 2, 3, 'wusir'), [1, 2, 3, '小明', ], {'name': 'alex'}]
    02 list是有序的,有索引值,可切片,便于取值。
    '''
    
    
    
    '''01 索引的的切片(与字符串完全一样)'''
    l1 = ['alex', 'wusir', '太白', 100, '女神']
    print(l1[0], type(l1[0]))    # alex <class 'str'>
    print(l1[-2], type(l1[-2]))    # 100 <class 'int'>
    print(l1[:2])  #  ['alex', 'wusir']
    
    '''02 列表的新增:增加有3种方式,即append insert extend'''
    
    # append 追加:直接在列表的最后面添加新增的元素即可
    l1 = ['alex', 'wusir', 'wusir', 'wusir','太白', 100, '女神']
    print(l1.append('文刚')) # 追加过程无输出
    print(l1) # ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神', '文刚']
    
    # insert 插入:根据指定的索引进行插入
    l1 = ['alex', 'wusir', 'wusir', 'wusir','太白', 100, '女神']
    l1.insert(1, 'oldBoy')  # 1是指列表的索引
    print(l1)
    
    # extend 迭代的追加:
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l1.extend('abd')
    print(l1)  # ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神', 'a', 'b', 'd']
    l2 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l2.extend(['abc', 'erf'])
    print(l2)  # ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神', 'abc', 'erf']
    
    '''03 删除的4种方法:即pop remove clear del'''
    pop:根据指定的索引进行删除。
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    ret = l1.pop(1)
    print(ret)  # wusir
    print(l1) #  ['alex', 'wusir', 'wusir', '太白', 100, '女神']
    
    # remove:根据指定的元素值进行删除
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l1.remove(100)
    print(l1)  # ['alex', 'wusir', 'wusir', 'wusir', '太白', '女神']
    
    #clear:直接清空整个列表
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l1.clear()
    print(l1)  # []
    
    # del:根据索引、切片(步长)两种方式进行删除
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    del l1[0]
    print(l1)  # ['wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l2 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    del l2[::2]
    print(l2)  # ['wusir', 'wusir', 100]
    
    '''04 列表修改的2种方法:即按照索引直接修改、按照切片直接修改'''
    # 直接按照索引进行替换
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l1[1] = 'SB'
    print(l1)  # ['alex', 'SB', 'wusir', 'wusir', '太白', 100, '女神']
    # 直接按照切片进行修改
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l1[:2] = 'abcdcegef'
    print(l1)  # ['a', 'b', 'c', 'd', 'c', 'e', 'g', 'e', 'f', 'wusir', 'wusir', '太白', 100, '女神']
    
    # 加上步长一定要一一对应。
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l1[::2] = 'abcd'  # 由于需要替换4个,所以,如果将abcd修改为abc会报错。
    print(l1)  # ['a', 'wusir', 'b', 'wusir', 'c', 100, 'd']
    
    '''05 列表的查询:根据索引、切片、切片(步长)进行查询'''
    # 通过for循环,将列表中的所有元素按照列进行展示
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    for i in l1:
        print(i)  # 按照列的方式,展示每个元素。
    通过索引进行查询
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    print(l1[5])  # 100
    通过切片进行查询(顾头不顾尾)
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    print(l1[:5])  # ['alex', 'wusir', 'wusir', 'wusir', '太白']
    通过切片(步长)的方式进行查询
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    print(l1[0:6:3])   # ['alex', 'wusir']
    
    '''06 index:通过元素查询索引'''
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    print(l1.index('alex'))  # 0
    print(l1.index('wusir'))  # 1 针对多个相同元素的列表,通过index查询索引时,只要查询到一个即停止查询,并将索引值返回。
    
    '''07 sort:从小到大排序:通常只是针对整形的列表使用'''
    l1 = [1, 10, 8, 6, 9, 2, 5, 4, 3]
    l1.sort()  # 对l1进行从小到大排序
    print(l1)  # [1, 2, 3, 4, 5, 6, 8, 9, 10]
    l1.sort(reverse = True)  # 对l1进行从大到小的排序
    print(l1)  # [10, 9, 8, 6, 5, 4, 3, 2, 1]
    
    '''08 reverse:将列表顺序反转'''
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    l1.reverse()
    print(l1)   # ['女神', 100, '太白', 'wusir', 'wusir', 'wusir', 'alex']
    
    '''09 len:统计列表的长度'''
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    print(len(l1))  # 7
    
    '''10 count:统计列表中某个元素的个数'''
    l1 = ['alex', 'wusir', 'wusir', 'wusir', '太白', 100, '女神']
    print(l1.count('wusir'))  # 3
    
    '''11 列表的嵌套:对列表中嵌套的列表、字典等进行操作'''
    
    # 将列表中的'wusir'全部大写
    l1 = ['alex', 'wusir', [1, 'taibai']]
    l1[1] = l1[1].upper()
    print(l1)  # ['alex', 'WUSIR', [1, 'taibai']]
    
    # 将列表中的'taibai'的首字母大写
    l1 = ['alex', 'wusir', [1, 'taibai']]
    l1[2][1] = l1[2][1].capitalize()
    print(l1)  # ['alex', 'wusir', [1, 'Taibai']]
    
    '''12 range的使用:range可以看做自定义的数字范围列表,一般都是与for循环结合,也遵循"顾头不顾尾"的原则。'''
    for i in  range (1,10):
        print(i)
    for i in range(1,20,2):
        print(i)
    
    for i in range(20, 1, -1):
        print(i)
    # 利用for循环打印出列表的索引
    l1 = ['alex', 'wusir', 'wusir', 100, '女神']
    
    for i in l1:
        print(l1.index(i))
        
    # 利用for range 打印出列表的索引。
    l1 = ['alex', 'wusir', 'wusir', 100, '女神']
    print(len(l1))
    for i in range(len(l1)):
        print(i)

      8.基础数据类型之tuple

  • '''
    01 元组是只读列表。
    02 可以索引,可以切片(步长)。
    03 不能增删改(儿子不能,孙子有可能),只能查询。
    04 index, count, for 循环。
    '''
     # 根据索引进行查询
    tu = (1, True, [12, 3], 'afdlsfa')
    print(tu[2])  # [12, 3]
    
     # 根据切片(步长)进行查询
    tu = (1, True, [12, 3], 'afdlsfa')
    print(tu[::2])  # (1, [12, 3])
    
    # len:查询元祖的元素个数
    tu = (1, True, [12, 3], 'afdlsfa')
    print(len(tu))  # 4
    
    # count:查询元祖中某个元素的个数
    tu = (0, False, True, [12, 3], 'afdlsfa')
    print(tu.count(True))   # 1
    
    # for循环打印元祖的所有元素
    tu = (0, False, True, [12, 3], 'afdlsfa')
    for i in tu:
        print(i)
    # for和range配合打印出元祖的所有索引。
    tu = (0, False, True, [12, 3], 'afdlsfa')
    for i in range(len(tu)):
        print(i)
    
    # index:根据索引查询元祖中的索引
    tu = (0, False, True, [12, 3], 'afdlsfa')
    print(tu.index([12, 3]))

      9.基础数据类型之dic

  • '''字典整体说明:
    01 键值对出现,即key:value。
    02 key是唯一的不能重复的。
    03 可以存储大量的关系型数据。
    04 字典的3.5以及3.5以下的版本中元素是无序的,3.6之后字典是有序的,但是没有索引,只是依据字典建立的顺序进行有序存储。
    05 字典的key:int str bool tuple ,其中bool和tuple不常用。
    06 字典的key是不可变的数据类型(可哈希)。
    07 字典的value:可以是任意数据类型。
    '''
    
    '''01 字典的新增'''
    # 按照键值对增加,有则改之,无则增加
    dic = {'name': 'TaiBai', 'age': 25, 'sex': '',}
    dic['job'] = 'IT'
    print(dic)
    dic['name'] = '马玉刚'
    print(dic)
    
    # setdefault:无则添加,有则不变
    dic = {'name': 'TaiBai', 'age': 25, 'sex': ''}
    dic.setdefault('job')
    print(dic)  #  无则增加  {'name': 'TaiBai', 'age': 25, 'sex': '男', 'job': None}
    dic.setdefault('job', 'IT')  #  有则不变   {'name': 'TaiBai', 'age': 25, 'sex': '男', 'job': None}
    print(dic)
    
    dic1 = {'name': 'TaiBai', 'age': 25, 'sex': ''}
    dic1.setdefault('job', 'IT')
    print(dic1)  # {'name': 'TaiBai', 'age': 25, 'sex': '男', 'job': 'IT'}
    
    '''02 字典的删除 '''
    # pop:按照key进行删除。
    dic = {'name': 'TaiBai', 'age': 25, 'sex': ''}
    ret = dic.pop('name')
    print(ret)  # 返回的是删除的值 TaiBai
    print(dic)  # {'age': 25, 'sex': '男'}
    
    # clear:清空整个字典表。
    dic = {'name': 'TaiBai', 'age': 25, 'sex': ''}
    dic.clear()
    print(dic)  # {}
    
    # del:按照key进行删除。
    dic = {'name': 'TaiBai', 'age': 25, 'sex': ''}
    del dic['name']
    print(dic)   # {'age': 25, 'sex': '男'}
    
    '''03 字典的改'''
    # 按照key直接修改
    dic = {'name': 'TaiBai', 'age': 25, 'sex': ''}
    dic['name'] = '马玉刚'
    print(dic)  # {'name': '马玉刚', 'age': 25, 'sex': '男'}
    
    # update:无则添加,有则更新
    dic = {"name": "jin", "age": 18, "sex": "male"}
    dic2 = {"name": "alex", "weight": 75}
    dic2.update(dic)  # 将dic 的所有键值对覆盖并添加到dic2中。dic不变。
    print(dic)  # {'name': 'jin', 'age': 18, 'sex': 'male'}
    print(dic2)  # {'name': 'jin', 'weight': 75, 'age': 18, 'sex': 'male'}
    
    '''04 字典的查询'''
    # 按照key进行查询
    dic = {"name": "jin", "age": 18, "sex": "male"}
    print(dic['name'])  # jin
    print(dic['name1'])  # 报错
    
    # get:根据关键字进行查询
    dic = {"name": "jin", "age": 18, "sex": "male"}
    print(dic.get('name'))  # jin
    print(dic.get('name1'))  # None
    print(dic.get('name1', '没有此键'))  # 没有此键:如果没有key,返回值可以自定义,默认返回为None
    
    '''05 for循环'''
    dic = {"name": "jin", "age": 18, "sex": "male"}
    print(dic.keys())
    for i in dic.keys():
        print(i)
    
    print(list(dic.keys()))  # ['name', 'age', 'sex']
    print(dic.values())  # dict_values(['jin', 18, 'male'])
    print(dic.items())  # dict_items([('name', 'jin'), ('age', 18), ('sex', 'male')])
    
    a, b, c = 1, 2, 3
    a, b, c = [1, 2, 3]
    print(a, b, c)
    
    # 两值互换
    a = 10
    b = 100
    a, b = b, a
    print(a, b)
    
    # 依次打印字典的key和value
    dic = {"name": "jin", "age": 18, "sex": "male"}
    for k, v in dic.items():
        print(k, v)
    
    '''06 dict的嵌套'''
    dic = {'name': 'alex',
           'name_list': ['wusir', 'taibai'],
           1: {'name': '日天'}}
    
    # 将wusir全部变成大写
    print(dic['name_list'][0])
    dic['name_list'][0] = dic['name_list'][0].upper()
    print(dic)
    
    # 将日天 改成 泰迪。
    dic[1]['name'] = '泰迪'
    print(dic)

      10.基础数据类型之可能遇到的坑

  • '''整体说明:
    01 tuple元组中如果只有一个元素没有逗号,则他不是元祖而是该元素对应的类型;有逗号则说明是tuple元祖类型。
    02  在 正向 循环一个list中,如果改变的列表的大小,若用for循环,则采用逆向倒序删除的方式进行删除。
    03 在循环一个字典时,不能改变该字典的大小,但是在不循环字典的时候可以改变字典的大小。
    '''
    
    # 01 tuple元组中如果只有一个元素没有逗号,则他不是元祖而是该元素对应的类型;有逗号则说明是tuple元祖类型。
    tu1 = (1)
    print(tu1, type(tu1))  # print(tu1, type(tu1))
    tu2 = ('alex')
    print(tu2, type(tu2))  # alex <class 'str'>
    tu3 = ([1, 2, 3])
    print(tu3, type(tu3))  # [1, 2, 3] <class 'list'>
    tu1 = (1,)
    print(tu1, type(tu1))  # (1,) <class 'tuple'>
    
    # fromkeys:将tuple元祖转换为字典
    dic = dict.fromkeys('abc', 'alex')
    print(dic)   # {'a': 'alex', 'b': 'alex', 'c': 'alex'}
    
    # 02 比较说明
    # == 比较的是两边的数值是否相同
    # is 比较的是内存地址是否相同
    # id 查询的是内存地址
    
    # 在 正向 循环一个list中,如果改变的列表的大小,那么结果可以和你预想的不一样。
    # 将索引为奇数位置的元素删除。
    # 第一种:按照切片(步长)的方式进行删除。
    l1 = [11, 22, 33, 44, 55, 66]
    del l1[1::2]
    print(l1)
    
    # 将索引为奇数位置的元素删除。
    # 第二种:利用for循环进行删除。
    
    #错误删除法:正向循环删除。
    l1 = [11, 22, 33, 44, 55, 66]
    for ind in range(len(l1)):
        print(ind, l1)
        if ind % 2 == 1:
            del l1[ind]
        print(ind, l1)
    print(l1)
    
    # 正确删除法:逆向倒叙删除
    l1 = [11, 22, 33, 44, 55, 66]
    for ind in range(len(l1)-1, -1, -1):
        if ind % 2 == 1:
            del l1[ind]
    print(l1)
    
    # 正确删除法:将原有的列表整体切片后,切片后形成行的列表即可进行循环和删除。********
    li = l1[:]
    for ind in range(len(li)):
        print(ind, li)
        if ind % 2 == 1:
            del l1[ind]
        print(ind, l1)
    print(l1)
    
    # 在循环一个字典时,不能改变该字典的大小。
    
    # 需求将字典中的key键含有'k'元素的所有键值对删除。
    
    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'name': 'alex'}
    
    # 错误示例:
    for i in dic.keys():
        if 'k' in i:
            del dic[i]
        print(dic)
    
    # 正确解析:
    l1 = []  # 定义一个空的列表
    for key in dic:
        if 'k' in key:
            l1.append(key)  # 将满足条件的添加至列表中
    # print(l1)
    for key in l1:  # 循环列表(列表可循环)
        del dic[key]  # 删除满足条件中的键值对
    print(dic)

     

posted @ 2018-10-25 22:21  马玉刚  阅读(391)  评论(0编辑  收藏  举报