Python四大數據類型最全總結。你都會嗎?

来源:https://www.cnblogs.com/chengxuyuanaa/archive/2020/05/10/12865101.html
-Advertisement-
Play Games

基本數據類型 數值型 Python 中的數據皆是對象,比如被熟知的 int 整型對象、float 雙精度浮點型、bool 邏輯對象,它們都是單個元素。舉兩個例子。 首碼加 0x,創建一個十六進位的整數: 0xa5 # 等於十進位的 165 使用 e 創建科學計數法表示的浮點數: 1.05e3 # 1 ...


基本數據類型

數值型

Python 中的數據皆是對象,比如被熟知的 int 整型對象、float 雙精度浮點型、bool 邏輯對象,它們都是單個元素。舉兩個例子。

首碼加 0x,創建一個十六進位的整數:

0xa5 # 等於十進位的 165

使用 e 創建科學計數法表示的浮點數:

1.05e3 # 1050.0

另外大家也要註意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,裡面很多新python教程項目,還可以跟老司機交流討教!

容器型

可容納多個元素的容器對象,常用的比如:list 列表對象、 tuple 元組對象、dict 字典對象、set 集合對象。Python 定義這些類型的變數,語法非常簡潔。

舉例如下。

使用一對中括弧 [],創建一個 list 型變數:

lst = [1,3,5] # list 變數

示意圖看出,右側容器為開環的,意味著可以向容器中增加和刪除元素:

image-20200218111947234

使用一對括弧 (),創建一個 tuple 型對象:

tup = (1,3,5) # tuple 變數

示意圖看出,右側容器為閉合的,意味著一旦創建元組後,便不能再向容器中增刪元素:

image-20200218112031346

但需要註意,含單個元素的元組後面必須保留一個逗號,才被解釋為元組。

tup = (1,) # 必須保留逗號

否則會被認為元素本身:

In [14]: tup=(1)
    ...: print(type(tup)) 
<class 'int'>

使用一對花括弧 {} 另使用冒號 :,創建一個 dict 對象:

dic = {'a':1, 'b':3, 'c':5} # dict變數

字典是一個哈希表,下麵的示意圖形象的表達出字典的 “形”。

image-20200218112256968

僅使用一對花括弧 {},創建一個 set 對象:

s = {1,3,5} # 集合變數

Python 的容器類型,list、dict、tuple、set 等能方便地實現強大的功能,下麵給出幾個案例。

1. 去最求平均

去掉列表中的一個最小值和一個最大值後,計算剩餘元素的平均值。

def score_mean(lst):
    lst.sort()
    lst2=lst[1:-1]
    return round((sum(lst2)/len(lst2)),1)

lst=[9.1, 9.0,8.1, 9.7, 19,8.2, 8.6,9.8]
score_mean(lst) # 9.1

代碼執行過程,動畫演示:

image-20200218112655335

2. 列印 99 乘法表

列印出如下格式的乘法表:

1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

一共有 10 行,第 i 行的第 j 列等於:j*i,其中:

  • i 取值範圍:1<=i<=9
  • j 取值範圍:1<=j<=i

根據“例子分析”的語言描述,轉化為如下代碼:

In [13]: for i in range(1,10):
    ...:     for j in range(1,i+1):
    ...:         print('%d*%d=%d'%(j,i,j*i),end='\t')
    ...:     print()

3. 樣本抽樣

使用 sample 抽樣,如下例子從 100 個樣本中隨機抽樣 10 個。

from random import randint,sample
lst = [randint(0,50) for _ in range(100)]
print(lst[:5])# [38, 19, 11, 3, 6]
lst_sample = sample(lst,10)
print(lst_sample) # [33, 40, 35, 49, 24, 15, 48, 29, 37, 24]

字元串

註意 Python 中沒有像 C++ 表示的字元類型(char),所有的字元或串都被統一為 str 對象。如單個字元 c 的類型也為 str。

str 類型會被經常使用,先列舉 5 個被高頻使用的方法。

strip 用於去除字元串前後的空格:

In [1]: '  I love python\t\n  '.strip()
Out[1]: 'I love python'

