数值型态:int, float, bool
字串型态:str, chr
容器型态:list, dict, tuple
• Niklaus E. Writh 曾说过:Algorithms + Data Structures = Programs
• 在 Python 中所有的资料都是物件
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'> '''
如果要在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!'} '''
清单(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 '''
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']) '''
– >、>=、<、<=、==、!=、<>
<>效果与!=相同,不过建议不要再用
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 |
*且 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 '''
(博主懒得写,很重要还是要学会)
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) '''
#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} '''