Python3程序設計指南:02 數據類型

[TOC]python

數據類型導圖

一、標識符與關鍵字

建立一個數據項時,咱們或者將其賦值給一個變量,或者將其插入到一個組合中。爲對象引用賦予的名稱叫標識符segmentfault

1.1 規則

有效的Python標識符是任意長度的飛空字符序列,其中包括一個「引導字符」,以及0個或多個「後續字符」,Python標識符必須符合兩條規則api

  1. 只要是Unicode編碼的字母,均可以充當引導字符,包括ASCII字母、下劃線以及大多數非英文語言的字母。
  2. Python標識符不能與Python關鍵字同名。

如何查看Python關鍵字呢?只需兩行代碼:app

# 查看Python關鍵字
import keyword
print(keyword.kwlist)

輸出結果以下:ide

['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

1.2 約定

  1. 不要使用Python預約義的標識符名對自定義的標識符進行命名。
  2. 避免使用開頭和結尾都是下劃線的標識符。由於Python定義了各類特殊方法和變量,使用的就是這樣的名稱。

二、Integral類型

Python提供了兩種內置的Integral類型,即intbool。在布爾表達式中,0與False都表示False,其餘任意整數與True都表示True。在數字表達式中,True表示1,False表示0。函數

2.1 整數

整數的大小隻受限於機器的內存大小。默認狀況下,整數採用的是十進制。二進制以0b引導,八進制以0o引導,十六進制以0x引導,大小寫均可以。測試

2.1.1 數值型操做符與函數

語法 描述
x+y 將數x與數y相加
x-y 從x減去y
x*y 將x與y相乘
x/y 用x除以y,獲得一個浮點值(若是x或y是複數就產生一個複數)
x//y 用x除以y,捨棄小數部分,獲得一個整數
x%y 用x除以y,取模(餘數)
x**y x的y次冪
-x 對x取複數,若是x非零,就改變其符號
+x 不作任何操做,有時候用於澄清代碼
abs(x) 返回x的絕對值
divmod(x,y) 以二元組的形式返回x除以y所得的商和餘數(兩個整數)
pow(x,y) 與x**y等同
pow(x,y,z) (x**y)%z的另外一種寫法
round(x,n) 返回浮點數x四捨五入後獲得的相應整數(若是給定n,就將浮點數轉換爲小數點後有n位)

全部二元數學操做符(+、-、*、/、//、%、與**)都有相應的加強版賦值操做符(+=、-=、*=、/=、//=、%=、與**=)。this

2.1.2 使用數據類型建立對象

對象的建立能夠經過給變量賦字面意義上的值,好比x=17,或者將相關的數據類型做爲函數進行調用,好比x=int(17)編碼

使用數據類型建立對象時,有3種用例:spa

  1. 不使用參數調用數據類型函數。此時,對象會被賦值爲一個默認值,好比x=int()會建立一個值爲0的整數。全部內置數據類型均可以做爲函數並不帶任何參數進行調用。
  2. 使用一個參數調用數據類型函數。若是給定的參數是一樣的數據類型,就會建立一個新對象;不然會嘗試進行轉換。

    • 若是給定參數支持到給定數據類型的轉換,可是轉換失敗,會產生一個ValueError異常,不然返回給定類型的對象。
    • 若是給定參數不支持到給定數據類型的轉換,就會產生一個TypeError異常。

整數轉換函數:

語法 描述
bin(i) 返回整數i的二進制表示(字符串),好比bin(100)='0b01100100'
hex(i) 返回整數i的十六進制表示(字符串),好比hex(100)='0x64'
int(x) 將對象x轉換爲整數,失敗時會產生ValueError異常,若是x的數據類型不知道到整數的轉換,就會產生TypeError異常;若是x是一個浮點數,就會截取其整數部分
int(s, base) 將字符串s轉換爲整數,若是給定了可選的基參數,那麼應該爲2到36之間的整數
oct(i) 返回整數i的八進制表示(字符串),好比oct(100)='0o144'
  1. 給定兩個或多個參數——但不是全部數據類型都支持,而對支持這一狀況的數據類型,參數類型以及內涵都是變化的。

2.1.3 整數位邏輯操做符

語法 描述
i\ j 對整數i和整數j進行爲邏輯OR運算
i^j 對整數i和整數j進行爲邏輯XOR運算
i&j 對整數i和整數j進行爲邏輯AND運算
i<<j 將i左移j位,相似於i(2*j),但不帶溢出檢查
i>>j 將i左移j位,相似於i//(2**j),但不帶溢出檢查
~i 反轉i的每一位

2.2 布爾型

有兩個內置的布爾型對象:TrueFalse

布爾數據也能夠當作函數進行調用——不指定參數時將返回False,給定的是布爾型參數時,會返回該參數的一個拷貝,給定的是其餘類型的參數時,則會嘗試將其轉換爲布爾數據類型。

全部內置的數據類型與標準庫提供的數據類型均可以轉換爲一個布爾型值。

三、浮點類型

Python提供了3中浮點值:內置的float與complex類型,以及來自標準庫的decimal.Decimal類型。

float類型存放雙精度的浮點數。

3.1 浮點數

比較兩個float數是否相等(按機器所能提供的最大精度):

import sys

def equal_float(a, b):
    return abs(a - b) <= sys.float_info.epsilon

Python的floatS一般會提供之多17個數字的精度。

3.2 複數

複數這種數據類型是固定的,其中存放的是一對浮點數,一個表示實數部分,一個表示虛數部分。複數的兩個部分都以屬性名的形式存在,分別爲real與imag,例如:

z = -23.1+8.94j
print(z.real, z.imag)

除//、%、divmod()以及三個參數的pow()以外,全部數值型操做符與函數均可以用於對複數進行操做,賦值操做符的加強版也能夠。

複數類型有一個方法conjugate()用於改變虛數部分的符號,例如:

z = -23.1+8.94j
y = z.conjugate()

###
y = -23.1-8,94j

要使用複數,能夠先導入cmath模塊,該模塊提供了math模塊中大多數三角函數與對數的複數版,也包括一些複數特定的函數。

3.3 十進制數

decimal模塊能夠提供固定的十進制數,其精度能夠由咱們本身指定。涉及Decimals的計算要比浮點數的計算慢。

In [5]: import decimal
In [6]: a = decimal.Decimal(4532)
In [7]: b = decimal.Decimal("543129.98789798")
In [8]: a+b
Out[8]: Decimal('547661.98789798')

十進制數是由decimal.Decimal()函數建立,該函數能夠接受一個整數或一個字符串做爲參數——但不能以浮點數做爲參數,由於浮點數不夠精確。

四、字符串

字符串是使用固定不變的str數據類型表示的,其中存放Unicode字符序列。

4.1 str()函數

str()函數的用法:

  • 建立字符串對象,參數爲空時,返回一個空字符串,參數爲非字符串類型時返回改參數的字符串形式,參數爲字符串時,返回該字符串的拷貝。

    In [9]: string1 = str()
    In [10]: string2 = str(1234)
    In [11]: string3 = str('hello')
    
    In [12]: string1
    Out[12]: ''
    
    In [13]: string2
    Out[13]: '1234'
    
    In [14]: string3
    Out[14]: 'hello'
  • 轉換函數,此時要求第一個參數爲字符串或能夠轉換爲字符串的其餘數據類型,其後跟兩個可選的字符串參數,其中一個用於指定要使用的編碼格式,另外一個用於指定如何處理編碼錯誤。

4.2 字符串的表示

  • 單引號:s = 'hello'
  • 雙引號:s = "hello"
  • 三引號:s = '''hello python'''s = """hello python"""

在引號包含的字符串中使用引號:

  • 使用與引號包含的字符串不一樣的引號,例如s = "this is a 'str'."
  • 若是二者引號相同,那就須要使用轉義字符,例如s = "this is a \"str\"."

若是要寫一個長字符串,跨越了多行,如何表示?

  • 使用三引號(注意行尾的"",若是不加,則打印出來帶有換行符):

    In [29]: s = """This is the first way to
        ...: solve the problem"""
    
    In [30]: s
    Out[30]: 'This is the first way to \nsolve the problem'
    
    In [31]: s = """This is the first way to \
        ...: solve the problem"""
    
    In [32]: s
    Out[32]: 'This is the first way to solve the problem'
  • 使用"+"和"":

    In [33]: s = "This is not the best way to join two long strings " + \
        ...: "together since it relines on ugly newline escaping"
    
    In [34]: s
    Out[34]: 'This is not the best way to join two long strings together since it relines on ugly newline escaping'
  • 使用圓括號:

    In [35]: s = ("This is the nice way to join two long strings "
        ...: "together;it relines on string literal concatenation.")
    
    In [36]: s
    Out[36]: 'This is the nice way to join two long strings together;it relines on string literal concatenation.'

Python的「Idioms and Anti-Idioms」HOWTO文檔建議老是使用圓括號將跨越多行的任何語句進行封裝,而不使用專注的換行符

4.3 字符串的分片與步長

字符串的索引位置從0開始,直至字符串長度值減去1。使用負索引位置也能夠,此時的計數方式是從最後一個字符到第一個字符。

假如咱們設置s='Python',下圖展現了字符串全部有效索引位置:

字符串索引位

分片操做有三種語法:

  • seq[start] :從序列中提取start位置的數據項。
  • seq[start:end] :從start開始到end結束的數據項(不包含)。
  • seq[start: end:step] :從start開始到end結束的數據項(不包含)每隔step個字符進行提取。

其中seq能夠是任意序列,好比列表、字符或元組。start、end與step必須是整數

第二和第三種語法,咱們能夠忽略任意的整數索引值:忽略起點索引值,就默認爲0;若是忽略終點索引值,就默認爲len(seq)

step能夠爲負值,若是爲負值就從end開始往start方向提取,咱們能夠利用這一特性進行序列的倒序排列操做:

In [40]: s = 'python'

In [41]: s[::-1]
Out[41]: 'nohtyp'

4.4 字符串操做符與方法

因爲字符串是固定序列,全部可用於固定序列的功能均可以用於字符串,包括使用in進行成員測試,使用+=進行追加操做,使用*進行復制操做等。

s = 'i like Python':

語法 描述 示例
s.capitalize() 返回字符串s的副本,並將首字母變爲大寫 'I like python'
s.center(width, char) 返回s中間的一個子字符串,長度爲width,並使用空格或可選的char(長度爲1的字符串)進行填充
s.count(t, start, end) 返回s中(或在start : end分片中)子字符串t出現的次數 s.count('i')
2
s.encode(encoding, err) 返回bytes對象,該對象使用默認的編碼格式或指定的編碼格式來表示該字符串並根據可選的err參數處理錯誤 s.encode('gbk')
b'i like Python'
s.endswith(x, start,end) 若是s(或在s的start : end分片)以字符串x(或元組x中的任意字符串)結尾,就返回True s.endswith('n')
True
s.expandtabs(size) 返回s的副本,其中的製表符使用8個或指定數量的空格替換
s.find(t, start, end) 返回t在s中(或s的start : end分片中)的最左位置,若是沒找到返回-1。使用s.rfind()則能夠發現相應的最右邊位置。 s.find('like')
2
s.format(...) 返回按給定參數進行格式化後的字符串副本,後面會講
s.index(t,start,end) 返回t在s中(或s的start : end分片中)的最左位置,若是沒有找到會產生ValueError異常。若是使用rindex()能夠從右邊開始搜索。 s.index('y')
8
s.isalnum() 若是s非空,而且其中的每一個字符都是字母數字,返回True False
s.isalpha() 若是s非空,而且其中的每一個字符都是字母,返回True False
s.isdecimal() 若是s非空,而且其中的每一個字符都是Unicode的基數爲10的數字,返回True False
s.isidentifier() 若是s非空,而且是一個有效的標識符,返回True False
s.islower() 若是s至少有一個能夠小寫的字符,而且其全部的可小寫的字符都是小寫的,返回True False
s.isnumeric() 若是s非空,而且其中的每一個字符都是數值的Unicode字符,好比數字或小數,返回True False
s.isprintable() 若是s非空,而且其中的每一個字符都是可打印的,包括空格但不包括換行,返回True True
s.isspace() 若是s非空,而且其中的每一個字符都是空白字符,返回True False
s.istitle() 若是s非空,而且首字母大寫,返回True False
s.isupper() 若是s至少有一個能夠大寫的字符,而且其全部的可大寫的字符都是大寫的,返回True False
s.join(seq) 返回序列seq中每一個項鍊接起來後的結果,並以s(能夠爲空)在每兩項之間分隔 s.join(['first', 'second'])
'firsti like Pythonsecond'
s.ljust(width, char) 返回長度爲width的字符串(使用空格或可選的char(長度爲1的字符串)進行填充)中左對齊的字符串s的一個副本。使用s.rjust()能夠右對齊,s.center()能夠中間對齊
s.lower() 將s中的字符變爲小寫 'i like python'
s. maketrans(x[,y[,z]]) 該靜態函數返回可用於str.translate()方法的轉換表。
若是隻有一個參數,它必須是dict類型,鍵key爲長度爲1的字符(unicode字符碼或者字符),值value爲任意長度字符串或者None。鍵key對應的字符將被轉換爲值value對應的字符(串)。
若是有兩個參數,他們長度必須相等,每個x字符將被轉換爲對應的y字符。若是有第三個參數,其對應的字符將被轉換爲None。
m = {'e':'f', 'o':'p'}
s.maketrans(m)
{101: 'f', 111: 'p'}
s.partition(t) 返回包含3個字符串的元組--字符串s在t的最左邊部分、t、字符串s在t最右邊部分。若是t不在s內,則返回s與兩個空字符串。使用s.rpartition()能夠在t最右邊部分進行分區 s.partition('like')
('i ', 'like', ' Python')
s.replace(t,u,n) 返回s的副本,其中每一個(或最多n個,若是給定)字符串t使用u替換 s.replace('like','love')
'i love Python'
s.split(t,n) 返回一個字符串列表,要求在字符串t處至多分割n次。若是沒有給定n,就分隔儘量屢次,若是t沒有給定,就在空白處分割。使用s.rsplit()能夠從右邊進行分割 s.split('i')
['', ' l', 'ke Python']
s.splitlines(f) 返回在行終結符處進行分割產生的行列表,並剝離行終結符(除非f爲True) s.splitlines()
['i like Python']
s.startswith(s,start,end) 若是s(或在s的start : end分片)以字符串x(或元組x中的任意字符串)開始,就返回True s.startswith('i')
True
s.stripe(chars) 返回s的一個副本,並將開始處與結尾處的空白字符(或字符串chars中的字符)移除,s.lstripe()僅剝離起始處的相應字符,s.rstripe()僅剝離結尾出的相應字符 s.strip('n')
'i like Pytho'
s.swapcase() 返回s的副本,並將其中大寫字符變爲小寫,小寫字符變爲大寫 'I LIKE pYTHON'
s.title() 返回s的副本,並將每一個單詞的首字母變爲大寫,其它字母變爲小寫 'I Like Python'
s.translate() 返回一個使用參數map轉換後的字符串,map必須是一個unicode字符碼(整形)到unicode字符,字符串或None的映射表,未被映射的字符保持不表,被映射爲None的字符將被刪除。 m = {'e':'f', 'o':'p'}
s.maketrans(m)
s.translate(trans)
'i likf Pythpn'
s.upper() 返回s的大寫化版本 'I LIKE PYTHON'
s.zfill(w) 返回s的副本,若是比w短,就在開始處添加0,使其長度爲w s.zfill(15)
'00i like Python'

Python還有一些其餘庫模塊提供字符串相關的功能:

  • difflib,用於展現文件或字符串之間的差異
  • io模塊的io.StringIO類,用於讀寫字符串,就像對文件的讀寫操做同樣
  • textwrap,該模塊提供了用於包裹於填充字符串的函數和方法
  • string,其中定義了一些有用的常量,好比ascii_letters與ascii_lowercase

4.5 str.format()對字符串格式化

str.format()方法會返回一個新字符串,在新字符串中,原字符串中的替換字段被適當格式化後的參數所替代,格式化後的參數能夠是字符串或數字類型:

In [103]: '{0}{1}'.format('The price of this apple is $',10)
Out[103]: 'The price of this apple is $10'

若是須要在格式化字符串中包含花括號,就須要將其複寫:

In [104]: '{0}{{{1}}}'.format('The price of this apple is $',10)
Out[104]: 'The price of this apple is ${10}'

str.format()替換字段可使用下面的任意一種語法格式:

  • {field_name}
  • {field_name!conversion}
  • {field_name:format_specification}
  • {field_name!conversion:format_specification}

字段名是一個與某個str.format()方法參數對應的整數,或者是方法的某個關鍵字參數的名稱

In [105]: '{who} turned {age} this year.'.format(who='she', age=19)
Out[105]: 'she turned 19 this year.'
    
In [106]: 'The {who} was {0} last week'.format(12, who='boy')
Out[106]: 'The boy was 12 last week'

字段名能夠引用集合數據類型,例如:列表

In [108]: 'Both of {0[0]} and {0[1]} are my friends.'.format(['Jenny','Danny'])
Out[108]: 'Both of Jenny and Danny are my friends.'

從Python3.1開始,咱們能夠忽略字段名:

In [109]: 'The {} was {} last week'.format('boy',12)
Out[109]: 'The boy was 12 last week'
歡迎關注(C與Python實戰)[ https://pythoncpp-1254282033....]
相關文章
相關標籤/搜索