1. 程式人生 > >python全棧_007_Python3格式化輸出

python全棧_007_Python3格式化輸出

1:%用法

1.1:整數的輸出:

%o —— oct 八進位制
%d —— dec 十進位制 ;%nd:至少輸出n位,不足n位就在其左邊補空格
%x —— hex 十六進位制

a = 123
print('%o' % (a) )
print('%3d' % (a) )
print('%5d' % (a) )
print('%-5d' % (a) )
print('%x' % (a) )

1.2:浮點數的輸出:

1.2.1 格式化輸出

%f ——保留小數點後面六位有效數字(會對第7位進行四捨五入處理)
  %.3f,保留3位小數位(會對第4位進行四捨五入處理)
%e ——保留小數點後面六位有效數字,指數形式輸出
  %.3e,保留3位小數位,使用科學計數法
%g ——在保證六位有效數字的前提下,使用小數方式,否則使用科學計數法
  %.3g,保留3位有效數字,使用小數或科學計數法
# %f
a = 12.123456789
print("%f" % (a))    #  12.123457
print("%.7f" % (a))  #  12.1234568

a = 12.123456
print("%f" % (a))    #  12.123456
print("%.7f" % (a))  #  12.1234560

# %e
a = 12.123456789
print("%e" % (a))    #  1.212346e+01
print("%.7e" % (a))  #  1.2123457e+01

# %g
a = 12345.123456789
print
("%g" % (a)) # 12345.1 print("%.7g" % (a)) # 12345.12 print("%.3g" % (a)) # 1.23e+04

1.2.2 內建round()

  round(number[, ndigits])
  引數:
  number - 這是一個數字表達式。
  ndigits - 表示從小數點到最後四捨五入的位數。預設值為0。
  返回值
  該方法返回x的小數點舍入為n位數後的值。

  round()函式只有一個引數,不指定位數的時候,返回一個整數,而且是最靠近的整數,類似於四捨五入,當指定取捨的小數點位數的時候,一般情況也是使用四捨五入的規則,但是碰到.5的情況時,如果要取捨的位數前的小數是奇數,則直接捨棄,如果是偶數則向上取捨。

  注:“.5”這個是一個“坑”,且python2和python3出來的介面有時候是不一樣的,儘量避免使用round()函式吧

print(round(1.1235))    # 1
print(round(1.1236,3))  # 1.124
print(round(1.1235,3))  # 1.123  ?? 不應該是1.124嗎??
print(round(1.1245,3))  # 1.125

print(round(0.5))  # 0  ?? 不應該是1 嗎
print(round(1.5))  # 2
print(round(2.5))  # 2  ?? 不應該是3 嗎

print(round(1.475,2))  # 1.48
print(round(2.475,2))  # 2.48

print(round(1.575,2))  # 1.57  ????
print(round(2.575,2))  # 2.58  ????

print(round(1.675,2))  # 1.68  ????
print(round(2.675,2))  # 2.67  ????

1.3:字串輸出:

'''
%s
%10s   ——右對齊,佔位符10位
%-10s  ——左對齊,佔位符10位
%.2s   ——擷取2位字串
%10.2s ——10位佔位符,擷取兩位字串

'''
s = 'abcdef'
print('[%s]' % s)
print('[%10s]' % s)
print('[%-10s]' % s)
print('[%.2s]' % s)
print('[%10.2s]' % s)
print('[%-10.2s]' % s)

輸出結果:

1.4:其他:

 1.4.1:字串格式程式碼

序號 符號 說明
1 %s 字串
2 %c 字元
3 %d 十進位制整數
4 %i 整數
5 %u 無符號整數
6 %o 八進位制整數
7 %x 十六進位制整數
8 %X 十六進位制整數大寫
9 %e 浮點數格式1
10 %E 浮點數格式2
11 %f 浮點數格式3
12 %g 浮點數格式4
13 %G 浮點數格式5
14 %% 字元%

 

a = 255
print('%s' % ('hello'))
print('%c' % ('h'))
print('%d' % (a))  # 255
print('%i' % (a))  # 255
print('%u' % (-1)) # -1  ??? 為什麼不是把 -1 轉換為正數??
print('%o' % (a))  # 377
print('%x' % (a))  # ff
print('%X' % (a))  # FF

f = 12378921.123456789
print('%e' % f)
print('%E' % f)
print('%f' % f)
print('%g' % f)
print('%G' % f)

print('%d%%' % (89))  # 輸出 89%

 1.4.2:常用轉義字元

