第二章 数据类型和文件操作
變量創建過程
首先,當我們定義了一個變量name = ‘oldboy’的時候,在內存中其實是做了這樣一件事:
程序開辟了一塊內存空間,將‘oldboy’存儲進去,再讓變量名name指向‘oldboy’所在的內存地址。如下圖所示:
我們可以通過id()方法查看這個變量在內存中的地址
python 解釋器有自動垃圾回收機制,自動隔一段時間把沒有跟變量名關聯的內存數據回收
name = "wuxiping" name = "Jack" print(id(name))name = "Alex" name1 = name print(name1) print(id(name),id(name1))name = "黑姑娘" print(name1) # 因為name1是直接指向Alex,所以name1 沒變身份運算
python 中有很多種數據類型, 查看一個數據的類型的方法是type().
判斷一個數據類型是不是str, or int等,可以用身份運算符is
空值None
代表什么都沒有的意思,一般用在哪呢? 比如玩游戲,你要初始化一個女朋友, 需要填上姓名、年齡、身高、體重等信息, 這些信息是讓玩家填的,在填之前,你要先把變量定義好,那就得存個值 ,這個值用0,1來占位不合適 ,用True,False也不合適 ,用None最合適
此時可用is 運算符來判斷變量是不是None
其實用==判斷也行,但是不符合開發規范
三元運算
顯的很NB的代碼寫法。
# 三元運算 a = 10 b = 5 if a>15:c = a else:c = b print(c) # 或者 d = a if a>15 else b print(d)d = 值1 if 條件A else 值2
如果條件A成立,就取左邊值1,否則就取值2
細講數據類型----列表
追加,數據會追加到尾部
插入,可插入任何位置
合并,可以把另一外列表的值合并進來
列表嵌套
刪除操作
del 直接刪
pop 刪
clear 清空
修改操作
查操作
?細講數據類型-元組(大部分和列表相似)
不可修改
索引,切片,等
count,index
注意:元組本身不可變,如果元組中還包含其他可變元素,這些可變元素可以改變
>>> data (99, 88, 77, ['Alex', 'Jack'], 33) >>> data[3][0] = '金角大王' >>> data (99, 88, 77, ['金角大王', 'Jack'], 33)為啥呢? 因為元組只是存每個元素的內存地址,上面[‘金角大王’, ‘Jack’]這個列表本身的內存地址存在元組里確實不可變,但是這個列表包含的元素的內存地址是存在另外一塊空間里的,是可變的。
?細講數據類型-字符串定義
字符串是一個有序的字符的集合,用于存儲和表示基本的文本信息,’ ‘或’’ ‘’或’’’ ‘’’中間包含的內容稱之為字符串
?反轉:將步長變成-1即可
特性:
按照從左到右的順序定義字符集合,下標從0開始順序訪問,有序
1.可以進行切片操作
2.不可變,字符串是不可變的,不能像列表一樣修改其中某個元素,所有對字符串的修改操作其實都是相當于生成了一份新數據。
補充:
1.字符串的單引號和雙引號都無法取消特殊字符的含義,如果想讓引號內所有字符均取消特殊意義,在引號前面加r,如name=r’l\thf’
字典:
字典是Python語言中唯一的映射類型。
定義:{key1:value1,key2:value2}
特性:
1.key-value結構
2.key必須為不可變數據類型、必須唯一
3.可存放任意多個value、可修改、可以不唯一
4.無序
5.查詢速度快,且不受dict的大小影響,至于為何快?我們學完hash再解釋。
# coding=utf-8 # 字典:定義:{key1:value1,key2:value2} # info = { # "name":"小猿圈", # "mission": "幫一千萬極客高效學編程", # "website": "http://apeland.com"} # print(info.keys())# 創建操作 # person = {"name": "alex", 'age': 20}# person = dict(name='seven', age=20)# keys = [1,2,3,4,5] # a= {}.fromkeys(keys,100) # print(a)# 增加 # person = {"name": "alex", 'age': 20} # person["job"] = "Teacher" # print(person) # person.setdefault("salary",[1,2,3]) # print(person) # 刪除 person = {"name": "alex", 'age': 20} # print(person) # print(person.pop("name")) # 刪除指定鍵key # print(person) # print(person) # del person["name"] # 刪除指定鍵key # print(person) # print(person.clear()) # 清空字典# 修改操作 # person["name"] = "NAME" # print(person) # 替代原先的value值 # person1 = {"gender":"male"} # print(person.update(person1)) # 將字典person1的鍵值對添加到字典person中 # print(person)# 查操作 # print(person["name"]) # 返回字典中key對應的值,若key不存在字典中,則報錯 # print(person.get("name")) # 返回字典中key對應的值,若key不在字典中,則返回default的值(default默認為None) # print("name" in person) # 若存在則返回True,否則返回False # print(person.keys()) # 返回一個包含字典所有key的列表 # print(person.values()) # 返回一個包含字典所有value的列表 # print(person.items()) # 返回一個包含所有(鍵,值)元祖的列表# 循環 # for i in person: # print(i,person[i]) # for i in person.items(): # print(i) # for k,v in person.items(): # print(k,v) # for i in person.keys(): # print(i) for i in person.values():print(i)細講數據類型-集合
定義
1.里面的元素不可變,代表你不能存一個list、dict 在集合里,字符串、數字、元組等不可變類型可以存
2.天生去重,在集合里沒辦法存重復的元素
3.無序,不像列表一樣通過索引來標記在列表中的位置 ,元素是無序的,集合中的元素沒有先后之分,如集合{3,4,5}和{3,5,4}算作同一個集合
基于上面的特性,我們可以用集合來干2件事,去重和關系運算
# 創建集合 set 增刪查 a = {1,2,3,4,2,'alex',3,'rain','alex'} print(a) a.add(5) print(a) # a.add([1,2,3]) # print(a) a.add((1,2,3)) print(a) # 刪除 a.discard(5) # 隨機刪除 a.pop() # 如果沒有該元素就會報錯 a.remove() # 關系運算 s_1024 = {"佩奇","老男孩","海峰","馬JJ","老村長","黑姑娘","Alex"} s_pornhub = {"Alex","Egon","Rain","馬JJ","Nick","Jack"} print(s_1024 & s_pornhub) # 交集, elements in both set print(s_1024 | s_pornhub) # 并集 or 合集 print(s_1024 - s_pornhub) # 差集 , only in 1024 print(s_pornhub - s_1024) # 差集, only in pornhub print(s_1024 ^ s_pornhub) # 對稱差集, 把腳踩2只船的人T出去 print(s_1024.intersection(s_pornhub))?秒懂二進制
字符編碼之文字是如何顯示的
ASCII碼
這張表就是計算機顯示各種文字、符號的基石呀
ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統,并等同于國際標準ISO/IEC 646。
在這里,每一位0或者1所占的空間單位為bit(比特),這是計算機中最小的表示單位
每8個bit組成一個字節,這是計算機中最小的存儲單位(畢竟你是沒有辦法存儲半個字符的)orz~
GBK2312? ?2個字節代表一個字符
論斷句的重要性與必要性:
Unicode標準也在不斷發展,但最常用的是用兩個字節表示一個字符(如果要用到非常偏僻的字符,就需要4個字節)?,F代操作系統和大多數編程語言都直接支持Unicode。
UTF-8
新的問題又出現了:如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,由于計算機的內存比較大,并且字符串在內容中表示時也不會特別大,所以內容可以使用unicode來處理,但是存儲和網絡傳輸時一般數據都會非常多,那么增加1倍將是無法容忍的!!!
為了解決存儲和網絡傳輸的問題,出現了Unicode Transformation Format,學術名UTF,即:對unicode字符進行轉換,以便于在存儲和網絡傳輸時可以節省空間!
- UTF-8: 使用1、2、3、4個字節表示所有字符;優先使用1個字符、無法滿足則使增加一個字節,最多4個字節。英文占1個字節、歐洲語系占2個、東亞占3個,其它及特殊字符占4個
- UTF-16: 使用2、4個字節表示所有字符;優先使用2個字節,否則使用4個字節表示。
- UTF-32: 使用4個字節表示所有字符;
總結:UTF 是為unicode編碼 設計 的一種 在存儲 和傳輸時節省空間的編碼方案。
如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:
hash是個什么東西閱讀量: 461什么是哈希?
hash,一般翻譯做散列、雜湊,或音譯為哈希,是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間。
它其實就是一個算法,最簡單的算法就是加減乘除,比方,我設計個數字算法,輸入+7=輸出,比如我輸入1,輸出為8;輸入2,輸出為9。
哈希算法不過是一個更為復雜的運算,它的輸入可以是字符串,可以是數據,可以是任何文件,經過哈希運算后,變成一個固定長度的輸出,該輸出就是哈希值。但是哈希算法有一個很大的特點,就是你不能從結果推算出輸入,所以又稱為不可逆的算法
哈希特性
不可逆:在具備編碼功能的同時,哈希算法也作為一種加密算法存在。即,你無法通過分析哈希值計算出源文件的樣子,換句話說:你不可能通過觀察香腸的紋理推測出豬原來的樣子。
計算極快:20G高清電影和一個5K文本文件復雜度相同,計算量都極小,可以在0.1秒內得出結果。也就是說,不管豬有多肥,骨頭多硬,做成香腸都只要眨眨眼的時間,
哈希的用途
哈希算法的不可逆特性使其在以下領域使用廣泛
1.密碼,我們日常使用的各種電子密碼本質上都是基于hash的,你不用擔心支付寶的工作人員會把你的密碼泄漏給第三方,因為你的登錄密碼是先經過 hash+各種復雜算法得出密文后 再存進支付寶的數據庫里的
2.文件完整性校驗,通過對文件進行hash,得出一段hash值 ,這樣文件內容以后被修改了,hash值就會變。 MD5 Hash算法的”數字指紋”特性,使它成為應用最廣泛的一種文件完整性校驗和(Checksum)算法,不少Unix系統有提供計算md5 checksum的命令。
3.數字簽名,數字簽名技術是將摘要信息用發送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發送者的公鑰才能解密被加密的摘要信息,然后用HASH函數對收到的原文產生一個摘要信息,與解密的摘要信息對比。如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數字簽名能夠驗證信息的完整性。
此外,hash算法在區塊鏈領域也使用廣泛。
md5加密算法
基于hash的數據類型有哪些?
Python 中基于hash的2個數據類型是dict and set , 之前說dict查詢速度快,為何快? 說set天生去重,怎么做到的?其實都是利用了hash的特性,我們下面來剖析
用Python操作文件
操作模式
- r 只讀模式
- w 創建模式,若文件已存在,則覆蓋舊文件
- a 追加模式,新數據會寫到文件末尾
總結
以上是生活随笔為你收集整理的第二章 数据类型和文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: day24 面向对象与实例属性
- 下一篇: 第三章 函数编程