replace 用於字元串的替換:

In [2]: 'i love python'.replace(' ','_')
Out[2]: 'i_love_python'

join 用於合併字元串:

In [3]: '_'.join(['book', 'store','count'])
Out[3]: 'book_store_count'

title 用於單詞的首字元大寫:

In [4]: 'i love python'.title()
Out[4]: 'I Love Python'

find 用於返回匹配字元串的起始位置索引:

In [5]: 'i love python'.find('python')
Out[5]: 7

舉個應用字元串的案例,判斷 str1 是否由 str2 旋轉而來。

字元串 stringbook 旋轉後得到 bookstring,寫一段代碼驗證 str1 是否為 str2 旋轉得到。

轉化為判斷:str1 是否為 str2+str2 的子串。

下麵函數原型中,註明瞭每個參數的類型、返回值的類型,增強代碼的可讀性和可維護性。

def is_rotation(s1: str, s2: str) -> bool:
    if s1 is None or s2 is None:
        return False
    if len(s1) != len(s2):
        return False

    def is_substring(s1: str, s2: str) -> bool:
        return s1 in s2
    return is_substring(s1, s2 + s2)

測試函數 is_rotation:

r = is_rotation('stringbook', 'bookstring')
print(r)  # True

r = is_rotation('greatman', 'maneatgr')
print(r)  # False

代碼執行過程,動畫演示:

字元串的匹配操作除了使用 str 封裝的方法外,Python 的 re 正則模塊功能更加強大,寫法更為簡便,廣泛適用於爬蟲、數據分析等。

下麵這個案例實現:密碼安全檢查,使用正則表達式非常容易實現。

密碼安全要求:

  • 要求密碼為 6 到 20 位;
  • 密碼只包含英文字母和數字。
import re
pat = re.compile(r'\w{6,20}') # 這是錯誤的,因為 \w 通配符匹配的是字母,數字和下劃線,題目要求不能含有下劃線
# 使用最穩的方法:\da-zA-Z 滿足“密碼只包含英文字母和數字”
# \d匹配數字 0-9
# a-z 匹配所有小寫字元;A-Z 匹配所有大寫字元
pat = re.compile(r'[\da-zA-Z]{6,20}')

選用最保險的 fullmatch 方法,查看是否整個字元串都匹配。

以下測試例子都返回 None,原因都在解釋里。

pat.fullmatch('qaz12') # 返回 None,長度小於 6
pat.fullmatch('qaz12wsxedcrfvtgb67890942234343434') # None 長度大於 22
pat.fullmatch('qaz_231') # None 含有下劃線

下麵這個字元串 n0passw0Rd 完全符合:

In [20]: pat.fullmatch('n0passw0Rd')
Out[20]: <re.Match object; span=(0, 10), match='n0passw0Rd'>

自定義類型

Python 使用關鍵字 class 定製自己的類,self 表示類實例對象本身。

一個自定義類內包括屬性、方法,其中有些方法是自帶的。

類(對象):

class Dog(object):
    pass

以上定義一個 Dog 對象,它繼承於根類 object,pass 表示沒有自定義任何屬性和方法。

下麵創建一個 Dog 類型的實例:

wangwang = Dog()

Dog 類現在沒有定義任何方法,但是剛纔說了,它會有自帶的方法,使用 __dir__() 查看這些自帶方法:

In [26]: wangwang.__dir__()
Out[26]:
['__module__',
 '__dict__',
 '__weakref__',
 '__doc__',
 '__repr__',
 '__hash__',
 '__str__',
 '__getattribute__',
 '__setattr__',
 '__delattr__',
 '__lt__',
 '__le__',
 '__eq__',
 '__ne__',
 '__gt__',
 '__ge__',
 '__init__',
 '__new__',
 '__reduce_ex__',
 '__reduce__',
 '__subclasshook__',
 '__init_subclass__',
 '__format__',
 '__sizeof__',
 '__dir__',
 '__class__']

有些地方稱以上方法為魔法方法,它們與創建類時自定義個性化行為有關。比如:

  • __init__ 方法能定義一個帶參數的類;
  • __new__ 方法自定義實例化類的行為;
  • __getattribute__ 方法自定義讀取屬性的行為;
  • __setattr__ 自定義賦值與修改屬性時的行為。

