今日内容概要

  • 作业讲解

  • 数据类型的内置方法

    整型与浮点型
    字符串
    列表
    
  • 可变类型与不可变类型

今日内容详细

作业讲解

"""
1.猜年龄的游戏
    1.必写
        错误的情况下只能猜三次
        正确的情况下直接推出游戏
    2.拔高
        三次错误之后提示用户三次机会已用完
        问他是否继续  如果继续则再给三次机会
        如果不继续则直接退出
"""
age = 18
# 定义一个记录用户次数的变量
count = 0
# 猜年龄
while True:
    # 先判断用户当前是第几次尝试  如果已经三次 提示用户
    if count == 3:
        print('你已经尝试三次了')
        choice = input('您已经尝试三次了 是否还想继续(y/n)>>>:')
        # 判断用户是想继续还是放弃
        if choice == 'y':
            count = 0  # 将用户尝试的次数清零
        else:
            print('欢迎下次再来哟!!!')
            break
    guess_age = input('请输入您的年龄>>>:')
    # 将字符串的数字转为整型的数字
    guess_age = int(guess_age)  # 暂且忽略
    if guess_age > age:
        print('猜大了')
        count += 1  # 加一次
    elif guess_age < age:
        print('猜小了')
        count += 1  # 加一次
    else:
        print('你真棒!!!')
        break

数据类型的内置方法

整型与浮点型

整型

  • 用途

    年龄、生日等整数类型
    
  • 定义

    age = 18  # 本质age = int(18)
    
  • 类型转换

    # 1.int可以将由纯整数构成的字符串直接转换成整型,若包含其他任意非整数符号,则会报错
    int()  将括号内的数据转成整型
    print(int(123))
    print(int('123'))
    print(int('[1,2,3,4]'))
    print(int('hello world'))
    print(int('11.11'))  # 待转换的数据内部只能是纯数字
    
    # 2.进制转换
    print(bin(100))  # 将十进制的100转换成二进制对应的数    0b1100100
    print(oct(100))  # 将十进制的100转换成八进制对应的数    0o144
    print(hex(100))  # 将十进制的100转换成十六进制对应的数  0x64
    """
    0b开头表示二进制数
    0o开头表示八进制数
    0x开头表示十六进制数
    """
    print(int('0b1100100',2))  # 100
    print(int('0o144',8))  # 100
    print(int('0x64',16))  # 100
    

浮点型

  • 用途

    身高、体重、薪资...
    
  • 定义

    height = 183.1  # 本质height = float(183.1)
    
  • 类型转换

    print(float(183.1))
    print(float('183.1'))
    # print(float('hello world'))
    print(float(183))  # 183.0
    print(int(11.11))  # 11
    print(int('11.11'))  # 错误演示:字符串内包含了非整数符号
    

