美文网首页
4.Python字符编码、格式化、运算符

4.Python字符编码、格式化、运算符

作者: 小哥_xiaoge | 来源:发表于2018-01-21 23:00 被阅读0次

    一.字符编码

    学习Demo
    字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。

    因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295

    由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。

    但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

    你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

    因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

    Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

    现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。

    字母A用ASCII编码是十进制的65,二进制的01000001;

    字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的;

    汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。

    你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。

    新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

    所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:



    从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

    搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式:

    在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

    用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

    1.1 Python的字符串

    在最新的Python 3版本中,字符串是以Unicode编码的,默认存储以UTF-8,但是Python 2默认存储以Unicode编码。

    1.1.1 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
    >>> ord('A')
    65
    >>> ord('中')
    20013
    >>> chr(66)
    'B'
    >>> chr(25991)
    '文'
    
    1.1.2 Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。Python对bytes类型的数据用带b前缀的单引号或双引号表示
    x = b'ABC'
    
    1.1.3 由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
    第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会
    有乱码(python3默认支持UTF-8,在Python3不用写)。
    """
    

    二.输出格式化

    Python两种输出值的方式: 表达式语句和 print() 函数。
    第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。
    如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。
    如果你希望将输出的值转成字符串,可以使用 repr()str() 函数来实现。

    • str(): 函数返回一个用户易读的表达形式。
    • repr(): 产生一个解释器易读的表达形式。
    >>> str(1/7)
    '0.14285714285714285'
    >>> x = 10 * 3.25
    >>> y = 200 * 200
    >>> s = 'x 的值为: ' + repr(x) + ',  y 的值为:' + repr(y) + '...'
    >>> print(s)
    x 的值为: 32.5,  y 的值为:40000...
    >>> #  repr() 函数可以转义字符串中的特殊字符
    ... hello = 'hello, runoob\n'
    >>> hellos = repr(hello)
    >>> print(hellos)
    'hello, runoob\n'
    >>> # repr() 的参数可以是 Python 的任何对象
    ... repr((x, y, ('Google', 'Runoob')))
    "(32.5, 40000, ('Google', 'Runoob'))"
    
    • 字符串对象的rjust()方法, 它可以将字符串靠右, 并在左边填充空格。还有类似的方法, 如 ljust()center()。 这些方法并不会写任何东西, 它们仅仅返回新的字符串。
      另一个方法 zfill(), 它会在数字的左边填充 0。
    >>> '12'.zfill(5)
    '00012'
    >>> '-3.14'.zfill(7)
    '-003.14'
    >>> '3.14159265359'.zfill(5)
    '3.14159265359'
    
    • str.format() 的基本使用如下:
    >>> print('{}网址: "{}!"'.format('菜鸟教程', 'www.runoob.com'))
    菜鸟教程网址: "www.runoob.com!"
    
    """
    括号及其里面的字符 (称作格式化字段) 将会被 format() 中的参数替换。
    在括号中的数字用于指向传入对象在 format() 中的位置
    """
    >>> print('{0} 和 {1}'.format('Google', 'Runoob'))
    Google 和 Runoob
    >>> print('{1} 和 {0}'.format('Google', 'Runoob'))
    Runoob 和 Google
    >>> print('{name}网址: {site}'.format(name='菜鸟教程', site='www.runoob.com'))
    菜鸟教程网址: www.runoob.com
    
    • !a (使用 ascii()), !s (使用 str()) 和'!r'(使用 repr()) 可以用于在格式化某个值之前对其进行转化
    >>> import math
    >>> print('常量 PI 的值近似为: {}。'.format(math.pi))
    常量 PI 的值近似为: 3.141592653589793。
    >>> print('常量 PI 的值近似为: {!r}。'.format(math.pi))
    常量 PI 的值近似为: 3.141592653589793。
    
    • 可选项 ':' 和格式标识符可以跟着字段名。 这就允许对值进行更好的格式化。
    >>> import math
    >>> print('常量 PI 的值近似为 {0:.3f}。'.format(math.pi))  #  将 Pi 保留到小数点后三位
    常量 PI 的值近似为 3.142。
    
    >>> table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}
    >>> for name, number in table.items():
    ...     print('{0:10} ==> {1:10d}'.format(name, number))  #  在 ':' 后传入一个整数, 可以保
    # 证该域至少有这么多的宽度。 用于美化表格时很有用
    ...
    Runoob     ==>          2
    Taobao     ==>          3
    Google     ==>          1
    
    • 如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会是很好的事情。
      最简单的就是传入一个字典, 然后使用方括号 []来访问键值 :
    >>> table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}
    >>> print('Runoob: {0[Runoob]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}'.format(t
    able))
    Runoob: 2; Google: 1; Taobao: 3
    """
    也可以通过在 table 变量前使用 '**' 来实现相同的功能
    """
    >>> print('Runoob: {Runoob:d}; Google: {Google:d}; Taobao: {Taobao:d}'.format(**table))
    Runoob: 2; Google: 1; Taobao: 3
    
    • 旧式字符串格式化
    """
    % 操作符也可以实现字符串格式化。 它将左边的参数作为类似 sprintf() 式的格式化字符串, 而将右边的
    代入, 然后返回格式化后的字符串.因为str.format() 比较新的函数, 大多数的 Python 代码仍然使用 % 
    操作符。但是因为这种旧式的格式化最终会从该语言中移除, 应该更多的使用 str.format().
    """
    >>> import math
    >>> print('常量 PI 的值近似为:%5.3f。' % math.pi)
    常量 PI 的值近似为:3.142。
    
    • 读取键盘输入
    """
    Python提供了 input() 置函数从标准输入读入一行文本,默认的标准输入是键盘。
    input 可以接收一个Python表达式作为输入,并将运算结果返回
    """
    #!/usr/bin/python3
    
    str = input("请输入:");
    print ("你输入的内容是: ", str)
    
    • 数字格式化
      ^, <,> 分别是居中、左对齐、右对齐,后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。+ 表示在正数前显示 +,负数前显示-; (空格)表示在正数前加空格。b、d、o、x 分别是二进制、十进制、八进制、十六进制。
      eg: print("{:.2f}".format(3.1415926)) 结果:3.14
    数字 格式 输出 描述
    3.1415926 {:.2f} 3.14 保留小数点后两位
    3.1415926 {:+.2f} +3.14 带符号保留小数点后两位
    -1 {:+.2f} -1.00 带符号保留小数点后两位
    2.71828 {:.0f} 3 不带小数
    5 {:0>2d} 05 数字补零 (填充左边, 宽度为2)
    5 {:x<4d} 5xxx 数字补x (填充右边, 宽度为4)
    10 {:x<4d} 10xx 数字补x (填充右边, 宽度为4)
    1000000 {:,} 1,000,000 以逗号分隔的数字格式
    0.25 {:.2%} 25.00% 百分比格式
    1000000000 {:.2e} 1.00e+09 指数记法
    13 {:10d} 13 右对齐 (默认, 宽度为10)
    13 {:<10d} 13 左对齐 (宽度为10)
    13 {:^10d} 13 中间对齐 (宽度为10)
    11 '{:b}'.format(11) 1011 进制
    11 '{:d}'.format(11) 11 进制
    11 '{:o}'.format(11) 13 进制
    11 '{:x}'.format(11) b 进制
    11 '{:#x}'.format(11) 0xb 进制
    11 '{:#X}'.format(11) 0XB 进制

    三.数据运算符

    • 算术运算符
    • 比较(关系)运算符
    • 赋值运算符
    • 逻辑运算符
    • 位运算符
    • 成员运算符
    • 身份运算符
    • 运算符优先级
    3.1 算术运算符
    运算符 描述 实例
    + 加 - 两个对象相加 a + b 输出结果 31
    - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -11
    * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 210
    / 除 - x 除以 y b / a 输出结果 2.1
    % 取模 - 返回除法的余数 b % a 输出结果 1
    ** 幂 - 返回x的y次幂 a**b 为10的21次方
    // 取整除 - 返回商的整数部分 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0
    3.2 比较运算符

    以下假设变量a为10,变量b为20:

    运算符 描述 实例
    == 等于 - 比较对象是否相等 (a == b) 返回 False
    != 不等于 - 比较两个对象是否不相等 (a != b) 返回 True
    > 大于 - 返回x是否大于y (a > b) 返回 False
    < 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写 (a < b) 返回 True
    >= 大于等于 - 返回x是否大于等于y。 (a >= b) 返回 False
    <= 小于等于 - 返回x是否小于等于y。 (a <= b) 返回 True
    3.3 赋值运算符
    运算符 描述 实例
    = 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
    += 加法赋值运算符 c += a 等效于 c = c + a
    -= 减法赋值运算符 c -= a 等效于 c = c - a
    *= 乘法赋值运算符 c *= a 等效于 c = c * a
    /= 除法赋值运算符 c /= a 等效于 c = c / a
    //= 取整除赋值运算符 c //= a 等效于 c = c // a
    %= 取模赋值运算符 c %= a 等效于 c = c % a
    **= 幂赋值运算符 c **= a 等效于 c = c ** a
    3.4 位运算符

    按位运算符是把数字看作二进制来进行计算的。下表中变量 a 为 60,b 为 13,二进制 a = 0011 1100, b = 0000 1101

    运算符 描述 实例
    & 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100
    | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 (a | b) 输出结果 61 ,二进制解释: 0011 1101
    ^ 按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001
    ~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
    << 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 a << 2 输出结果 240 ,二进制解释: 1111 0000
    >> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 a >> 2 输出结果 15 ,二进制解释: 0000 1111
    3.5 逻辑运算符

    Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:

    运算符 逻辑表达式 描述 实例
    and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20
    or x or y 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 (a or b) 返回 10
    not not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False
    3.6 成员运算符

    除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

    运算符 描述 实例
    in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True
    not in 如果在指定的序列中没有找到值返回 True,否则返回 False x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True
    3.7 身份运算符

    身份运算符用于比较两个对象的存储单元

    运算符 描述 实例
    is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
    is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False

    is和==的区别:
    is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。

    3.8 运算符优先级

    以下表格列出了从最高到最低优先级的所有运算符:

    运算符 描述
    ** 指数 (最高优先级)
    ~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
    * / % // 乘,除,取模和取整除
    + - 加法减法
    >> << 右移,左移运算符
    & 位 'AND'
    ^ | 位运算符
    <= < > >= 比较运算符
    <> == != 等于运算符
    = %= /= //= -= += *= **= 赋值运算符
    is is not 身份运算符
    in not in 成员运算符
    not or and 逻辑运算符

    相关文章

      网友评论

          本文标题:4.Python字符编码、格式化、运算符

          本文链接:https://www.haomeiwen.com/subject/zubkoxtx.html