1. 程式人生 > >Python的一些細節

Python的一些細節

1. 複數是由一個實數和一個虛數組合構成,表示為:x+yj

一個複數時一對有序浮點數 (x,y),其中 x 是實數部分,y 是虛數部分。

1、虛數不能單獨存在,它們總是和一個值為 0.0 的實數部分一起構成一個複數

2、複數由實數部分和虛數部分構成

3、表示虛數的語法:real+imagej

4、實數部分和虛數部分都是浮點數

5、虛數部分必須有後綴j或J

2. 基本語法是通過 {} 和 : 來代替以前的 % 。

format 函式可以接受不限個引數,位置可以不按順序

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)
'{:d}'.format(11)
'{:o}'.format(11)
'{:x}'.format(11)
'{:#x}'.format(11)
'{:#X}'.format(11)
1011
11
13
b
0xb
0XB
進位制

^, <, > 分別是居中、左對齊、右對齊,後面頻寬度;

 : 號後面帶填充的字元,只能是一個字元,不指定則預設是用空格填充;

+ 表示在正數前顯示 +,負數前顯示 -;  (空格)表示在正數前加空格;

b、d、o、x 分別是二進位制、十進位制、八進位制、十六進位制。

可以使用大括號 {} 來轉義大括號

3. 關於四捨五入的一些細節

  •  小數進位到整數:
print('0.5 {:.0f}'.format(0.5))
print('1.5 {:.0f}'.format(1.5))
print('2.5 {:.0f}'.format(2.5))
print('3.5 {:.0f}'.format(3.5))
print('4.5 {:.0f}'.format(4.5))
print('5.5 {:.0f}'.format(5.5))
print('6.5 {:.0f}'.format(6.5))
print('7.5 {:.0f}'.format(7.5))
print('8.5 {:.0f}'.format(8.5))
print('9.5 {:.0f}'.format(9.5))

結果:

0.5 0
1.5 2
2.5 2
3.5 4
4.5 4
5.5 6
6.5 6
7.5 8
8.5 8
9.5 10

結果中左邊為數值,右邊為進位後的值,從結果中可以發現,當帶進位為5時,進位結果滿足以下:

當整數個位為基數時,進位;

當整數個位為偶數時,舍尾;

  • 小數進位到小數:
print('0.205 {:1.2f}'.format(0.205))
print('0.215 {:1.2f}'.format(0.215))
print('0.225 {:1.2f}'.format(0.225))
print('0.235 {:1.2f}'.format(0.235))
print('0.245 {:1.2f}'.format(0.245))
print('0.255 {:1.2f}'.format(0.255))
print('0.265 {:1.2f}'.format(0.265))
print('0.275 {:1.2f}'.format(0.275))
print('0.285 {:1.2f}'.format(0.285))
print('0.295 {:1.2f}'.format(0.295))


print('0.05 {:1.1f}'.format(0.05))
print('0.15 {:1.1f}'.format(0.15))
print('0.25 {:1.1f}'.format(0.25))
print('0.35 {:1.1f}'.format(0.35))
print('0.45 {:1.1f}'.format(0.45))
print('0.55 {:1.1f}'.format(0.55))
print('0.65 {:1.1f}'.format(0.65))
print('0.75 {:1.1f}'.format(0.75))
print('0.85 {:1.1f}'.format(0.85))
print('0.95 {:1.1f}'.format(0.95))

print('0.205 {:1.2f}'.format(0.805))
print('0.215 {:1.2f}'.format(0.815))
print('0.225 {:1.2f}'.format(0.825))
print('0.235 {:1.2f}'.format(0.835))
print('0.245 {:1.2f}'.format(0.845))
print('0.255 {:1.2f}'.format(0.855))
print('0.265 {:1.2f}'.format(0.865))
print('0.275 {:1.2f}'.format(0.875))
print('0.285 {:1.2f}'.format(0.885))
print('0.295 {:1.2f}'.format(0.895))

結果:

0.205 0.20
0.215 0.21
0.225 0.23
0.235 0.23
0.245 0.24
0.255 0.26
0.265 0.27
0.275 0.28
0.285 0.28
0.295 0.29
0.05 0.1
0.15 0.1
0.25 0.2
0.35 0.3
0.45 0.5
0.55 0.6
0.65 0.7
0.75 0.8
0.85 0.8
0.95 0.9
0.205 0.81
0.215 0.81
0.225 0.82
0.235 0.83
0.245 0.84
0.255 0.85
0.265 0.86
0.275 0.88
0.285 0.89
0.295 0.90

可以發現,當帶進位為5時,小數進位沒有規

4.深拷貝與潛拷貝

淺拷貝:

x = [[1, 2], 2, 4]
y = x
x.append(5)
print(y)

z = x[:2]
print('原始z', z)
x[1] = 10
print('改變不可變型別', z)
x[0][0] = 10
print('改變可變型別', z)

class Node:
    def __init__(self, a):
        self.a = a
n = Node(1)
m = n
n.a = 2
print(m.a)
print(id(n)==id(m))

結果:

[[1, 2], 2, 4, 5]
原始z [[1, 2], 2]
改變不可變型別 [[1, 2], 2]
改變可變型別 [[10, 2], 2]
2
True

深拷貝:

from copy import deepcopy
x = [[1, 2], 2, 4]
y = deepcopy(x)
x.append(5)
print(y)

z = deepcopy(x[:2])
print('原始z', z)
x[1] = 10
print('改變不可變型別', z)
x[0][0] = 10
print('改變可變型別', z)

class Node:
    def __init__(self, a):
        self.a = a
n = Node(1)
m = deepcopy(n)
n.a = 2
print(m.a)
print(id(n)==id(m))

結果:

[[1, 2], 2, 4]
原始z [[1, 2], 2]
改變不可變型別 [[1, 2], 2]
改變可變型別 [[1, 2], 2]
1
False

淺拷貝:所謂淺複製,是指生產一個新的列表,並且把原列表中所有元素的引用都複製到新列表中。如果原列表中只包含整數、實數、複數等基本型別或元組、字串這樣的不可變型別,一般是沒有問題的。但是,如果原列表中包含列表之類的可變資料型別,由於淺複製時只是把子列表的引用複製到新列表中,這樣修改任何一個都會影響另外一個。

深拷貝:使用標準庫copy中的deepcopy()函式實現深複製。所謂深複製,是指對原列表中的元素進行遞迴,把所有的值都複製到新列表中,對巢狀的子列表不僅僅是複製引用。這樣一來,新列表和原列表是互相獨立,修改任何一個都不會