類的屬性:

def __init__(self, name, dtype):
     self.name = name
     self.dtype = dtype

通過 __init__,定義 Dog 對象的兩個屬性:name、dtype。

類的實例:

wangwang = Dog('wangwang','cute_type')

wangwangDog 類的實例。

類的方法:

def shout(self):
    print('I\'m %s, type: %s' % (self.name, self.dtype))

註意:

  • 自定義方法的第一個參數必須是 self,它指向實例本身,如 Dog 類型的實例 dog;
  • 引用屬性時,必須前面添加 self,比如 self.name 等。

總結以上代碼:

In [40]: class Dog(object):
    ...:     def __init__(self,name,dtype):
    ...:         self.name=name
    ...:         self.dtype=dtype
    ...:     def shout(self):
    ...:         print('I\'m %s, type: %s' % (self.name, self.dtype))

In [41]: wangwang = Dog('wangwang','cute_type')

In [42]: wangwang.name
Out[42]: 'wangwang'

In [43]: wangwang.dtype
Out[43]: 'cute_type'

In [44]: wangwang.shout()
I'm wangwang, type: cute_type

看到創建的兩個屬性和一個方法都被暴露在外面,可被 wangwang 調用。這樣的話,這些屬性就會被任意修改:

In [49]: wangwang.name='wrong_name'
    
In [50]: wangwang.name
Out[50]: 'wrong_name'

如果想避免屬性 name 被修改,可以將它變為私有變數。改動方法:屬性前加 2 個 _ 後,變為私有屬性。如:

In [51]: class Dog(object):
    ...:     def __init__(self,name,dtype):
    ...:         self.__name=name
    ...:         self.__dtype=dtype
    ...:     def shout(self):
    ...:         print('I\'m %s, type: %s' % (self.name, self.dtype))

同理,方法前加 2 個 _ 後,方法變為“私有方法”,只能在 Dog 類內被共用使用。

但是這樣改動後,屬性 name 不能被訪問了,也就無法得知 wangwang 的名字叫啥。不過,這個問題有一種簡單的解決方法,直接新定義一個方法就行:

def get_name(self):
    return self.__name

綜合代碼:

In [52]: class Dog(object):
    ...:     def __init__(self,name,dtype):
    ...:         self.__name=name
    ...:         self.__dtype=dtype
    ...:     def shout(self):
    ...:         print('I\'m %s, type: %s' % (self.name, self.dtype))
    ...:     def get_name(self):
    ...:         return self.__name
    ...:

In [53]: wangwang = Dog('wangwang','cute_type')

In [54]: wangwang.get_name()
Out[54]: 'wangwang'

但是,通過此機制,改變屬性的可讀性或可寫性,怎麼看都不太優雅!因為無形中增加一些冗餘的方法,如 get_name。

下麵,通過另一個例子,解釋如何更優雅地改變某個屬性為只讀或只寫。

自定義一個最精簡的 Book 類,它繼承於系統的根類 object:

class Book(object):
    def __init__(self,name,sale):
        self.__name = name
        self.__sale = sale

使用 Python 自帶的 property 類,就會優雅地將 name 變為只讀的。

    @property
    def name(self):
        return self.__name

使用 @property 裝飾後 name 變為屬性,意味著 .name 就會返回這本書的名字,而不是通過 .name() 這種函數調用的方法。這樣變為真正的屬性後,可讀性更好。

In [101]: class Book(object):
     ...:     def __init__(self,name,sale):
     ...:         self.__name = name
     ...:         self.__sale = sale
     ...:     @property
     ...:     def name(self):
     ...:         return self.__name

In [102]: a_book = Book('magic_book',100000)

In [103]: a_book.name
Out[103]: 'magic_book'

property 是 Python 自帶的類,前三個參數都是函數類型。更加詳細的討論放在後面討論裝飾器時再展開。

In [104]: help(property)
Help on class property in module builtins:

class property(object)
 |  property(fget=None, fset=None, fdel=None, doc=None)