字符串类型

  • 作用

    名字,性别,国籍,地址等描述信息
    
  • 定义

    # 在单引号\双引号\三引号内,由一串字符组成
    name = 'hello world!'  # 本质name = str('hello world!')
    
  • 类型转换

    # 数据类型转换:str()可以将任意数据类型转换成字符串类型
    name1 = 'jason'  # str('jason')
    print(type(str(18)))  # int->str
    print(type(str(11.11)))  # float->str
    print(type(str('hello')))
    print(type(str([1,2,3,4])))  # list->str
    print(type(str({'name':'jason'})))  # dict->str
    print(type(str(True)))  # bool->str
    
  • 优先掌握的操作

    name = 'hello world!'
    # 1、按索引取值(正向取+反向取) :只能取
    '''索引是从0开始的'''
    print(name[0])
    print(name[-1])  # -1表示最有一个元素
    print(name[8])
    print(name[-4])
    # 正数表示从左往右  负数从右往左
    
    # 2、切片(顾头不顾尾,步长)
    '''截取某一段内容'''
    print(name[1:4])  # 1 2 3  顾头不顾尾,取出索引为1到3的所有字符
    print(name[-1:-5:-1])  # 默认的切片方向都是从左往右,-1修改成从右往左  !dlr
    print(name[1:4:2])  # 第三个参数表示步长,会从1开始,每次累加一个2即可,所以会取出索引1、3的字符  el
    
    # 3、长度len
    '''统计字符串里面的字符个数'''
    print(len(name))  # 12   空格也算字符
    
    # 4、成员运算in和not in
    print('hello' in name) # in:判断hello是否在name里面
    print('jason' not in name) # not in:判断jason是否不在name里面
    
    # 5、移除指定的首尾字符strip(******)(默认移除空格、\n、\t)
    username = input('username>>>:')  # 'jason '
    # 将首尾空格移除
    username = username.strip()
    # 两步合并成一步,用一个例子举例
    username = input('username>>>:').strip()
    if username == 'jason':
        print('登录成功')
    else:
        print('登录失败')
    username1 = '$$j$s$o$n$$'
    username2 = '  jason  '
    print(username1.strip('$'))  # 移除指定首、尾的所有字符
    print(username2.strip())  # 默认移除首、尾的所有空格
    # 另外两种方法
    n1 = '$$jason$$'
    # 移除首指定的字符
    print(n1.lstrip('$'))  # jason$$         只移除left
    # 移除尾指定的字符
    print(n1.rstrip('$'))  # $$jason         只移除right
    
    # 6、切分split(******)
    # 括号内不指定字符,默认以空格作为切分符号
    res = 'jason 123 read'
    print(res.split()) # ['jason', '123', 'read']
    '''按照指定割字符串'''
    res = 'jason|123|read'
    print(res.split('|'))  # ['jason', '123', 'read']
    # 1.指定切割的字符不保留
    # 2.切割之后的结构是一个列表(重要)
    #另外的切分方法
    res.split('|', maxsplit=1) # ['jason', '123|read']  从左往右切割指定的次数
    print(res)
    print(res.rsplit('|',maxsplit=1))  # ['jason|123', 'read']  从右往左切割指定的次数
    
    # 7、循环
    for i in name:
        print(i)  # 依次获取字符串中单个单个的字符
    
  • 需要掌握的操作

    # 1.lower(),upper()
    res = 'My NAmE Is JASon 666'
    # 将所有的英文字母转成大写
    print(res.upper())  # MY NAME IS JASON 666
    # 将所有的英文字母转成小写
    print(res.lower())  # my name is jason 666
    """图片验证码校验 忽略大小写"""
    code = 'NaRTs6'
    my_code = input('code>>>:')
    if code.upper() == my_code.upper():
        print('验证码正确')
    print(res.isupper())  # False  字符串内部所有的英文字母是否是全大写
    print(res.islower())  # False  字符串内部所有的英文字母是否是全小写
    
    # 2.startswith,endswith
    res = 'jason egon kevin tony'
    # 判断字符串是否以jason开头
    print(res.startswith('jason'))  # True
    # 判断字符串是否以tony结尾
    print(res.endswith('tony'))  # True
    
    # 3.字符串格式化输出format
    # 之前我们使用%s来做字符串的格式化输出操作,在传值时,必须严格按照位置与%s一一对应,而字符串的内置方法format则提供了一种不依赖位置的传值方式
    # 第一种  类似于%s的用法,传入的值会按照位置与{}一一对应
    res = 'my name is {} my age is {}'
    print(res.format('jason',18))
    # 第二种  把format传入的多个值当作一个列表,按照索引取值,可以反复使用
    res = 'my name is {0} my age is {1} {0} {0} {0}'
    print(res.format('jason',18))
    # 第三种  format括号内在传参数时完全可以打乱顺序,但仍然能指名道姓取值,可以反复使用
    res = 'my name is {name} my age is {age} {name} {name} {name}'
    print(res.format(name='jason',age=18))
    
    # 4.count:统计字符串在大字符串中出现的次数
    res = 'jason a a a a  sdf se sdf we ras dsa dw e asdsa dwqd sadsa dsadas'
    # 统计字符串中 指定字符出现的个数
    print(res.count('a'))  # 13
    print(res.count('a', 1, 10))  # 3  指定1-9范围统计a的次数
    
    # 5.captalize,swapcase,title
    res = 'my name is jason HAJHSSAJJ SAJS  '
    print(res.title())  # 将所有英文单词首字母大写
    print(res.capitalize())  # 首字母大写 后面统一变小写
    print(res.swapcase())  # 大小写翻转
    
    # 6.isdigit
    # 判断是否是纯数字
    guess_age = input('请输入您的年龄>>>:')
    # 判断用户输入的是否是纯数字
    if guess_age.isdigit():
        # 将字符串的数字转为整型的数字
        guess_age = int(guess_age)  # 暂且忽略
    else:
        print('请输入纯数字')
    
    # 7.replace:替换
    res = 'my name is egon egon egon'
    # 将字符串中所有的egon替换成SB
    print(res.replace('egon','SB'))  # 全局替换,语法:replace('旧内容', '新内容')
    print(res.replace('egon','SB',1))  # 局部替换,指定修改的个数
    
    # 8.join:将列表多个元素拼接成字符串
    res = ['jason','egon','kevin','tony']
    res1 = ['jason','egon','kevin','tony',123]
    print('|'.join(res))  # jason|egon|kevin|tony
    print('|'.join(res1))  #  只能是字符串类型拼接
    
  • 了解的操作

    # 1.is数字系列
    # 在python3中
    num1 = b'4'  # bytes
    num2 = '4'  # unicode,python3中无需加u就是unicode
    num3 = '四'  # 中文数字
    num4 = 'Ⅳ'  # 罗马数字
    # isdigt:bytes,unicode,检测字符串是否只由数字组成。
    print(num1.isdigit())  # True
    print(num2.isdigit())  # True
    print(num3.isdigit())  # False
    print(num4.isdigit())  # False
    # isdecimal:uncicode(bytes类型无isdecimal方法),检测字符串是否只包含十进制数字
    print(num2.isdecimal())  # True
    print(num3.isdecimal())  # False
    print(num4.isdecimal())  # False
    # isnumberic:unicode,中文数字,罗马数字(bytes类型无isnumberic方法),检测字符串是否只包含数字字符
    print(num2.isnumeric())  # True
    print(num3.isnumeric())  # True
    print(num4.isnumeric())  # True
    # 三者不能判断浮点数
    num5 = '4.3'
    print(num5.isdigit())  # False
    print(num5.isdecimal())  # False
    print(num5.isnumeric())  # False
    '''
    总结:
        最常用的是isdigit,可以判断bytes和unicode类型,这也是最常见的数字应用场景
        如果要判断中文数字或罗马数字,则需要用到isnumeric。
    '''
    #is其他
    res = 'sdewqe圣诞节卡萨123'
    print(res.isalpha())  # 判断非数字、特殊符号,字符串中只包含字母 False
    print(res.isalnum())  # 字符串中既可以包含数字也可以包含字母 True
    print(res.isalpha())  # 字符串中只包含字母 False
    '''
        如果字符串仅包含字母数字字母(a-z)和(0-9)或下划线(_),则该字符串被视为有效标识符。
        有效的标识符不能以数字开头或包含任何空格。
    '''
    print(res.isidentifier())  # 检查字符串是否是有效标识符 True
    print(res.islower())  # 字符串是否是纯小写 True
    print(res .isupper())  # 字符串是否是纯大写 False
    print(res.isspace())  # 字符串是否全是空格 False
    print(res.istitle())  # 字符串中的单词首字母是否都是大写 False
    
    # 2.find,rfind,index,rindex
    # 2.1 find:从指定范围内查找子字符串的起始索引,找得到则返回数字1,找不到则返回-1
    msg='tony say hello'
    print(msg.find('o',1,3))  # 在索引为1和2(顾头不顾尾)的字符中查找字符o的索引  1
    # 2.2 index:同find,但在找不到时会报错
    print(msg.index('e',2,4)) # 报错ValueError
    # 2.3 rfind与rindex:略
    
    # 3.center,ljust,rjust,zfill
    name='tony'
    print(name.center(30,'-'))  # 总宽度为30,字符串居中显示,不够用-填充
    # -------------tony-------------
    print(name.ljust(30,'*'))  # 总宽度为30,字符串左对齐显示,不够用*填充
    # tony**************************
    print(name.rjust(30,'*'))  # 总宽度为30,字符串右对齐显示,不够用*填充
    # **************************tony
    print(name.zfill(50))  # 总宽度为50,字符串右对齐显示,不够用0填充
    # 0000000000000000000000000000000000000000000000tony
    
    # 4.expandtabs:把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。
    name = 'tony\thello'  # \t表示制表符(tab键)
    print(name)  # tony    hello
    print(name.expandtabs(1))  # 修改\t制表符代表的空格数
    # tony hello
    

