printf()字符串格式化  2018/11/13

目录:
    1.print()函数
    2.print()控制格式
    3.函数实现
    4.字符映射
    
    5.备注:
        示例1
        示例2
        实例3
       6.附录
        6.1格式化符号表
    7.文字字符串插值str_f
===================================================================
1.print()函数
1.1.函数:
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)#输出到文件或显示屏
    # 参数:
    file:    文件的对象(流); 默认sys.stdout.
    sep:   值之间插入的字符串,默认为空格
    end:   在最后一个值之后追加的字符串,默认为换行符
    flush: 是否强行刷新流
    
1.2.实例
print('hello', 'world', sep='%')    # 输出 hello%world
print('hello', 'world', end='*')     # 输出 hello world*,并且不换行
sys.stdout.write(str(i))                 # 输出不换行
    
==================================================================
2.print()控制格式:
    str=%[(name)][flags][width].[precision] #返回str
    
# 参数:
1)  (name)#映射变量(字典参数)
            "name=%(k1);age= %(k2)" % {'k1':'Tom','k2':20} #k1='Tom';k2=20
2) flags
        a.对齐格式:string:+默认右对齐;-左对齐。
                             数字: +在正数前显示+号;-默认取消显示;
    
            '%-10s' % 'hello world'            # ’hello world         ‘ 左对齐10个占位符
            '%+10.2f' % 3.141592673829   # '     +3.14'
    
        b.数字填充: ' ' <sp>默认在正数左侧填充一个空格;0表示使用0填充。
                             # 8进制数前显示零,16进制前面显示'0x'或'0X'(取决于用'x'或'X')
    
            '%10.2f' % 3.141592673829     # '      3.14'
            '%010.2f' % 3.141592673829   # '0000003.14'
    
3)  width      #表示最小显示宽度;占位符位数。 参考示例1
4)  precision
    
    (1)string:表示取n个字符;
        str='%.2s' % 'hello' #'he'
    (2)number: f,e格式:float表示取几位小数
                      g格式:几位有效数字,使用小数或科学计数法
    
            '%.3f' % 3.141592657     # '3.142'
            '%g' % 1111.1111           # 默认6位有效数字 '1111.11'
            '%.2g' % 1111.1111        # 2位有效数字,自动转换为科学计数法 '1.1e+03'
            format(0.0015,'.2e')        #科学计数法'1.50e-03'
    
5) *定义宽度或者小数点精度(替代width,precision) 参见实例2
            "%*.*f" % (10,4, 1.2)       # 等价 "%10.4f" % (1.2) #'    1.2000'
            "%.*s" % (3, 'TomNo')    # 'Tom'
            "%*.*f%*.*f%*.*f" % (10,1 ,x,10,1,x*x,10,1,x*x*x)
    
================================================================
3.函数实现
    
3.1函数
    str.rjust(),strljust(),str.center()#字符左右中心对齐
    str.zfill()                                  #正数前填零
    
3.2.实例:
repr(3.1415).rjust(10)                # '    3.1415'
'-3.14'.zfill(7)                              #填零 '-003.14'总位数为7
repr(3.1415).rjust(2).zfill(10)      # '00003.1415'
    
x=3.1415
print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ') #字符串右对齐左填空格center
                                                                         # 3.1415 9.86902225 3.1415
print(str(x).rjust(2), repr(x*1).rjust(3)[:2])          #截断# 3.
    
================================================================
4.字符映射
    
    class Default(dict):
        def __missing__(self, key):
            return key
    
    '{name} was born in {country}'.format_map(Default(name='Guido'))
    # 'Guido was born in country'
    
    String.maketrans(from, to)
    # 返回256个字符翻译表(from中字符被转换成to, from和to是等长)
    
    S.translate(table[, deletechars])
    # 用翻译表对S翻译,并把deletechars中有的字符删掉。
    # 需要注意的是,如果S为unicode字符串,那么就不支持 deletechars参数
    
================================================================
    
备注:
    
# 示例1:
for x in range(10):
    print('%10d%10d%10d'%(x,x*x,x*x*x))
    

# 示例2
for x in range(10):
    print("%*.*f%*.*f%*.*f" % (10,1 ,x,10,1,x*x,10,1,x*x*x))
    
# 实例3
for x in range(1,11):
        print(str(x).ljust(4), str(x*x).ljust(6), end=' ')
        print(str(x*x*x).ljust(8  ))

输出结果:实例1

 

输出结果:实例2

 

输出结果:实例3

0

0

0

 

0.0

0.0

0.0

 

1

1

1

1

1

1

 

1.0

1.0

1.0

 

2

4

8

2

4

8

 

2.0

4.0

8.0

 

3

9

27

3

9

27

 

3.0

9.0

27.0

 

4

16

64

4

16

64

 

4.0

16.0

64.0

 

5

25

125

5

25

125

 

5.0

25.0

125.0

 

6

36

216

6

36

216

 

6.0

36.0

216.0

 

7

49

343

7

49

343

 

7.0

49.0

343.0

 

8

64

512

8

64

512

 

8.0

64.0

512.0

 

9

81

729

9

81

729

 

9.0

81.0

729.0

 

10

100

1000

格式化符号

 

 

 

 

 

 

 

符   号 

描述

数据类型

实例

remark     

%b    

二进制整数

 

 

不能够用

