Python3.9 第三章 内建型态与运算子

3-1內建型态

 Python 当中,所有东西都是一个物件。物件可以当作是 Python 当中的最小单位,所以接下来要介绍的内建资料型态,都可以是物件。Python 的内建型态主要分为以下三种:

数值型态:int, float, bool
字串型态:str, chr
容器型态:list, dict, tuple

• Niklaus E. Writh 曾说过:Algorithms + Data Structures = Programs
• 在 Python 中所有的资料都是物件


3-1-1. 数值型态

3-1-1-1.整数

• 整数
– 型态为 int,不再区分整数与长整数
– Python3以后,整数型态为int,整数的长度不受限制(除了硬体上的限制之外)

接下來展示8, 10, 16 進位

>>> 10
10
>>> 0b1010
10
>>> 0o12
10
>>> 0xA
10

如果想知道int物件好用了多少位元組, 可以透過sys模組的getsizeof()函式

import sys

print(sys.getsizeof(43848947982))

#输出结果为32

Python3.6之后,可使用"_"区隔数字,增加可读性。

>>> 1_000_000_000
1000000

如果想知道资料型态,可以使用type()函式:

如下[code01]

x = 10
print(x)
print(type(x))

y = 20.0
print(y)
print(type(y))


#输出结果
'''
10
<class 'int'>
20.0
<class 'float'>
'''

任何数使用int()函式将转换成整数,布林值的True会转成1,False会转成0:

x = 3
print(int(x))
y = 3.14159
print(int(y))
z = False
print(int(False))


#输出结果
'''
3
3
0
'''

浮点数型态 float():

x = float(3.14159)
print(x)
print(int(float(3.14159)))

#输出结果
'''
3.14159
3
'''

布林型态:

布林型态的值只有两个,True与False,为bool型态

如下:非0值传True,反之传回False

*: None, False, complex, ' '空字串, () 空tuple, [ ]空清单, { }空字典传给bool都会传回False,其余则传回True

x = bool(True)
print(int(x))
y = bool(False)
print(int(y))
z = 16
print(bool(z))
ab = 0
print(bool(ab))
cd = -13
print(bool(cd))


#输出结果
'''
1
0
True
False
True

'''

复数(complex):

撰写时使用 a+bj的形式

x = 5 + 6j
y = 7 + 3j
print(x + y)
print(type(x + y))

#输出结果
'''
(12+9j)
<class 'complex'>
'''

3-1-2. 字串型态

如果要在Python表示字串可以使用單引號' '或雙引號" "包住文字,假设字串要使用单引号,则外面包住文字的引号要使用双引号,反之使用单引号,或着使用我们稍后会使用到的符号来解决问题。

"Jame's"
'jame"s'

基本字串表示:

如上所示,假设文字内都要使用单引号与双引号可以使用字串转译,如下

print('Jame\'s')
print("Jame\"s")

#Jame's
#Jame"s

下列为字串转译表示方式:

\\ 反斜线。
\' 单引号,使用' '来表示字串,又要表示单引号时使用,例如:'Jame\'s'。
\" 双引号,使用" "来表示字串,又要表示单引号时使用,例如:"Jame\"s"。
\ooo 以8进位数字表示字元码点,最多3位数,例如:'\101'表示字串'A'。
\xhh 以16进位数字hh表示字元码点,例如:'\x41'表示字串'A'。
\uhhhh 以16进位数字hhhh表示字元码点。
\Uhhhhhhhh 以16进位数字hhhhhhhh表示字元码点。
\0 空字元。
\n 換行。
\r 归位。

\t

Tab。

想要表示\t,就必須撰寫'\\t',這或許有些不方便,此時可以在字串前加上r。

print('\\t')
print(r'\t')

'''
\t
\t
'''

旧式字串格式化

资料形式:String % Data 

('string' % (d1, d2))

如下所示:.3f的3为输出结果为结果取到小数点第3位

print('Hi %s' % 'Jason')
print('%d ÷ %d = %.3f' % (10, 3, 10 / 3))

'''
Hi Jason
10 ÷ 3 = 3.333
'''

以下为常用格式化符号

