Python从入门到精通(微课精编版)
上QQ阅读APP看书,第一时间看更新

2.5 案例实战

2.5.1 转为字符串

1.使用str()

使用内置函数str()可以把任意类型的对象转换为字符串表示。语法格式如下:

    str(object='')
    str(object=b'', encoding='utf-8', errors='strict')

返回object的字符串版本。如果未提供object,则返回空字符串。

如果encoding或errors均未给出,str(object)返回object.__str__()方法,对于字符串对象,将返回字符串本身。如果object没有__str__()方法,则str()将返回repr(object)。

例如,将一个bytes对象传入str(),而不设置encoding或errors参数,将返回非正式的字符串表示。

    print(str(b'Zoot!'))          # 输出为  b'Zoot!'

如果encoding或errors至少给出其中之一,则object应该是一个bytes(字节串)或bytearray(字节数组)。在此情况下,如果object是一个bytes或bytearray对象,则str(bytes,encoding, errors)等价于bytes.decode(encoding, errors)。否则,在调用bytes.decode()之前获取缓冲区对象下层的bytes对象。

【示例1】下面示例设计自定义类Person,定义__str__()方法,返回该类实例的字符串表示,同时定义__init__()方法,初始化类型实例。最后,使用str()函数转换Person实例为字符串表示。

    class Person:                                               # 自定义类
        def __init__(self,name,age):                            # 构造函数,初始化信息
            self.name=name
            self.age=age
        def __str__(self):                                      # 字符串表示函数
            return "%s今年有%s岁"%(self.name,self.age)
    person=Person("小张",25)                                    # 实例化对象
    print(str(person))                                          # 输出为 小张今年有25岁

2.使用repr()

repr()函数的用法与str()函数类似,都可以接收一个任意类型的对象,返回一个String类型的对象,但两者有着本质的不同。

str()函数返回一个更适合阅读的字符串,而repr()函数返回一个更适合Python解析器阅读的字符串,同时返回Python解析器能够识别的数据细节,这些细节对一般用户没有用。另外,repr()函数转换后的字符串对象可以通过eval()函数,还原为转换之前的对象,而str()函数一般不需要eval()处理。

注意:类可以通过定义__repr__()方法控制该函数为实例所返回的内容。

3.使用chr()

chr(x)函数能够将一个整数转换为Unicode字符。参数x可以是十进制或十六进制形式的数字,范围为Unicode字符集。例如:

    print(chr(0x30))          # 参数为十六进制数,输出字符 0
    print(chr(90))            # 参数为十进制数,输出字符 Z

4.使用hex()、bin()和oct()函数

hex(x)函数能够将一个整数转换为十六进制字符串;bin(x)函数能够将一个整数转换为二进制字符串;而oct(x)函数能够将一个整数转换为八进制字符串。

【示例2】下面示例要求输入Unicode编码起始值和终止值,然后打印该范围内所有字符,同时使用oct()函数和hex()函数,显示八进制编码和十六进制编码,演示效果如图2.3所示。

    beg = int(input("请输入起始值:"))
    end = int(input("请输入终止值:"))
    print("十进制\t八进制\t十六进制\t字符")
    for i in range(beg,end+1):
        print("{}\t{}\t{}\t\t{}".format(i,oct(i),hex(i),chr(i)))

图2.3 输出指定范围的Unicode编码字符

2.5.2 转为整数

使用内置函数int()可以把数字或数字字符串转换为整数对象,语法格式如下:

    int([x])
    int(x, base=10)

如果参数x为数字,则直接返回该数字表示的整数对象。如果没有传递参数,则返回0。

如果参数x不是数字,或者设置base参数,则x必须是字符串、bytes(字节串)、bytearray(字节数组,表示进制为base的整数字面值)。字符串x前面可以包含+或-,符号与数字中间不能有空格,但是字符串前后可以有空格。

