Day02 变量数据类型 & 输入输出

文章目录

    day02 变量数据类型 & 输入输出

    1. Python语言的执行

    2. 小整数池

    """
        小整数池  CPython解释器将-5 ~ 256 这个范围的整数 存在小整数池  当我们声明变量
        取值属于这个范围的数据  将直接使用小整数池中的对象 不会重复创建多个对象
        这样设计的目的 是为了节省内存资源
    
        在终端通过交互式的方式可以直接感受上方的描述 如果在PyCharm中 因为PyCharm对整数的存储也做了优化
        所以不需要记忆 按照CPython解释器的规则来记即可
    
        Java语言也有这样的设计  将Byte有符号取值范围(-128 ~ 127)内的数据 存放在一个 缓存数组中  CacheArray
    
        因为不可变 才可以被共享
    """
    
    a = 10
    b = 10
    c = 10
    
    print(a)
    print(b)
    print(c)
    
    # 呈现内存中的地址值
    print(id(a))
    print(id(b))
    print(id(c))
    
    
    # 通过is关键字 比较是否属于同一个对象 注意:严格比较内存地址
    print(a is b)
    print(a is c)
    print(b is c)
    
    
    print("--------------------------------------------")
    
    a = 1000
    b = 1000
    c = 1000
    
    print(id(a))
    print(id(b))
    print(id(c))
    
    print(a is b)
    print(a is c)
    print(b is c)
    
    
    
    # 以上代码在终端中执行 观察效果
    
    
    
    
    
    

    3. float类型

    float类型属于浮点数类型 小数类型 是有精度损失的 任何语言 只要采用的是IEEE754的这个标准定义的类型 都有这个问题 因为CPU采用这个标准 所以计算机语言使用相同的标准 运算效率更高 但是精度无法保证 如果需要保存货币 进行科学计算 等对精度有要求的情况下 可以使用Decimal 类 此类使用字符串的方式 来记录任何精度 任何大小的数据 并且数据的准确的 不存在任何误差

    """
        float类型属于浮点数类型 小数类型 是有精度损失的  任何语言 只要采用的是IEEE754的这个标准定义的类型
        都有这个问题 因为CPU采用这个标准 所以计算机语言使用相同的标准 运算效率更高 但是精度无法保证
        如果需要保存货币 进行科学计算 等对精度有要求的情况下 可以使用Decimal 类 此类使用字符串的方式
        来记录任何精度 任何大小的数据 并且数据的准确的 不存在任何误差
    """
    
    a = 0.1
    b = 0.2
    print(type(a))
    print(type(b))
    print(a + b) # 0.30000000000000004 精度损失
    
    # 从名为decimal的模块中导入了 Decimal这个类
    from decimal import Decimal
    
    d1 = Decimal("2.599852674846524598652184296352635254296352963521")
    d2 = Decimal("0.5998526748465245952963521")
    
    print(type(d1))
    print(type(d2))
    print(d1 + d2)
    print(d1 - d2)
    print(d1 * d2)
    print(d1 / d2)
    
    
    
    
    
    
    
    
    

    4.bool类型

    因为C语言中是没有布尔类型的 使用1或者0来表示真或者假 而Python延续了这个规则 Python中的bool类型 True 也可以理解为1 False理解为0

    True 以及 False 被Python设计为全局单例对象 Global Single Object 即整个Python进程中 所有的True都是同一个对象 所有的False也是同一个对象

    ==比较值 值相同 地址值未必相同 is比较地址值 地址值相同 值一定是相同

    """
        因为C语言中是没有布尔类型的 使用1或者0来表示真或者假
        而Python延续了这个规则 Python中的bool类型 True 也可以理解为1  False理解为0
    
        True 以及 False 被Python设计为全局单例对象 Global Single Object
        即整个Python进程中 所有的True都是同一个对象  所有的False也是同一个对象
    
        ==比较值 值相同 地址值未必相同
        is比较地址值 地址值相同 值一定是相同
    
    
    """
    
    
    a = True
    b = False
    print(a)
    print(b)
    print(type(a))
    print(type(b))
    
    # ==用于比较左右两边值是否相同
    print(a == 1)
    print(b == 0)
    print(a + 1)
    
    # is 严格比较地址 即判断内存中是否属于同一个对象
    print(a is 1)
    print(b is 0)
    
    
    print("*" * 100)
    
    b1 = True
    b2 = True
    b3 = True
    print(b1 == b2) # 比较值
    print(id(b1))
    print(id(b2))
    print(id(b3))
    print(b1 is b2) # 比较内存中的地址
    print(b1 is b3) # 比较内存中的地址
    print(b2 is b3) # 比较内存中的地址
    
    print("*" * 100)
    
    
    b1 = False
    b2 = False
    b3 = False
    print(b1 == b2) # 比较值
    print(b1 is b2) # 比较内存中的地址
    print(b1 is b3) # 比较内存中的地址
    print(b2 is b3) # 比较内存中的地址
    
    

    在开发中 一些特殊的值或者空容器 也可以表示为False None 0 0.0 "" [] () {} None也被设计为全局单例对象 即同一个Python进程中 所有的None对象都是同一个 也是为了节省内存资源

    """
        在开发中  一些特殊的值或者空容器 也可以表示为False
        None  0  0.0  ""  []  () {}
        None也被设计为全局单例对象 即同一个Python进程中 所有的None对象都是同一个  也是为了节省内存资源 
    """
    
    if not None:
        print("条件成立1")
    
    if not 0:
        print("条件成立2")
    
    if not 0.0:
        print("条件成立3")
    
    
    if not "":
        print("条件成立4")
    
    
    if not []:
        print("条件成立5")
    
    if not ():
        print("条件成立6")
    
    if not {}:
        print("条件成立7")
    
    a = None
    print(a == False)
    print(a is False)
    
    b = None
    c = None
    d = None
    print(a == b)
    print(a == c)
    print(a == d)
    print(a is b)
    print(a is c)
    print(a is d)
    
    
    
    
    print("程序结束")
    
    

    5. str类型

    str类型 字符串类型 任何被英文双引号或者单引号包括的内容 都属于字符串类的实例 也就是对象

    Literal 字面量 对于字符串而言 直接书写在双引号或者单引号之内 这个值属于字面值 属于字面量 字面量是属于常量 常量不能修改

    """
        str类型 字符串类型
        任何被英文双引号或者单引号包括的内容 都属于字符串类的实例 也就是对象
    
        Literal 字面量 对于字符串而言 直接书写在双引号或者单引号之内 这个值属于字面值 属于字面量
        字面量是属于常量 常量不能修改
    
    """
    
    s1 = "abc"
    s1 = "ABC"
    s2 = 'abc'
    s3 = "hello world"
    
    print(s1)
    print(s2)
    print(s3)
    print(s1 + s2 + s3) # 字符串的加法计算属于拼接字符串
    
    print(type(s1))
    print(type(s2))
    print(type(s3))
    
    
    
    html_str1 = "<html>\
    	<head>\
    		<title>这是我的第一个网页</title>\
    	</head>\
    	<body>\
    		网页的内容……\
    	</body>\
    </html>"
    
    html_str2 = """<html>
    	<head>
    		<title>这是我的第一个网页</title>
    	</head>
    	<body>
    		网页的内容……
    	</body>
    </html>"""
    
    

    6. 转义字符

    我们使用转义字符来保存一个特殊符号 或者 实现一些特定的效果

    
    print("-" * 50)
    
    s1 = "\\\\"
    print(s1)
    
    s2 = "\""
    print(s2)
    
    s3 = "'"
    print(s3)
    
    s4 = "\'"
    print(s4)
    
    
    s5 = '\''
    print(s5)
    
    
    s6 = "abc\bdef"  # 退格
    print(s6)
    
    
    s7 = "a\nb\nc"
    print(s7)
    
    
    # 制表符
    s8 = "床\t\t前\t明\t月\t光"
    s9 = "疑\t\t是\t地\t上\t霜"
    print(s8)
    print(s9)
    
    # 注意 \r 只是回车的效果 即回到行首
    s10 = "abc\rdef"
    print(s10)
    

    7. str类型intern机制

    str类型的intern机制 ​ 为了共享str对象 节省内存资源 str类型的对象默认是开启intern机制的 ​ 除非字符串中包含一些特殊的符号 或者 空格等

    """
        str类型的intern机制
        为了共享str对象 节省内存资源  str类型的对象默认是开启intern机制的
        除非字符串中包含一些特殊的符号 或者 空格等
    
    """
    
    s1 = "abc"
    s2 = "abc"
    print(s1)
    print(s2)
    print(s1 == s2)
    print(s1 is s2)
    print(id(s1))
    print(id(s2))
    
    
    s3 = "a b c"
    s4 = "a b c"
    print(s3 == s4)
    print(s3 is s4)
    print(id(s3))
    print(id(s4))
    
    
    

    8. 类型转换

    8.1 自动类型转换

    自动类型转换 我们在使用不同的类型数据进行计算 会涉及到自动的类型转换 对于整数和浮点数进行计算 结果会自动转换为浮点数类型

    """
        自动类型转换 我们在使用不同的类型数据进行计算 会涉及到自动的类型转换
        对于整数和浮点数进行计算 结果会自动转换为浮点数类型
    """
    
    a = 10
    b = 2.5
    result1 = a + b
    print(result1)
    print(type(result1))
    
    c = 10
    d = 1
    result2 = c / d
    print(result2)
    print(type(result2))
    
    
    # 跟Java语言不通 Python中不允许数值和字符串直接加法计算
    e = 10
    f = "hello"
    # 错误(异常)会导致程序中断 后续我们可以通过异常处理机制 来捕获异常
    print(e + f) # TypeError: unsupported operand type(s) for +: 'int' and 'str'
    
    print("程序结束")
    
    
    
    

    8.2 强制类型转换

    int函数

    int 函数 将传入的内容转换为 整数 小数部分舍弃

    """
        强制类型转换
    """
    
    # int 函数  将传入的内容转换为 整数  小数部分舍弃
    
    print(int(2.5))
    num1 = int(2.5)
    print(num1)
    
    # 3E5 属于科学计数法  3 * 10 ^ 5
    num2 = 3.3E10
    print(num2)
    # 将传入的科学计数法 转换为int类型
    print(int(3.3E2))
    
    print("-" * 100)
    
    # 字符串类型转换为int类型
    s1 = "10"
    a1 = int(s1)
    print(type(a1))
    print(a1)
    
    
    print("*" * 20)
    
    
    s1 = "-10"
    a1 = int(s1)
    print(type(a1))
    print(a1)
    
    print("*" * 20)
    
    s1 = "   -10    "
    a1 = int(s1)
    print(type(a1))
    print(a1)
    
    print("*" * 20)
    
    print(int("111"))
    print(int("111",2))
    # 使用八进制处理字符串数据
    print(int("11",8))
    # 使用十六进制处理字符串数据
    print(int("11",16))
    print(int("4e2d",16))
    # print(int("4e2d",2))  这里报错 ValueError: invalid literal for int() with base 2: '4e2d'
    
    # 使用二进制处理字符串数据
    print(int("0B1111",2))
    # 让Python解释器自行按照合适的进制处理
    print(int("0B1111",0))
    # print(int("0B1111")) 对于不能直接处理为十进制数值的字符串 必须指定要处理的进制 否则报错
    
    print(int("0o11",8))
    print(int("0o11",0))
    # print(int("0o11")) 对于不能直接处理为十进制数值的字符串 必须指定要处理的进制 否则报错
    
    print(int("0X4E00",16))  # 中文汉字 一
    print(int("0X9FA5",16))  # 中文汉字 龥
    print(int("0X9FA5",0))  # 中文汉字 龥
    
    float函数

    强制类型转换 float函数 将传入的数据转换为浮点数

    """
        强制类型转换 float函数
        将传入的数据转换为浮点数
    """
    
    
    s1 = "11.5"
    f1 = float(s1)
    print(f1)
    print(type(f1))
    
    print("*" * 20)
    
    print(float("3E5"))
    
    # nan 或者 NaN :  not a number 不是一个数值
    
    print(float("nan"))
    print(float("NaN"))
    
    # inf 或者  infinity 表示无穷
    print(float("inf"))
    print(float("infinity"))
    
    # print(float("abc")) 报错 并非支持所有的字符串    
    
    complex复数

    复数函数 complex()

    数学中使用i表示虚部 Python中使用1j表示 因为在电气工程学领域i表示电流符号 所以在Python特意避免歧义 避免混淆

    """
        复数函数 complex()
    
        数学中使用i表示虚部  Python中使用1j表示
        因为在电气工程学领域i表示电流符号 所以在Python特意避免歧义 避免混淆  
    
    """
    
    c1 = complex(1,2)
    print(c1)
    print(c1.real)
    print(c1.imag)
    
    
    c2 = complex("1+2j") #注意 这里字符串中不能加空格  否则报错
    print(c2)
    print(c2.real)
    print(c2.imag)
    
    
    
    repr函数

    repr()函数 将字符串原本的内容完整的进行呈现 用于调试代码 找错误的时候 使用 比如我们可以通过此函数来获取 用户传入的参数 长什么样子

    """
        repr()函数 将字符串原本的内容完整的进行呈现
        用于调试代码 找错误的时候 使用    比如我们可以通过此函数来获取 用户传入的参数 长什么样子
    """
    
    
    s1 = "a\nb"
    print(s1)
    
    print(repr(s1))
    
    
    
    
    eval函数

    执行传入的字符串表达式 或者 脚本 命令 等等

    """
        执行传入的字符串表达式
    """
    
    print(eval("1 + 2"))
    print(eval("1 * 2"))
    print(eval("1 - 2"))
    print(eval("1 / 2"))
    print(eval("执行脚本  Linux 脚本  Windows脚本 JS脚本  "))
    # 不要执行以下代码
    # print(eval("_import_(os).system(' format C:')"))
    # print(eval("_import_(os).system('rm rf /')"))
    
    encode和decode函数

    encode()函数 根据指定的编码格式 进行编码 decode()函数 根据指定的解码格式 进行解码

    一个英文字母占几个字节? ​ 一个字节

    一个中文占几个字节 ? ​ 根据不同的编码表 所占字节数不同 ​ GB2312 国标标准版 只收录了绝大多数中文简体 ​ GBK 2个字节 Guo Biao Kuo Zhan 此编码表只收录了绝大多数中文汉字 简体以及繁体 ​ UTF-8 3个字节

    """
        encode()函数 根据指定的编码格式 进行编码
        decode()函数 根据指定的解码格式 进行解码
    
    
        一个英文字母占几个字节?
            一个字节
    
        一个中文占几个字节  ?
            根据不同的编码表 所占字节数不同
            GB2312 国标标准版  只收录了绝大多数中文简体
            GBK 2个字节  Guo Biao Kuo Zhan 此编码表只收录了绝大多数中文汉字 简体以及繁体
            UTF-8 3个字节
    """
    
    s1 = "abc中国"
    
    s1_bytes = s1.encode(encoding="utf-8")
    
    print(s1_bytes)
    
    print(type(s1_bytes))
    
    # len()函数 用于获取长度
    print(len(s1_bytes))
    
    
    new_s1 = s1_bytes.decode("utf-8")
    
    print(new_s1)
    
    
    
    print("-----------------------------------------------------------------")
    
    
    s2 = "abc中国"
    
    s2_bytes = s2.encode("gbk")
    
    print(s2_bytes)
    
    print(type(s2_bytes))
    
    print(len(s2_bytes))
    
    
    new_s2 = s2_bytes.decode("gbk")
    
    print(new_s2)
    
    bool函数

    bool()函数的使用 将传入的内容 转换布尔类型的数据

    """
        bool()函数的使用  将传入的内容 转换为布尔类型的数据
    """
    
    #  bool函数 只要内容非空 或者 不是 None  以及其他可以表示为False 的数据    都是True
    print(bool("abc"))
    print(bool("True"))
    print(bool("False"))
    print(bool(""))
    print(bool(None))
    print(bool("None"))
    print(bool(123))
    print(bool(1.5))
    print(bool(0))
    print(bool(0.0))
    
    

    9. 输入数据

    如果需要接收用户在控制台输入的内容 可以使用input函数 此函数接收到的数据都是在字符串类型

    """
        如果需要接收用户在控制台输入的内容 可以使用input函数
        此函数接收到的数据都是在字符串类型
    """
    
    name = input("请输入你的名字\n")
    
    print("你输入的名字是",name)
    
    age = int(input("请输入你的年龄\n"))
    
    print(type(age))
    
    print("你输入的年龄是",age)
    
    height = input("请输入你的身高\n")
    
    new_height = float(height)
    
    print(type(new_height))
    
    print("你输入的身高是", height)
    
    is_happy = bool(input("请输入你今天是否很开心True/False?\n"))
    
    print("你输入的是否开心为", is_happy)
    
    
    print(type(is_happy))
    
    
    print("程序结束")
    
    

    10. 输出数据

    print()函数用于输出内容 默认打印完以后换行 如果不希望打印完之后换行 可以指定end参数的值 来实现打印完之后的效果

    """
        print()函数用于输出内容  默认打印完以后换行
        如果不希望打印完之后换行 可以指定end参数的值 来实现打印完之后的效果
    """
    
    print(1,end="a")
    print(2,end="b")
    print(3,end="c")
    
    
    print("*" * 50)
    
    s1 = "a = %d ,b = %f" % (1,2.56789)
    print(s1)
    
    
    s1 = "a = %d ,b = %.2f" % (1,2.56789)
    print(s1)
    
    
    s1 = "a = %d ,b = %.1f" % (1,2.56789)
    print(s1)
    
    
    print("*" * 50)
    
    # 按照顺序填充参数到字符串中
    s2 = "a = {} , b = {} , c = {}".format(10,20,True)
    print(s2)
    
    print("*" * 50)
    # 按照我们指定的下标顺序 填充参数到字符串中  0表示第一个 1表示第二个 以此类推
    s3 = "a = {1} , b = {0} , c = {2}".format(10,20,True)
    print(s3)
    
    print("*" * 50)
    
    s4 = "a = {a1} , b = {b1} , c = {c1}".format(a1=1,b1=1,c1=2)
    print(s4)
    
    
    float1 = 31415.9
    # : 按照后边的规则进行格式化
    # *:以 * 填充空白,不写则默认以空格填充。
    # ^:可选 < 、 ^ 、 > ,分别是左对齐、居中、右对齐。
    # 20:数字宽度为20,数字长度不足20则进行填充。
    # ,:可选 , 和 _ ,每3位进行分隔。
    # .2f:小数点后保留2位。
    str2 = "{:*^20,.2f}".format(float1)
    print(str2) # *****31,415.90******
    
    
    print("*" * 50)
    
    
    s5 = "字符串的内容{0}".format("abc")
    print(s5)
    
    s6 = "{{0}}位置的内容为{0}".format("abc")
    print(s6)
    
    print("*" * 50)
    
    a = 10
    b = 20
    c = 30
    print(f"{a},{b},{c}")
    print(f"{a=},{b=},{c=}")
    
    # 嵌套括号 将不再有变量值填充的效果
    print(f"{{a=}},{{b=}},{{c=}}")
    
    
    end