%% %符号已经作为控制符号,如果要在字串表示%,必须使用%%
%f 十进位浮点数
%d 十进位整数
%g 十进位整数或浮点数
%e, %E 科学记号输出,分别为小写输出与大写输出
%o 8进位整数
%x, %X 16进位整数输出,分别为小写输出与大写输出
%s 字串格式符号
%r

以repr()函式获取的结果输出字串,稍后章节会更详细介绍repr()函式

可以使用+, -符号来决定字串靠右对齐或靠左对齐

x = 10
y = 3
print('%-5d ÷ %-5d = %8.2f' % (x, y, x / y))
print('%5d ÷ %5d = %8.2f' % (x, y, x / y))


'''
10    ÷ 3     =     3.33
   10 ÷     3 =     3.33
'''

新式字串格式化:

旧式格式化可读性差,建议使用新式,如下范例

*注意第二行,使用数字从0开始

print('{} ÷ {} = {}'.format(10, 3, 10 / 3))
print('{0} ÷ {1} = {2}'.format(10, 3, 10 / 3))
print('{x} ÷ {y} = {z}'.format(x = 10, y = 3, z = 10 / 3))



'''
10 ÷ 3 = 3.3333333333333335
10 ÷ 3 = 3.3333333333333335
10 ÷ 3 = 3.3333333333333335
'''

无论是使用上面第二行还是第三行的方式,都可以指定型态,也可指定栏位宽度与小数点数量

第三行与第四行的< , >是决定向左对齐或向右对齐。

第五行的 ^ 符号前面可以加上要填住空白的符号。

print('{0:6d} ÷ {1:6d} = {2:8.2f}'.format(10, 3, 10 / 3))
print('{x:6d} ÷ {y:6d} = {z:8.2f}'.format(x = 10, y = 3, z = 10 / 3))
print('{0:<6d} ÷ {1:<6d} = {2:<8.2f}'.format(10, 3, 10 / 3))
print('{0:>6d} ÷ {1:>6d} = {2:>8.2f}'.format(10, 3, 10 / 3))
print('{x:?^6d} ÷ {y:&^6d} = {z:8.2f}'.format(x = 10, y = 3, z = 10 / 3))


'''
    10 ÷      3 =     3.33
    10 ÷      3 =     3.33
10     ÷ 3      = 3.33    
    10 ÷      3 =     3.33
??10?? ÷ &&3&&& =     3.33
'''

format方法也可以进行些简单运算,像是使用索引取得清单元素值,使用键名称获取字典中对应的值,或存储模组中的名称:

names = ['James', 'Curry', 'Kevin']
print('EveryNames => {p[0]}, {p[1]}, {p[2]}'.format(p = names))

import sys
print('My MacOS is {pc.platform}'.format(pc = sys))



'''
EveryNames => James, Curry, Kevin
My MacOS is darwin
'''

单一格式化输出:

print(format(1.123456, '.2f'))


'''
1.12
'''

字串格式化实字:

从Python3.6开始,撰写字串实字时以f或F作为前置,就可以进行字串格式,f-strings:

name = 'James'
print(f'Hi, {name}')
print(f'3 x 4 = {3 * 4}')
print(f'{{}}')



'''
Hi, James
3 x 4 = 12
{}
'''

f-strings也可以做运算,例如if...else运算式,函式呼叫等都可以。例如:

(不易读不建议使用)

name = None
print(f'Hi', {"James!" if name == None else name})


'''
Hi {'James!'}
'''

3-1-3容器型态:

清单(list):

清单的型态是list,特性为有序,具备索引,内容与长度可以变动。建立串列可以使用[ ]实字:

x = [1, 2, 3]
print(x)
print(x[0])
print(x[1])
print(x[2])
x[1] = 40
print(x[1])
del x[0]
print(x)


'''
[1, 2, 3]
1
2
3
40
[40, 3]
'''

可以使用[ ]建立长度为0的list,可以对list使用append()   pop()   sort()   reverse()   remove()等方法

,若要附加多个元素可以使用extend()方法,例如x.extend([1, 2, 3]),想复制list,可使用copy()函式。

集合(set):

集合的內容無序,元素不重複。要建立集合,可以使用()包括元素:

如果要建立空集合,不是使用(),因为这会建立空的dict,而不是set,若想建立空集合,必须使用set()。新增元素,可以使用add()方法,移除元素可使用remove()方法,测试元素是否在内,可使用in方法。

names = set()
names.add('James')
names.add('Curry')
print(names)
names.remove('James')
print(names)
print('James' in names)
print('Curry' in names)


'''
{'Curry', 'James'}
{'Curry'}
False
True
'''

也可以使用先前说的copy(),若要合并set,可以使用update()。

x1 = {'你', '好'}
x2 = {'你', '是'}
a = x1.copy()
a.update(x2)
print(a)


'''
{'你', '是', '好'}
'''

字典(dict):

字典用来储存两两对应的键值:

_id = {'James' : 31, 'Curry' : 30}
print(_id['James'])
print(_id['Curry'])
_id['Kevin'] = 19
print(_id)
del _id['James']
print(_id)


'''
31
30
{'James': 31, 'Curry': 30, 'Kevin': 19}
{'Curry': 30, 'Kevin': 19}
'''

items():

_id = {'James' : 31, 'Curry' : 30}
print(list(_id.items()))
print(list(_id.keys()))
print(list(_id.values()))


'''
[('James', 31), ('Curry', 30)]
['James', 'Curry']
[31, 30]
'''

使用Dict来建立字典:

_id = dict(James = 31, Curry = 30, Kevin = 19)
print(_id)
_id = dict.fromkeys(['James', 'Curry'], 'NBA')
print(_id)

'''
{'James': 31, 'Curry': 30, 'Kevin': 19}
{'James': 'NBA', 'Curry': 'NBA'}
'''

也可以使用先前说的copy(),若要合并dict,可以使用update()。

x1 = {'a' : 1, 'b' : 2}
x2 = {'b' : 2.1, 'c' : 3}
y = x1.copy()
y.update(x2)
print(y)

'''
{'a': 1, 'b': 2.1, 'c': 3}
'''

Tuple:

Tuple跟list也是有很多地方很像喔! !是有序结构,可以使用[ ] 指定索引获得元素。

有时想要传回一组相关的值,又不想特别定义一个型态,就会使用Tuple。

data = 29, 'Curry', False
number, name, verified = data
print(data)
print(number)
print(name)
print(verified)

'''
(29, 'Curry', False)
29
Curry
False
'''

可将Tuple中的元素拆解,分配给每个Variable。

ant = 30, 'Curry', bool
print(ant)
print(type(ant))

'''
(30, 'Curry', <class 'bool'>)
<class 'tuple'>
'''

number, name, verified = [29, 'Curry', False]
print(number)
print(name)
print(verified)

'''
29
Curry
False
'''

3-2. 运算子

3-2-1. 运算子+ - * /

print(0.1 + 0.1 + 0.1)
print(1.0 - 0.8)


'''
0.30000000000000004
0.19999999999999996
'''

开发人员基本上要知道 IEEE 754 浮点数 算术标准,不使用小数点,而是使用分数及指数来表 示小数:
– 0.5 以 1/2 来表示
– 0.75 以 1/2+1/4 来表示 – 0.875 以 1/2+1/4+1/8
– 0.1 是1/16+1/32+1/256+1/512 +1/4096+1/8192+...没有止境

使用decimal.Decimal类别解决上面问题:

import decimal

y1 = decimal.Decimal((input()))
y2 = decimal.Decimal((input()))

print(f'{y1} + {y2} = {y1 + y2}')
print(f'{y1} - {y2} = {y1 - y2}')
print(f'{y1} * {y2} = {y1 * y2}')
print(f'{y1} / {y2} = {y1 / y2}')


'''
1
0.8
'''

'''
1 + 0.8 = 1.8
1 - 0.8 = 0.2
1 * 0.8 = 0.8
1 / 0.8 = 1.25
'''

次方**:

print(2 ** 3)
print(5 ** 5)
print(3 ** 0.5)


'''
8
3125
1.7320508075688772
'''

除法/   //:

print(10 / 3)
print(10 // 3)
print(10 // 3.0)


'''
3.3333333333333335
3
3.0
'''

结合字串应用:

str1 = 'James'
str2 = 'Curry'
print(str1 + str2)
print(str1 * 5 + str2 * 2)


'''
JamesCurry
JamesJamesJamesJamesJamesCurryCurry
'''
print('20' + str(1))
print(int('9') + 6)


'''
201
15
'''

list, tuple应用:

x1 = ['apple', 'group']
x2 = ['Kevin', 'Xiang']
print(x1 + x2)
print(x2 * 2 + x1 * 2)


'''
['apple', 'group', 'Kevin', 'Xiang']
['Kevin', 'Xiang', 'Kevin', 'Xiang', 'apple', 'group', 'apple', 'group']
'''
x1 = ['apple', 'group']
x2 = ['Kevin', 'Xiang']
y = (x1, x2)
print(y)


'''
(['apple', 'group'], ['Kevin', 'Xiang'])
'''

3-2-2. 比较运算子:

  • – >、>=、<、<=、==、!=、<>

  • <>效果与!=相同,不过建议不要再用

x1 = input()
x2 = input()

print(f'"{x1}" > "{x2}"  ? {x1 > x2}')
print(f'"{x1}" < "{x2}"  ? {x1 < x2}')
print(f'"{x1}" = "{x2}"  ? {x1 == x2}')
print(f'"{x1}" != "{x2}"  ? {x1 != x2}')


'''
6
5
"6" > "5"  ? True
"6" < "5"  ? False
"6" = "5"  ? False
"6" != "5"  ? True
'''

指定运算子:

+= a += b a = a + b
 -= a -= b a = a - b
*= a *= b a = a * b
/= a /= b a = a / b
%= a %= b a = a % b
&= a &= b a = a & b
|= a |= b a = a | b
^= a ^= b a = a ^ b
>>= a >>= b a = a >> b
<<= a <<= b a = a << b

3-2-3. 逻辑运算子

*且   and

*或   or

*相反   not

x1 = input()
x2 = input()

print('两数是否为大写?', x1.isupper() and x2.isupper())
print('一数是否为大写?', x1.isupper() or x2.isupper())
print('两数都不是大写?', not (x1.isupper() or x2.isupper()))


'''
a
D
两数是否为大写? False
一数是否为大写? True
两数都不是大写? False
'''

3-2-4. &(AND) |(OR) ^(XOR) ~(补数)运算子

(博主懒得写,很重要还是要学会)

3-2-5. 切片运算子

name = 'Kevinjay'
print(name[0:2])
print(name[2:])
print(name[:3])
print(name[:])
print(name[:-2])
print(name[-4:-1])

'''
Ke
vinjay
Kev
Kevinjay
Kevinj
nja
'''
x = 1, 2, 3, 4, 5
print(x[0:2])
print(x[1:])
print(x[:4])
print(x[-5:-1])
print(x[::-1])


'''
(1, 2)
(2, 3, 4, 5)
(1, 2, 3, 4)
(1, 2, 3, 4)
(5, 4, 3, 2, 1)
'''

3-2-6. 拆解运算子* **

#tuple
a, *b = (1, 2, 3, 4, 5)
print(a)
print(b)
print() #換行

#list
a, *b, c = (1, 2, 3, 4, 5)
print(a)
print(b)
print(c)
print()

#set
a, *b = {1, 2, 3}
print(a)
print(b)
print()

#range
a, *b, c = range(5)
print(a)
print(b)
print(c)
print()

#dict
a, *b = {'x' : 1, 'y' : 2, 'z' : 3}
print(a)
print(b)




'''
1
[2, 3, 4, 5]

1
[2, 3, 4]
5

1
[2, 3]

0
[1, 2, 3]
4

x
['y', 'z']
'''
x1 = {'你', '好'}
x2 = {'你', '是'}
y = {*x1, *x2}
print(y)


'''
{'是', '好', '你'}
'''

dict想得出键与值使用**,只要得出键使用* :

x1 = {'a' : 1, 'b' : 2}
x2 = {'b' : 3, 'c' : 4}
y1 = {*x1, *x2}
y2 = {**x1, **x2}
print(y1)
print(y2)


'''
{'c', 'a', 'b'}
{'a': 1, 'b': 3, 'c': 4}
'''
上一篇:差分矩阵


下一篇:伽马分布定义