序號 轉義字元 說明
1 \ (在行尾時) 續行符
2 \\ 代表一個反斜線字元''\'
3 \' 代表一個單引號(撇號)字元
4 \" 代表一個雙引號字元
5 \a 響鈴(BEL)
6 \b 退格(BS) ,將當前位置移到前一列
7 \e 轉義
8 \000
9 \n 換行(LF) ,將當前位置移到下一行開頭
10 \v 垂直製表(VT)
11 \t 水平製表(HT) (跳到下一個TAB位置)
12 \r 回車(CR) ,將當前位置移到本行開頭
13 \f 換頁(FF),將當前位置移到下頁開頭
14 \oyy 八進位制數yy代表的字元,如:\o12代表換行符
15 \xyy 十六進位制yy代表的字元,如:\x0a代表換行符
16 \other 其它的字元以普通格式輸出

 

2:format用法

   相對基本格式化輸出採用‘%’的方法,format()功能更強大,該函式把字串當成一個模板,通過傳入的引數進行格式化,並且使用大括號‘{}’作為特殊字元代替‘%’

 2.1:位置匹配:

a:不帶編號,即"{}"
b:帶數字編號,可調換順序,即"{1}","{2}"
c:帶關鍵字,即"{name}","{age}"
'''
a:不帶編號,即"{}"
b:帶數字編號,可調換順序,即"{1}","{2}"
c:帶關鍵字,即"{name}","{age}"
'''

print('{} {}'.format('come on','baby')) # 不帶欄位
print('{0} {1}'.format('come on','baby')) # 帶數字編號
print('{0} {1} {0}'.format('come on','baby')) # 帶數字編號,打亂順序
print('{1} {1} {0}'.format('come on','baby')) # 帶數字編號,打亂順序
print('{come} {b}'.format(b = 'baby',come = 'come on')) # 帶關鍵字

# 通過位置匹配:
print('通過位置匹配:')
print('{0},{1},{2}'.format('a','b','c'))
print('{},{},{}'.format('a','b','c'))
print('{2},{1},{0}'.format('a','b','c'))  # 打亂順序
print('{2},{1},{0}'.format(*'1234'))      # 打亂順序
print('{2},{0},{0}'.format('a','b','c'))  # 可重複

# 通過下標或key匹配引數
print('通過下標或key匹配引數:')
point = (5,9)
print('x:{0[0]},y:{0[1]}'.format(point)) # x:5,y:9
dic = {'key1':'value1','key2':'value2'}
print('x:{0[key1]},y:{0[key2]}'.format(dic))  # x:value1,y:value2
s = 'hello'
print('{0[0]},{0[1]},{0[0]}'.format(s))  # h,e,h

 2.2:格式轉換:

'''
格式轉換
'b' - 二進位制。將數字以2為基數進行輸出。
'c' - 字元。在列印之前將整數轉換成對應的Unicode字串。
'd' - 十進位制整數。將數字以10為基數進行輸出。
'o' - 八進位制。將數字以8為基數進行輸出。
'x' - 十六進位制。將數字以16為基數進行輸出,9以上的位數用小寫字母。
'e' - 冪符號。用科學計數法列印數字。用'e'表示冪。
'g' - 一般格式。將數值以fixed-point格式輸出。當數值特別大的時候,用冪形式列印。
'n' - 數字。當值為整數時和'd'相同,值為浮點數時和'g'相同。不同的是它會根據區域設定插入數字分隔符。
'%' - 百分數。將數值乘以100然後以fixed-point('f')格式列印,值後面會有一個百分號。
'''

a = 65
b = 66
c = 67
print(chr(a),chr(b),chr(c))
print('{:b}'.format(a))             # 不帶編號
print('{2:b}'.format(c,b,a))        # 帶編號
print('{name:b}'.format(name = a))  # 帶關鍵字

b = 66
print('{:b}'.format(b))   # 二進位制形式輸出
print('{0:c}'.format(b))  # 字元形式輸出
print('{0:d}'.format(b))  # 十進位制數形式輸出
print('{0:o}'.format(b))  # 八進位制數形式輸出
print('{0:x}'.format(b))  # 十六進位制數形式輸出
print('{0:e}'.format(b))  # 用科學計數法列印數字。用'e'表示冪。
print('{0:g}'.format(b))  # 一般格式。將數值以fixed-point格式輸出。當數值特別大的時候,用冪形式列印。
print('{0:n}'.format(b))  # 當值為整數時和'd'相同,值為浮點數時和'g'相同。不同的是它會根據區域設定插入數字分隔符。
print('{0:%}'.format(b))  # 將數值乘以100然後以fixed-point('f')格式列印,值後面會有一個百分號。

 2.3:進階用法:

2.3.1:進位制轉換

a = 66
b = '{:#x}'.format(a)
print(a,b)
print('int:{0:d},hex:{0:x},oct:{0:o},bin:{0:b}'.format(a))
print('int:{0:d},hex:{0:#x},oct:{0:#o},bin:{0:#b}'.format(a)) # 在前面加'#',則帶進位制字首

2.3.2:左中右對齊及位數補全

