#!/usr/bin/env python 
# -*- coding:utf-8 -*-
__author__ = 'Abel'
"""
   Python中内置的%操作符和.format方式都可用于格式化字符串。先来看看这两种具体格式化方法的基本语法形式和常见用法。
   %操作符根据转换说明符所规定的格式返回一串格式化后的字符串,转换说明符的基本形式为: %[转换标记][宽度[.精确度]]转换类型。
其中常见的转换标记和转换类型分别下所示。如果未指定宽度,则默认输出为字符串本身的宽度。
转换标记       解释
   -        表示左对齐
   +        在正数之前加上+
(a space)   表示正数之前保留空格
   #        在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'
   0        表示转换值若位数不够则用0填充而非默认的空格
   c        转换为单个字符,对于数字将转换该值所对应的ASCⅡ码
   s        转换为字符串,对于非字符串对象,将默认调用str()函数进行转换
   r        用repr()函数进行字符串转换转换
   i d      转换为带符号的十进制数
   u        转换为不带符号的十进制数
   o        转换为不带符号的八进制
   x,X      转换为不带符号的十六进制
   e E      表示为科学计数法表示的浮点数
   f F      转成浮点数(小数部分自然截断)
   g G      如果指数大于-4或者小于精度值则和e相同,其他情况与f相同;
            如果指数大于-4或者小于精度值则和E相同,其他情况与F相同
"""
###  %操作符格式化字符串时有如下几种常见用法:
### (1)直接格式化字符或者数值。
print("score:%06.1f" % 9.5)    # score:0009.5
###(2)以元组的形式格式化
name,num = "Abel",10
print("%s today have %d classes" % (name, num))  #Abel today have 10 classes
dict = {"name":"Abel", "num":10}
print("%(name)s today have %(num)d classes" % dict) #Abel today have 10 classes
#注意上面的是%(name)s和%(num)d,不能漏了s和d。

"""
   format方式格式化字符串的基本语法为:[[填充符]对齐方式][符号][#][0][宽度][,][.精确度][转换类型]。
其中填充符可以是除了“{”和“}”符号之外的任意符号,对齐方式和符号分别如下所示。转换类型跟%操作符的转换类型类似。
 format方式格式化字符串的对齐方式:
对齐方式    解释
   <        表示左对齐,是大多数对象为默认的对齐方式
   >        表示右对齐,数值默认的对齐方式
   =        仅对数值类型有效,如果有符号的话,在符号后数值前进行填充,如-000029
   ^        居中对齐,用空格进行填充
format方式格式化字符串符号列表:
符号    解释
 +      正数前加+,负数前加-
 -      正数前不加符号,负数前加-,为数值的默认形式
 空格   正数前加空格,负数前加-
"""
###format方法几种常见的用法如下:
###(1)使用位置符号。
print("The number {0:,} in hex is :{0:#x}, the number {1:,} in oct is {1:#o}".format(6666,8888))
#The number 6,666 in hex is :0x1a0a, the number 8,888 in oct is 0o21270
###(2)使用名称
print("{name} has {num} classes today!".format(name = "Abel", num = 10))  #Abel has 10 classes today!
###(3)通过属性
class Customer(object):
    def __init__(self, name, gender, phone):
        self.name = name
        self.gender = gender
        self.phone = phone
    def __str__(self):
        return "Customer ({self.name},{self.phone})".format(self = self)  #Customer (Abel,698569)
print(str(Customer("Abel","male","698569")))
###(4)格式化元组的具体项
arr = (6,9,8)
print("X1:{0[0]},X2:{0[1]},X3:{0[2]}".format(arr))   #X1:6,X2:9,X3:8
"""
为什么要尽量使用 format方式而不是%操作符来格式化字符串:
理由一:fmat方式在使用上较%操作符更为灵活。使用 format方式时,参数的顺序与格式化的顺序不必完全相同,而用%方法需要使用字典形式才能达到同样的目的。
理由二: format方式可以方便地作为参数传递。
理由三:%最终会被 format方式所代替。这个理由可以认为是最直接的原因,根据Python的官方文档,format方法最终会取代%,
       在Python3.0中format方法是推荐使用的方法,而之所以仍然保留%操作符是为了保持向后兼容。
理由四:%方法在某些特殊情况下使用时需要特别小心。
"""