• Python黑帽编程2.2 数值类型


    Python黑帽编程2.2  数值类型

    数值类型,说白了就是处理各种各样的数字,Python中的数值类型包括整型、长整型、布尔、双精度浮点、十进制浮点和复数,这些类型在很多方面与传统的C类型有很大的区别。

    Python中的数值类型都是不可变类型,意味着创建、修改数字的值,都会产生新的对象,当然这是幕后的操作,编程过程中大可不必理会。

    2.2.1 标准整型和长整型

    标准整型等价于C中的有符号长整型(long),与系统的最大整型一致(如32位机器上的整型是32位,64位机器上的整型是64位),可以表示的整数范围在[-sys.maxint-1, sys.maxint]之间。整型字面值的表示方法有3种:十进制(常用)、八进制(以数字“0”开头)和十六进制(以“0x”或“0X”开头)。

    # -*- coding:utf-8 -*-

     

    a = 0101

    print 'a='+str(a)

     

    b=64

    print 'b='+str(b)

    c=-237

    print 'c='+str(c)

    d=0x80

    print 'd='+str(d)

    e=-0x92

    print 'e='+str(e)

    上面的代码输出结果为:

    2

    长整型是整型的超集,可以表示无限大的整数(实际上只受限于机器的虚拟内存大小)。长整型字面值的后面带有字母“L”或“l”(推荐使用大写的“L”)。

    长整型和标准整型,目前已经基本统一,当数学运算遇到整型异常的情况,在Python2.2以后的版本,会自动转换为长整型。例如:

    3

    2.2.2  布尔型和布尔对象

    布尔型其实是整型的子类型,布尔型数据只有两个取值:TrueFalse,分别对应整型的10

    每一个Python对象都天生具有布尔值(TrueFalse),进而可用于布尔测试(如用在ifwhile中)。

    以下对象的布尔值都是False,除此之外是True

    None

    False(布尔型)

    0(整型0

    0L(长整型0

    0.0(浮点型0

    0.0+0.0j(复数0

    ''(空字符串)

    [](空列表)

    ()(空元组)

    {}(空字典)

       用户自定义的 类实例,该类定义了方法 __nonzero__()  __len__(),并且这些方法返回0False

    下面我们通过几段代理来加深对布尔类型的认识。

    # -*- coding:utf-8 -*-

    #基本测试

    print bool(1)

    print bool(True)

    print bool('0')

    print bool([])

    pring bool((1,))

    结果如下:

    4

    下面我们看看bool类型作为只有01取值的特殊整型的特性。

    # -*- coding:utf-8 -*-

     

    #使用bool

    foo = 42

    bar = foo<42

    print bar

     

    print bar+10

    print '%s' %bar

    print '%d' %bar

    运行结果如下:

    5

    再来验证下没有_nonzero_()方法的对象,默认是True

     

    #_nozero_()

    class C:pass

     

    c=C()

    print bool(c)

    运行结果如下:

    6

    2.2.3 双精度浮点型

    Python里的浮点型数字都是双精度,类似C语言的double类型。可以用十进制或者科学计数法表示。下面我们看一些典型的浮点型数字。

    # -*- coding:utf-8 -*-

    print 0.0

    print -777.

    print -5.555567119

    print 96e3 * 1.0

    print -1.609E-19

    运行结果如下:

    7

    2.2.4 复数

    Python中,有关复数的概念如下:

    l  虚数不能单独存在,它们总是和一个值为0.0的实数部分一起来构成一个复数。

    l  复数由实数部分和虚数部分组成。

    l  表示虚数的语法:real+imagj.

    l  实数部分和虚数部分都是浮点型。

    l  虚数部分必须有后缀jJ

    下面是几个复数的例子:

    print 64.375+1j

    print 1.23e-045+6.7e+089j

    运行结果如下:

    8

    2.2.5 十进制浮点型

    十进制浮点通常称为decimal类型,主要应用于金融计算。双精度浮点型使用的是底和指数的表示方法,在小数表示上精度有限,会导致计算不准确,decimal采用十进制表示方法,看上去可以表示任意精度。

    下面我们看一下十进制浮点的例子。

    from decimal import *

     

    dec=Decimal('.1')

    print dec

    print Decimal(.1)

    print dec +Decimal(.1)

    使用decimal类型,首先要引入decimal模块,然后通过Decimal类来初始化一个Decimal对象。

    运行结果如下:

    9

    2.2.6 操作符

    下表是主要的操作类型,供参考。

    操作

    说明

    bool

    int

    long

    float

    complex

    x ** y

    指数运算

    +x

    符号不变

    -x

    符号取反

    ~x

    按位取反

       

    x * y

    乘法

    x / y

    除法

    x // y

    地板除

    x % y

    取余

    x + y

    加法

    x - y

    减法

    x << y

    位左移

       

    x >> y

    位右移

       

    x & y

    按位与

       

    x ^ y

    按位异或

       

    x | y

    按位或

       

    abs(x)

    取绝对值

    bin(x)

    整型->二进制字符串

       

    bool(x)

    布尔型转换

    chr(x)

    ASCII->单字符串

       

    complex(re, im)

    实部为re,虚部为im的复数

    divmod(x, y)

    除法及取余

    float(x)

    浮点转换函数

     

    hex(x)

    整型->十六进制字符串

       

    int(x)

    整型转换

     

    long(x)

    长整型转换

     

    pow(x)

    指数运算

    oct(x)

    整型->八进制字符串

       

    round(x[, n])

    保留n位小数并四舍五入

     

    unichr(x)

    ASCII->Unicode单字符串

     



    Python中同时支持不同数值类型的数字进行混合运算,数字类型不一致怎么做运算?这个时候就涉及到强制类型转换问题。这种操作不是随意进行的,它遵循以下基本规则: 

    首先,如果两个操作数都是同一种数据类型,没有必要进行类型转换。仅当两个操作数类型不一致时, Python才会去检查一个操作数是否可以转换为另一类型的操作数。如果可以,转换它并返回转换结果。

    由于某些转换是不可能的,比如果将一个复数转换为非复数类型,将一个浮点数转换为整数等等,因此转换过程必须遵守几个规则。要将一个整数转换为浮点数,只要在整数后面加个.0就可以了。要将一个非复数转换为复数,则只需要要加上一个0j”的虚数部分。

    这些类型转换的基本原则是:整数转换为浮点数,非复数转换为复数。在 Python 语言参考中这样描述coerce()方法: 

    如果有一个操作数是复数,另一个操作数被转换为复数。 

    否则,如果有一个操作数是浮点数,另一个操作数被转换为浮点数。

    否则, 如果有一个操作数是长整数,则另一个操作数被转换为长整数;

    否则,两者必然都是普通整数,无须类型转换。

    数字类型之间的转换是自动进行的,程序员无须自己编码处理类型转换。Python 提供了 coerce() 内建函数来帮助你实现这种转换。

    转换流程图如下图所示:

    10

    2.2.7转换工厂

    函数 int(), long(), float() complex() 用来将其它数值类型转换为相应的数值类型。从Python2.3开始,Python 的标准数据类型添加了一个新成员:布尔(Boolean)类型。从此 true false 现在有了常量值即 True False(不再是10)

    下面是使用工厂函数的简单例子。

    11

    2.2.8 进制转换

    目前我们已经看到Python支持8进制、十进制和十六进制整型,同时还提供了oct()hex()内建函数来返回八进制和十六进制字符串。

    12

    2.2.9 ASII 转换

    chr函数和ord函数分别用来将数字转换为字符,和字符转换为数字。

    13

    2.2.10 小结

    本节对Python数值类型做个比较全面的讲解,网络编程过程中会有大量的数值运算。

    更高级的科学计算,推荐大家了解下两个著名的第三方包,NumPySciPy

     

    2.3节《字符串、列表和元组》已经在微信订阅号抢先发布,心急的同学进入订阅号(二维码在下方),从菜单网络安全”—>”Python黑帽编程进入即可。

    本节视频教程获取方法,请扫描二维码,在菜单网络安全”——>”Python黑帽编程中找到对应的本文2.2.10节,有详细方法。

     

    由于教程仍在创作过程中,在整套教程完结前,感兴趣的同学请关注我的微信订阅号(xuanhun521,下方二维码),我会第一时间在订阅号推送图文教程和视频教程。问题讨论请加qq群:Hacking 1群):303242737   Hacking 2群):147098303

     

    关注之后,回复请回复“Python”,获取更多内容。

     

  • 相关阅读:
    lincode 题目记录5
    lintcode题目记录4
    lintcode 题目记录3
    lintcode 题目记录2
    剖析ASP.NET Core(Part 2)- AddMvc(译)
    剖析ASP.NET Core MVC(Part 1)- AddMvcCore(译)
    如何 RESTFul 你的服务(译)
    Windows + IIS 环境部署Asp.Net Core App
    Asp.Net Core 缓存的使用(译)
    [转载].NET Core 轻量级模板引擎 Mustachio
  • 原文地址:https://www.cnblogs.com/xuanhun/p/5728975.html
Copyright © 2020-2023  润新知