a): <: (預設)左對齊; >:右對齊; ^:中間對齊;=:(只用於數字)在小數點後進行補齊
b): 取位數“{:4s}”、"{:.2f}"等
'''
a): <: (預設)左對齊; >:右對齊; ^:中間對齊;=:(只用於數字)在小數點後進行補齊
b): 取位數“{:4s}”、"{:.2f}"等
'''

s1 = 'hello'
s2 = 'world'
print('1:[{}] and [{}]'.format(s1,s2)) # 預設預設左對齊
print('2:[{:10s}] and [{:>10s}]'.format(s1,s2)) # 取10位左對齊,取10位右對齊
print('3:[{:^10s}] and [{:^10s}]'.format(s1,s2)) # 取10位中間對齊

f1 = 3.145123456
f2 = 3.143
print('4:[{}],[{:.2f}]'.format(f1,f1)) # 原樣輸出,取2位小數
print('5:[{}],[{:>10.2f}]'.format(f1,f1)) # 原樣輸出,右對齊,取10位,其中取2位小數

s1 = 'HelloWorld'
print('6:[{:<30}]'.format(s1))  # 左對齊
print('7:[{:>30}]'.format(s1))  # 右對齊
print('8:[{:^30}]'.format(s1))  # 中間對齊
# 填充
print('9:[{:*^30}]'.format(s1))
print('10:[{:0^30}]'.format(s1))

print('11:[{:0=30}]'.format(11))
print('12:[{:0>30}]'.format(11))

執行結果:

2.3.3:正負符號顯示

f1 = 3.158
f2 = -3.158
print('1:[{}];[{}]'.format(f1,f2))
print('2:[{:+f}];[{:+f}]'.format(f1,f2)) # 總是顯示符號
print('3:[{:f}];[{:f}]'.format(f1,f2)) #
print('4:[{: f}];[{: f}]'.format(f1,f2)) # f前面有空格,若是+數,則在前面留空格
print('5:[{:-f}];[{:-f}]'.format(f1,f2)) # -數時顯示-,與'{:f}; {:f}'一致

執行結果:

2.3.4:百分數 %

# 百分數%
print('{:.2f}'.format(1 / 3))  # 0.33
print('{:.2%}'.format(1 / 3))  # 33.33%

2.3.5:時間

import datetime
d = datetime.datetime(2018,12,12,11,29,56)
print('{:%Y-%m-%d %H:%M:%S}'.format(d)) # 2018-12-12 11:29:56

2.3.6:逗號","分隔金錢,沒以前進位

# 逗號","分隔金錢,沒以前進位
print('{:,}'.format(1234567890123456789)) # 1,234,567,890,123,456,789

2.3.7:佔位符巢狀

print('--1:' + '-'*30)
for align, text in zip('<^>', ['left', 'center', 'right']):
    print(align,text)
print('--2:' + '-'*30)
for align, text in zip('<^>', ['left', 'center', 'right']):
    print('{0:{fill}{align}16}'.format(text, fill=align, align=align))
    # print('{0:<<16}'.format(text))
    # print('{0:^^16}'.format(text))
    # print('{0:>>16}'.format(text))
print('--3:' + '-'*30)
octets = [192, 168, 0, 1]
print('{:02X}{:02X}{:02X}{:02X}'.format(*octets))
print('{:0>2X}{:0>2X}{:0>2X}{:0>2X}'.format(*octets))
print('{:0<2X}{:0<2X}{:0<2X}{:0<2X}'.format(*octets))
print('--4:' + '-'*30)
width = 5
for num in range(5,12):
    for base in 'dXob':
        print('{0:{width}{base}}'.format(num,base = base,width = width),end = ' ')
    print('')

執行結果:

2.3.8:佔位符%s和%r

"""
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
conversion ::= "r" | "s" | "a"
這裡只有三個轉換符號,用"!"開頭。
"!r"對應 repr();"!s"對應 str(); "!a"對應ascii()。
"""

print("repr() shows quotes: {!r}; str() doesn't: {!s};{!a}".format('1234', '1235', '23'))
print(repr('1234'))
print(str('1234'))
s = repr('234')
print(s,type(s))
print(ascii('65'))

 2.4:format的用法變形:

# 1: a.format(b)
s1 = 'Hello'
s2 = 'World'
print('{0} {1}'.format(s1,s2))

# 2: f'xxxxxx'
# 可以在字串前加f以達到格式化的目的,在{}里加入物件,此為format的另一種形式:
s1 = 'Hello'
s2 = 'World'
print(f'{s1} {s2}')
print(f'{len(s1)} {s2.count("o")} {s2.upper()}') # 還可以使用函式


name = '你大爺'
age = 18
sex = 'Man'
job = "IT"
salary = 8888.9868

print(f'my name is {name.capitalize()}. the len of {name} is {len(name)}')
print(f'I am {age:*^10} years old.')
print(f'I am a {sex}')
print(f'My salary is {salary:10.3f}')