如果使 name 既可讀又可寫,就再增加一個裝飾器 @name.setter。

In [105]: class Book(object):
     ...:     def __init__(self,name,sale):
     ...:         self.__name = name
     ...:         self.__sale = sale
     ...:     @property
     ...:     def name(self):
     ...:         return self.__name
     ...:     @name.setter
     ...:     def name(self,new_name):
     ...:         self.__name = new_name

In [106]: a_book = Book('magic_book',100000)

In [107]: a_book.name = 'magic_book_2.0'

In [108]: a_book.name
Out[108]: 'magic_book_2.0'

註意這種裝飾器寫法:name.setter,name 已經被包裝為 property 實例,調用實例上的 setter 函數再包裝 name 後就會可寫。對於 Python 入門者,可以暫時不用太糾結這部分理論,使用 Python 一段時間後,再回過頭來自然就會理解。

小結註意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,裡面很多新python教程項目,還可以跟老司機交流討教!

今天學習 Python 的四大基本數據類型。數值型 int、float 等;容器型 list、dict、tuple、set 等;字元型 str 與正則表達式介紹;自定義類的基本語法規則,class、屬性和方法等。
本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (一)關於C/S、B/S,HTTP協議 1.1-C/S結構 C/S結構(伺服器-客戶機),即Client-Server結構。C/S結構通常採取兩層結構。伺服器負責數據的管理,客戶機負責完成與用戶的交互任務。 客戶機通過區域網與伺服器相連,接受用戶的請求,並通過網路向伺服器提出請求,對資料庫進行操作。 ...
  • 實踐內容 從 MariaDB 一張表內讀 10 萬條記錄,經處理後寫到 MongoDB 。 具體實現 1、新建 Spring Boot 應用,依賴如下: 2、創建一張表,並生成 10 萬條數據 3、創建 Person 類 4、創建一個中間處理器 5、創建 ,用戶資料庫映射 6、創建任務完成的監聽 7 ...
  • 一、可變長參數 package com.bjpowernode.java_learning; import java.util.Date; ​ public class D114_1_VariableLengthParameter { public static void main(String[] ...
  • 1. 選用捲積之前填充(強烈建議) 小生非常推薦大家不再使用捲積所帶的填充方式,雖然那種方式簡單,但缺陷太多。① 不能根據自己的需要來決定上與下填充不等的邊界,左右填充不等的邊界;② 邊界填充零容易出現偽影的情況,對實驗效果影響比較大。將捲積中的Padding方式換為捲積前Padding效果會更佳, ...
  • 變數只能有一次定義:定義聲明(定義)、引用聲明(聲明) 引用聲明: 關鍵字 extern 不初始化(否則變為定義,分配記憶體) 註意: 一個文件定義後,其他文件中使用須用 extern ...
  • @ "TOC" 前言 關於Spring 迴圈引用 網上的分析文章很多,寫的水平良莠不齊,雖然看完了 知道怎麼個回事 但是過段時間還是忘記了,主要本人沒過目不忘的本領哈,但是只要記住主要的點就好了 但是如果你自己想更深入的瞭解,還是要自己去看源碼分析一波,因為別人分析的時候,有些知識點你是get不到的 ...
  • 貪吃蛇,大家應該都玩過。當初第一次接觸貪吃蛇的時候 ,還是能砸核桃的諾基亞上,當時玩的不亦樂乎。今天,我們用Python編程一個貪吃蛇游戲,下麵我們先看看效果: 另外要註意:光理論是不夠的。這裡順便總大家一套2020最新python入門到高級項目實戰視頻教程,可以去小編的Python交流.裙 :七衣 ...
  • 很多時候搜索用戶對查詢語句具有模糊感覺,他們只能提供大約的描述。比如一個語句的部分,或者字句順序顛倒等。通過模糊查詢可以幫助用戶更準確的找出他們希望搜索的結果。 模糊查詢包括前尾碼,語句(phrase)查詢。首碼查詢在非文本查詢和全文查詢欄位中使用是有著不同的效果:在非文本欄位查詢中我們需要嚴格按照 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...