列表

  • 定义

    # 定义:在[]内,用逗号分隔开多个任意数据类型的值
    # 中括号括起来 内存可以存放多个元素
    # 元素与元素之间逗号隔开 元素可以是任意数据类型
    l1 = [1,'a',[1,2]]  # 本质:l1 = list([1,'a',[1,2]])
    
  • 类型转换

    name_list = ['jason', 'egon', 'tony']  # name_list = list(['jason', 'egon', 'tony'])
    print(type(list(18)))  # 不能
    print(type(list(11.11)))  # 不能
    print(type(list('hello')),list('hello'))  # 可以    ['h', 'e', 'l', 'l', 'o']
    print(type(list([1,2,3,4])))
    print(type(list({'name':'jason'})),list({'name':'jason'}))  # 可以  ['name']
    print(type(list(True)))  # 不能
    '''能够支持for循环的数据 都能够被list转换成列表'''
    
  • 优先掌握的操作

    name_list = ['jason', 'egon', 'tony']
    # 1.索引取值(正向存取+反向存取):即可存也可以取
    print(name_list[0])  # jason
    print(name_list[-1])  # tony
    # 列表元素的CURD(增删改查),按照索引修改指定位置的值
    name_list[1] = 'egon快回来!'
    print(name_list)  # ['jason', 'egon快回来!', 'tony']
    
    # 2.切片操作(顾头不顾尾,步长)
    # 2.1 顾头不顾尾:取出索引为0到1的元素
    print(name_list[0:2])  # ['jason', 'egon']
    # 2.2 步长:0:2:2,第三个参数2代表步长,会从0开始,每次累加一个2即可,所以会取出索引0的元素
    print(name_list[0:2:2])  # ['jason']
    print(name_list[-1:-3:-1])  # ['tony', 'egon']
    
    # 3.长度:统计列表中元素的个数
    print(len(name_list))  # 3
    
    # 4.添加
    # 4.1 append()列表尾部追加元素
    name_list.append('kevin')
    print(name_list)  # ['jason', 'egon', 'tony', 'kevin']
    name_list.append([11,22,33,44])  
    print(name_list)  # ['jason', 'egon', 'tony', [11, 22, 33, 44]]
    # 4.2 extend()一次性在列表尾部添加多个元素
    # 扩展列表
    l1 = [11,22,33,44,55,66,77]
    # for i in l1:
    #     name_list.append(i)
    # print(name_list)
    name_list.extend(l1)  # extend等价于for+append
    print(name_list)  # ['jason', 'egon', 'tony', 11, 22, 33, 44, 55, 66, 77]
    # 4.3 insert()在指定位置插入元素
    name_list.insert(0,'jack')  # 0表示按索引位置插值
    print(name_list)  # ['jack', 'jason', 'egon', 'tony']
    
    # 5.删除
    # 5.1 del:通用的删除操作
    del name_list[1]
    print(name_list)  # ['jason', 'tony']
    # 5.2 remove()括号内指名道姓表示要删除哪个元素,没有返回值
    res1 = name_list.remove('tony')  # 指名道姓的删除
    print(name_list)  # ['jason', 'egon']
    print(res1)  # None
    # 5.3 pop()默认删除列表最后一个元素,并将删除的值返回,括号内可以通过加索引值来指定删除元素
    res = name_list.pop()  # 默认尾部弹出元素
    print(name_list)  # ['jason', 'egon']
    print(res)  # tony
    res = name_list.pop(1)  # 默认指定索引位置的元素
    print(name_list)  # ['jason', 'tony']
    print(res)  # egon
    
    # 6.count计数
    l1 = [11,22,33,3,3,3,2,3,23,4,34,3,4,3,4]
    print(l1.count(3))  # 6  统计列表中某个元素出现的次数
    
    # 7.clear
    name_list.clear()  # 清空列表
    print(name_list)  # []
    
    # 8.sort()给列表内所有元素排序
    # 排序时列表元素之间必须是相同数据类型,不可混搭,否则报错
    l2 = [11,88,22,44,33,77,66,55]
    l2.sort()  # 排序  默认是升序
    print(l2)  # [11, 22, 33, 44, 55, 66, 77, 88]
    l2.sort(reverse=True)  # reverse=True 降序
    print(l2)  # [88, 77, 66, 55, 44, 33, 22, 11]
    # 字符之间的大小取决于它们在ASCII表中的先后顺序,越往后越大
    l = ['A','z','adjk','hello','hea']
    l.sort()
    print(l)  # ['A', 'adjk', 'hea', 'hello','z']
    
    # 9.reverse()颠倒列表内元素顺序
    l2.reverse()  # 倒序
    print(l2)  # [55, 66, 77, 33, 44, 22, 88, 11]
    

可变与不可变

可变数据类型:值发生改变时,内存地址不变,即id不变,证明在改变原值

列表、字典是可变类型

l1 = [11,22]
print(id(l1))  # 2133952624128
l1.append(666)
print(id(l1))  # 2133952624128

不可变类型:值发生改变时,内存地址也发生改变,即id也变,证明是没有在改变原值,是产生了新的值

整型、浮点型、字符串、元组是不可变类型

a = 1
print(id(a))  # 140721548826272
a = 2
print(id(a))  # 140721548826304
posted on 2021-06-02 20:23  橘子皮卡丘  阅读(57)  评论(0)    收藏  举报