提示:一个进制为n的数字包含0~n-1的数,其中a~z(或A~Z)表示10~35。参数base默认为10,Python允许的进制有0和2~36。

二、八、十六进制的数字可以在代码中用0b/0B、0o/0O、0x/0X前缀来表示。进制为0,将按照代码字面量来精确解释,最后的结果会是二、八、十、十六进制中的一个。例如,int('010',0)是非法的,但int('010')和int('010', 8)是合法的。

1.浮点数转换为整数

浮点型转为整型进行向下取整。例如:

    print(int(10.9))          # 输出 10

2.字符串转换为整数

字符型数字在转换为整数时,需要指定进制。例如:

    print(int("0xa", 16))          # 输出 10
    print(int("1010", 2))          # 输出 10

参数16表示字符串"0xa"为十六进制数,int()转换以后获得十进制数。

3.布尔值转换为整数

布尔值True将转换为1,False将转换为0。例如:

    print(int(True))           # 输出 1
    print(int(False))          # 输出 0

4.使用ord()

ord(x)函数与chr()函数相反,它能够将一个字符转换为整数值。参数x是一个Unicode编码的字符,返回对应的十进制整数。例如:

    print(ord('a'))          # 输出 97
    print(ord('b'))          # 输出 98
    print(ord('c'))          # 输出 99

当使用int(x)把一个普通的对象x转换为整数时,如果x定义了__int__()方法,则调用__index__()方法,如果x定义了__index__()方法,则调用__index__()方法;如果x定义了__trunc__()方法,则调用__trunc__()方法。

【示例】下面示例设计自定义类N,定义__str__()方法,返回该类实例的字符串表示,然后定义__int__()方法,返回一个整数。最后,使用int()函数转换N的实例为整数。

    class N:                         # 自定义类
        def __str__(self):           # 定义字符串表示
            return 'Python'
        def __int__(self):           # 定义转换为整数时的返回值
            return 3
    n= N()                           # 实例化对象
    print(n)                         # 输出为 Python
    print(int(n))                    # 输出为 3

2.5.3 转为布尔值

任何对象都可以进行逻辑值的检测,以便在if或while语句中作为条件,或者作为布尔运算的操作数使用。

在默认情况下,当一个对象被调用时,均被视为真值,除非对象所属类满足下面条件之一。

➢ 定义了__bool__()方法,且返回False。

➢ 定义了__len__()方法,且返回0。

如果满足上述条件之一,则被视为假值。使用内置函数bool()可以将任意类型的对象转换为布尔值。语法格式如下:

    bool([x])

参数x对象将调用__bool__()或__len__()方法测试真值。如果x是假或者被省略,则返回False;其他情况均返回True。

提示:bool是int的子类,只有False和True两个实例,其他类不能继承bool。

【示例】下面示例设计自定义类A,定义__bool__()方法返回值为False。则使用bool()函数转换A的实例为布尔值时,总是返回False。

    class A:                         # 自定义类
        def __bool__(self):          # 重写__bool__()方法
            return False
    a = A()                          # 实例化
    print(bool(a))                   # 转换a为布尔值,返回False

提示:有关类的详细讲解参见第10章。

2.5.4 转为浮点数

使用内置函数float()可以把数字或数字字符串转换为浮点数。语法格式如下:

    float([x])

参数x只能是十进制整型数字和一个点号的任意组合,如果出现多个点号,则会抛出异常。

如果实参是字符串,则必须是包含十进制数字的字符串,字符串前面可以有符号,之前也可以有空格。可选的符号有'+'和'-','+'对创建的值没有影响。实参也可以是NaN(非数字)、正负无穷大的字符串。如果去除首尾的空格后,输入的字符串格式必须遵循以下语法:

    ["+" | "-"] floatnumber | "Infinity" | "inf" | "nan"

floatnumber是Python浮点数的字符串形式,字母大小写都可以,如"inf"、"Inf"、"INFINITY"和"iNfINity"都可以表示正无穷大。