d, i     

十进制整数

int,float  

print('%d' % -3.14)#3  print('%i' % -3.14)#-3

 

o       

八进制

int          

print('%o' % -20)#-24

 

u       

十进制整数

int,float  

print('%u' % -3.14)#-3

 

x,X     

十六进制

int            

print('%x' % -0xa)#-a  print('%x' % -10)#-a

 

e,E     

f科学计数法

int,float 

print('%e' % -31415926)#-3.141593e+07   

保留小数点后六位有效数

 

 

 

print('%e' % -300) #-3.000000e+02

 

f,F     

十进制f

float     

print('%f' % -31415926) #-31415926.000000 

保留小数点后六位有效数

g,G      

g,G      

print('%g' % 3.141592657)#3.14159

%f和%e的简写;小数或科学计数法

c

单字符

char,int    

print('%c' % 'a')#a print('%c' % 97)#a

 

r(repr)      

转换字符串

 str,int,float  

print('%r' % 3.14)#3.14   

 print('%r' % 'a\n\n\n')#'a\n\n\n' 

 

 

 

print('%r' % r'a\n\n\n')#'a\\n\\n\\n'

 

s(str)       

转换字符串

 str,int,float 

print('%s' % 3.14)#3.14 print('%s' % 'ss')#ss

 

 

 

 

 

 

辅助

 

 

 

 

符   号 



描述


*

 

 

定义宽度或者小数点精度

 

-

 

 

左对齐

 

+

 

 

正数前显示加号( + )

 

" " ;<sp>

 

 

在正数前面显示空格

 

#

 

 

八(16)进制数前面显示零'0'('0x'者'0X')

 

0

 

 

数字前面填充'0'

 

%

 

 

'%%'输出一个单一的'%'

 

(var)

 

 

映射变量(字典参数)

 

m.n.

 

 

m 显示最小总宽度,n 小数点后位数(可用的话)

 

文字字符串插值str_f   2018/11/14
    
https://www.python.org/dev/peps/pep-0498/
===================================================================
1.格式:
f'<text> {<expression> <optional!s,!r或!a> <optional:format specifier>} <text> ...'#返回str
#类似于str.format(),但又差别。
    
2.注意事项
    
# 1) 'f'可与'r'或'R'组合产生原始f-string文字。'f'不能与'b','u'组合,不能用二进制f字符串。
# 2) 反斜杠可能不会出现在表达式中的任何位置。表达式中不允许使用'#'字符的注释
# 3) 表达式不能包含':'或'!' 在字符串或括号,括号或大括号之外。唯一例外允许'!='运算符
# 4) 格式化的字符串文字不能用作文档字符串,即使它们不包含表达式。
    
===================================================================
3.实例
    
# 3.1.str,number
name = "Tom"
f"Name= {name}."             #'Name= Tom.'
f"Name= {repr(name)}."    #"Name= 'Tom'."
f'Name= {name!r}'             # "Name= 'Tom'"
    
f'''One {name[1:3]} two'''   # 'One om two'
    
d = {'a': 10, 'b': 20}
f'a={d["a"]}'    # 'a=10'
a = 'b'
f'a={d[a]}'       #'a=20'
    
# 3.2.数字格式:f"{value:{width}.{precision}"
width = 10;precision = 4;value = 12.34567
f"result: {value:{width}.{precision}}"  #'result:      12.35'
    
# 3.3.日期格式:f"{date:'%y/%m/%d'}"
import datetime
today=datetime.date.today()
f"{today:'%Y-%m-%d'}"        # "'2018-11-14'"
    
# 3.4. 2,8,,16进制:            f"{int:#[0b][0o][0x]}"
f"{10:#0x}"# '0xa'
f"{10:#0o}"# '0o12'
f"{10:#0b}"# '0b1010'
    
# 3.5.转义字符:
# 格式表达式中不允许反斜杠:要包含需要反斜杠转义的值,请创建一个临时变量
# f"newline: {ord('\n')}"  # raises SyntaxError
    
newline = ord('\n')
f"newline: {newline}"# 'newline: 10'
f'{{{4 * 10}}}'               #'{40}'
fr'x = {4 * 10} \ n'       # '×= 40 \\ N'
header = 'Subject'
    
# 3.6.多行书写
x=0
f'''{x
+1}'''                # '1'
    
d={0:'zero'}
f'''{d[0
]}'''                  # 'zero'
    
#3.7.字符串连接
x=10;y='hi'
'a' 'b' f'{x}' '{c}' f'str<{y:^4}>' 'd' 'e'  #'ab10{c}str< hi >de'
    
#3.8.表达式
f'mapping is { {a:b for (a, b) in ((1, 2), (3, 4))} }' # 'mapping is {1: 2, 3: 4}'
f'{(lambda x: x*2)(3)}'   # '6'
    
# 3.9.函数
def foo():return 20
f' result={foo()}'     # ' result=20'
    
lst = [0]
def fn(x, y):
...    result =x[0]
...    x[0] += y
...    return result
    
f'{fn(lst,2)} {fn(lst,3)}'# '0 2'
f'{fn(lst,2)} {fn(lst,3)}'#'5 7'
    
# 3.10.循环
# for i in range(3):
#     s=f'{i}:{d[i]}'
#     print(s)
# 循环中的表达式易出错,不要运用
====================================================================