如果实参是整数或浮点数,则返回具有相同值的浮点数;如果没有实参,则返回0.0;如果实参超出浮点精度范围,则抛出OverflowError异常。例如:

    print(float('+1.23'))              # 输出 1.23
    print(float(' -12345\n'))          # 输出 -12345.0
    print(float('1e-003'))             # 输出 0.001
    print(float('+1E6'))               # 输出 1000000.0
    print(float('-Infinity'))          # 输出 -inf
    print(float('.98.'))               # 抛出ValueError异常

当使用float(x)把一个普通的对象x转换为浮点数时,实际调用x.__float__()方法。如果__float__()未定义,则调用__index__()方法。

【示例】假设圆的半径为r,圆柱的高为h,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。本例设计使用input()函数要求用户输入数据,然后使用print()函数输出计算结果,并附加文字说明。

    pi = 3.14                                     # 定义一个变量,赋值为π
    r = float(input("请输入圆的半径:"))          # 输入圆的半径
    h = float(input("请输入圆柱的高:"))          # 输入圆柱的高
    c = 2*pi*r                                    # 计算圆的周长
    sa = pi*r**2                                  # 计算圆的面积
    sb = 4*pi*r**2                                # 计算球的表面积
    va = 4/3*pi*r**3                              # 计算球的体积
    vb = sa*h                                     # 计算圆柱的体积
    print("圆的周长为:", c)                      # 打印圆的周长
    print("圆的面积为:", sa)                     # 打印圆的面积
    print("球的表面积为:", sb)                   # 打印球的表面积
    print("球的体积为:", va)                     # 打印球的体积
    print("圆柱的体积为:", vb)                   # 打印圆柱的体积

2.5.5 转为复数

使用内置函数complex()可以把一个字符串或数字转换为复数。语法格式如下:

    complex([real[, imag]])

参数real可以是整数、浮点数或字符串,imag可以是整数或浮点数。

➢ 如果第一个形参是字符串,则不能设置第二个形参,字符串将被解释为一个复数,

➢ 第二个形参不能是字符串。

➢ complex()的两个实参都可以是任意的数值类型,包括复数。

➢ 如果省略了实参imag,则imag默认值为零,像int和float一样进行数值转换。

➢ 如果两个实参都省略,则返回复数0j。

【示例1】下面示例演示把数字、数字字符串转换为复数。

    print(complex(1.2, 2.3))          # 2个数字实参,输出为 (1.2+2.3j)
    print(complex(1.23))              # 1个数字实参,输出为 (1.23+0j)
    print(complex("1"))               # 数字字符串,输出为 (1+0j)
    print(complex("1+2j"))            # 复数格式字符串,输出为 (1+2j)
    print(complex(1+2j))              # 复数,输出为 (1+2j)

注意:当转换字符串时,字符串在+或-的周围必须不能有空格,如complex('1+2j')是合法的,但complex('1 + 2j')触发ValueError异常。

当使用complex(x)把一个普通的对象x转换为复数时,实际调用x.__complex__()方法。如果__complex__()未定义,则调用__float__()方法。如果__float__()未定义,则调用__index__()方法。

【示例2】下面示例设计自定义类P,定义__init__ ()方法,设计构造函数,初始化坐标点的x轴和y轴值,然后定义__complex__()方法,返回x轴值和y轴值构成的复数。最后,使用complex()函数转换P的实例为复数。

    class P:                                        # 自定义屏幕坐标点类型
        def __init__(self, x, y):                   # 初始化构造函数
            self.x = x                              # 保存x轴坐标点
            self.y = y                              # 保存y轴坐标点
        def __complex__(self):                      # 转换为复数的方法
            return complex(self.x, self.y)          # 返回x轴值和y轴值构成的复数
    p = P(3.4, 5)                                   # 实例化坐标点
    print(complex(p))                               # 输出为 (3.4+5j)