小豬的Python學(xué)習(xí)之旅 —— 1.基礎(chǔ)知識儲備

標(biāo)簽: Python

引言:(文章比較長,建議看目錄按需學(xué)習(xí)~)

??????以前剛學(xué)編程的時(shí)候就對Python略有耳聞痛黎,不過學(xué)校只有C,C++刮吧,Java湖饱,C#。
和PHP有句"PHP是最好的語言" 這種家喻戶曉的騷話一樣杀捻,Python也有
"人生苦短井厌,我用Python"。而接觸Python這個(gè)詞最多的場合就是在一些技術(shù)群里致讥,
有些大佬張嘴動不動就說什么Py交易仅仆,作為潛伏在群里的開發(fā)萌新的我每次都
會忍不住會發(fā)出這樣的感慨:

而真正接觸了下Python是在上家公司,當(dāng)時(shí)老大讓我寫個(gè)腳本去下載
倉庫里最近打包的apk垢袱,當(dāng)時(shí)東湊湊西湊湊最后總算拼成了一個(gè)可運(yùn)行
的py文件墓拜,因?yàn)椴涣私釶ython里的數(shù)據(jù)結(jié)構(gòu),全部用的字符串變量惶桐,
后面被老大教育了一番才知道有元組這種東西撮弧。因?yàn)楸旧碜鯝ndroid的,
Python用到的場合不多姚糊,加之覺得Kotlin有點(diǎn)意思贿衍,就沒去研究Python了。

前段時(shí)間救恨,手頭的事做得差不多了贸辈,無聊四處張望時(shí),看到隔壁后臺
小哥迅雷瘋狂下載東西肠槽,建文件夾擎淤,粘貼復(fù)制,不知道還以為他在給
小電影分類呢秸仙,后來一問才知道嘴拢,運(yùn)營讓他把服務(wù)器上所有的音頻
文件下下來,然后根據(jù)對應(yīng)的類別下到對應(yīng)文件夾寂纪,所以他做的事情
就是:迅雷批量下載過歌曲 -> 看mysql歌曲的分組 -> 建文件夾
-> 粘貼復(fù)制歌曲到這個(gè)文件夾下席吴,咋一看赌结,流程挺簡單的,然而有
4700多首歌孝冒,幾百個(gè)目錄柬姚,這樣慢慢搞怕是要搞幾天,而且常時(shí)間
機(jī)械化的重復(fù)某項(xiàng)工作庄涡,很容易出錯(cuò)量承。看著一臉絕望的后臺小哥:

于心不忍穴店,決定寫個(gè)py腳本來拯救他撕捍,腦子里也有了程序的大概邏輯:

  • 1.讓后臺導(dǎo)出一份mysql建表語句,安裝mysql把表建起來迹鹅;
  • 2.Python連mysql卦洽,讀取表里的數(shù)據(jù)
  • 3.編寫帶limit去重的sql查詢語句,查詢得到所有分類
  • 4.得到的所有分類就是要?jiǎng)?chuàng)建的文件夾斜棚,迭代批量創(chuàng)建文件夾;
  • 5.sql查詢歌曲下載url與分類该窗,拼接弟蚀,寫入到文件中;
  • 6.讀取文件酗失,迭代:下載url截取文件名與分類路徑拼接成文件
    的完整路徑义钉,調(diào)用下載相關(guān)函數(shù)下載url到對應(yīng)路徑即可。

邏輯挺簡單明了的规肴,然而各種坑捶闸,最后折騰了一天才能弄出來
遇到了下面這些問題:

  • 1.最坑的解碼問題:默認(rèn)使用Python2,中文亂碼拖刃,各種網(wǎng)上搜删壮,
    設(shè)置編碼方式,都沒用兑牡,頭皮發(fā)麻央碟,特別是在截取文件名的時(shí)候。
    后面換了一波Python3均函,很舒服亿虽,什么問題都沒了。
  • 2.沒有對異常進(jìn)行捕獲苞也,有些資源失效404洛勉,下到中途才發(fā)現(xiàn).;
  • 3.想弄多線程下載的,因?yàn)镻ython很多基礎(chǔ)不知道如迟,后面放棄了;

當(dāng)看到所有文件都下載到了對應(yīng)的位置收毫,一種油然而生的成就感,
比起寫APP天天畫界面,請求牛哺,解析數(shù)據(jù)陋气,顯示數(shù)據(jù),有意思太多引润,
畢竟學(xué)習(xí)開發(fā)興趣很重要巩趁,索性從零開始學(xué)習(xí)下Python吧,越學(xué)越覺得:

理由上班時(shí)的閑暇時(shí)間淳附,歷時(shí)兩周總算是把基礎(chǔ)知識的東西過了
一遍议慰,遂有此文,畢竟初學(xué)者奴曙,有些地方可能理解有誤别凹,望看到
的大佬不吝賜教,文中大部分內(nèi)容摘自:
Python 3 教程》與《小甲魚的零基礎(chǔ)入門學(xué)習(xí)Python
有興趣的可以閱讀下這兩本書~
本文不是入門教程啊洽糟,完全沒有編程經(jīng)驗(yàn)的不建議閱讀炉菲!
完全小白可以看下這本:《編程小白的第一本Python入門書


目錄

[TOC]


1.學(xué)習(xí)資源相關(guān)

API文檔

書籍


2.學(xué)習(xí)Python2還是Python3的問題

E乃!薪介!Python 3的語法 不完全兼容 Python 2的語法l艚取!汁政!

菜逼剛學(xué)Python沒多久道偷,不敢大聲嗶嗶,最直接原因:
Python 3默認(rèn)使用utf-8记劈,在處理中文的時(shí)候可以
減少很多編解碼的問題勺鸦,而Python 2默認(rèn)使用ascii

另外的原因:與時(shí)俱進(jìn)抠蚣,IT行業(yè)發(fā)展那么迅速祝旷,完全過渡只是時(shí)間問題;
舉個(gè)例子:Android Studio剛出的沒多久的時(shí)候嘶窄,各種說卡啊怀跛,垃圾,
只能開一個(gè)項(xiàng)目等各種嫌棄柄冲,不如Eclipse好用吻谋;然而現(xiàn)在開發(fā)Android
還是用Eclipse的都是會被歧視一波的,So:人生苦短现横,我用Python3漓拾。

更多比較的文章可見:

Python2.x與3??.x版本區(qū)別
Python2orPython3
Python3.x和Python2.x的區(qū)別


3.開發(fā)環(huán)境搭建

Python下載安裝

官網(wǎng)下載https://www.python.org/downloads/阁最,
自己選擇需要的版本與操作系統(tǒng)。

  • Windows

傻瓜式下一步就好骇两,記得勾選Add Python x.x to Path速种!勾選
了你裝完就不用自己去配置環(huán)境變量,安裝完畢后打開CMD輸入:
python3 -V 能查看到安裝的Python版本說明安裝成功低千,
如果提示錯(cuò)誤:python3不是內(nèi)部或外部命令之類的話配阵,恭喜你
可以百度下:Python3環(huán)境變量配置 了~

  • Mac

方法一:官網(wǎng)下安裝包,傻瓜下一步示血;
方法二:如果有裝Homebrew棋傍,終端輸入:brew install Python3 安裝即可。

  • Ubuntu:一般內(nèi)置难审,執(zhí)行下述命令可查看版本瘫拣,如果想安裝自己喜歡
    的版本可以鍵入:sudo apt-get install python版本號 進(jìn)行安裝

PyCharm下載安裝

其實(shí)在安裝完P(guān)ython后就可以進(jìn)行Python編程了,直接命令行輸入python3告喊,
就可以使用自帶的IDLE進(jìn)行開發(fā)了麸拄;又或者直接用Sublime Text或NotePad++
這類代碼查看工具直接編寫代碼,然后保存成后綴為.py的文件黔姜,然后python3
執(zhí)行這個(gè)py文件就可以了感帅。

雖然可以,但是挺不方便的地淀,比如縮進(jìn)問題,Python通過縮進(jìn)來表示代碼塊岖是,
代碼一多帮毁,某一行沒有正確的使用縮進(jìn),結(jié)果可能與你預(yù)期的相差甚遠(yuǎn)豺撑。
智能提示烈疚,方便的依賴庫管理等,這兩個(gè)就不用說了吧聪轿,具體的還得你自己體會爷肝。

官網(wǎng)下載https://www.jetbrains.com/pycharm/download/
下載Professional版本,傻瓜式安裝陆错,打開后會彈出注冊頁面灯抛,
勾選License server,在License server address輸入注冊服務(wù)器音瓷,
網(wǎng)上搜很多对嚼,然后就可以愉快的進(jìn)行py開發(fā)了。

軟件的基本使用也非常簡單绳慎,Jetbrains的IDE都是差不多的~
有一點(diǎn)要注意的地方是纵竖,如果你想切換項(xiàng)目依賴的Python版本號的話:
打開設(shè)置(Preference或settings),修改即可:


4.基本常識

1) 導(dǎo)包

有時(shí)項(xiàng)目中需要引入其他模塊或者模塊中的某個(gè)函數(shù),需要用到import
from...import锚烦,用法示例如下:

import sys  # 導(dǎo)入整個(gè)模塊
from sys import argv   # 導(dǎo)入模塊中的需要用到的部分
from urllib.error import URLError, HTTPError # 多個(gè)的時(shí)候可以用逗號隔開
from sys import *  # 導(dǎo)出模塊中的所有
# 另外還可以使用as關(guān)鍵字為模塊設(shè)置別名掸犬,比如 import sys as s
# 調(diào)用的時(shí)候直接s.argv 這樣就可以了。

2) 關(guān)鍵字與標(biāo)識符命名規(guī)則

在對變量或者方法名這些標(biāo)識符進(jìn)行命名的時(shí)候通殃,需要注意度液,不能夠
與Python中的關(guān)鍵字相同,通過keyword.kwlist可以查詢所有的關(guān)鍵字:
需要import keyword模塊哦~

除了不能與與關(guān)鍵字相同外骗炉,標(biāo)識符的命名規(guī)則:
由字母忆矛,數(shù)字和下劃線組成采驻,且首字符必須為字母或下劃線临谱,
Python對大小寫敏感;關(guān)于命名規(guī)范的問題僵蛛,沒有什么
強(qiáng)制規(guī)定,整個(gè)項(xiàng)目保持統(tǒng)一就好苫拍,附上網(wǎng)上找的一個(gè)命名規(guī)則:

  • 1.項(xiàng)目名:首字母大寫妥粟,其余小寫桩警,用下劃線增加可讀性,如:Ui_test侣姆;
  • 2.包名與模塊名:全部小寫字母生真;
  • 3.類名:首字母大寫,其余小寫捺宗,多個(gè)單詞駝峰命名法柱蟀;
  • 4.方法(函數(shù))名:全部小寫,多個(gè)單詞用下劃線分隔蚜厉;
  • 5.參數(shù)名:小寫單詞长已,如果與關(guān)鍵詞沖突,參數(shù)名前加上下劃線昼牛,比如_print;
  • 6.變量:小寫术瓮,多個(gè)單詞用下劃線分隔;
  • 7.常量:全部大寫贰健,多個(gè)單詞用下劃線分隔胞四;

3) 注釋

Python 使用 # 來進(jìn)行單行注釋多行注釋的話使用三引號伶椿,比如:

'''
這是
Python的
多行注釋
'''

4) print打印輸出與input輸入函數(shù)

學(xué)習(xí)一門新的編程語言辜伟,第一個(gè)程序基本都是打印Hello world,
把結(jié)果打印到屏幕上脊另,是驗(yàn)證代碼執(zhí)行結(jié)果的最直觀體現(xiàn)导狡,所以
有必要先學(xué)一波 printinput 的用法!

print():

  • 1.可以輸出各種亂七八糟類型的數(shù)據(jù)直接轉(zhuǎn)成字符串打印輸出偎痛;
  • 2.print默認(rèn)會換行旱捧,如果不換行可以: print(xxx, end = "")
  • 3.支持 格式化輸出,和C中的printf用法類似踩麦,逗號分隔前后改成%

?

input():

從鍵盤讀入一個(gè)字符串枚赡,并自動忽略換行符氓癌,所有形式的輸入按字符串處理。
可以在括號里寫一些輸入的提示信息标锄,比如: input("請輸入一個(gè)字符串:")


???輸出結(jié)果:???

5) help函數(shù)

這個(gè)就不用說了顽铸,很多編程語言都有的,可以用來查看某個(gè) 內(nèi)置函數(shù)(BIF)
的相關(guān)用法的料皇,比如help(print)谓松,會輸出這樣的結(jié)果:

6) dir函數(shù)

查看對象內(nèi)所有屬性與方法,只需要把要查詢的對象添加到括號中即可践剂,
比如定義一個(gè)類鬼譬,然后用dir可以獲取所有的屬性與方法:

???部分輸出結(jié)果:???

7) 查看所有內(nèi)置函數(shù)(BIF)

執(zhí)行:print(dir(sys.modules['builtins'])) 可以打印出所有的內(nèi)置函數(shù)。

8) 多個(gè)語句一行與一個(gè)語句多行

如果你想把多個(gè)語句寫到一行逊脯,可以使用优质; (分號)分隔;
有時(shí)語句可能太長军洼,你可以使用\ (反斜杠)來銜接巩螃,
而在[] , {} , ()里的不需要使用反斜杠來銜接。


5.數(shù)據(jù)類型

1) 變量

Python3里定義一個(gè)變量非常簡單粗暴匕争,直接一個(gè) 變量名 = 初值
賦值時(shí)就決定了變量的數(shù)據(jù)類型避乏,變量名引用了數(shù)值的同時(shí)也引用
它的類型,如果不理解的話甘桑,看下例子就知道了拍皮,type可以查看
變量的數(shù)據(jù)類型(另外還要注意Python對大小寫敏感,區(qū)分大小寫跑杭!):

???輸出結(jié)果:???

另外Python中支持多個(gè)變量賦值铆帽,以下這兩種賦值寫法是正確的:

a = b = c = 1
a,b,c = 1,2,"Python"

對了,你還可以使用del關(guān)鍵字刪除對象的引用德谅,但刪除后再調(diào)用
變量是會報(bào)錯(cuò)的爹橱!

???輸出結(jié)果

2) 數(shù)字(Mumber)

Python3中支持四種數(shù)字類型:intfloat窄做,complex(復(fù)數(shù))

注:Python3中 int 不區(qū)分整形與長整形宅荤,整數(shù)的長度不受限制
所以很容易進(jìn)行大數(shù)計(jì)算浸策。而除了十進(jìn)制外的進(jìn)制表示如下:
二進(jìn)制0b八進(jìn)制0o惹盼,十六進(jìn)制0x 開頭庸汗。

Python支持復(fù)數(shù)直接表示法,就是(a+bj)的形式手报,complex類的實(shí)例蚯舱,
可以直接運(yùn)算改化,比如:a = 1 + 2j + 3 * 4j,輸出a枉昏,結(jié)果是:(1+14j)
實(shí)數(shù)+虛數(shù)陈肛,除了a+bj,還可以用complex(a,b)表示兄裂,兩個(gè)都是
浮點(diǎn)型句旱,可以調(diào)用.real獲得實(shí)部,.imag 獲得虛部晰奖,abs()求復(fù)數(shù)
的模(√(a^2 + b^2))谈撒。

數(shù)字類型轉(zhuǎn)換:(Python文檔中,方括號[]括起來表示為可選)

函數(shù) 作用
int(x[,base]) 將x轉(zhuǎn)換為一個(gè)整數(shù)匾南,第二個(gè)參數(shù)是指定前面字符串的進(jìn)制類型
float(x) 將x轉(zhuǎn)換到一個(gè)浮點(diǎn)數(shù)
complex(real [,imag]) 創(chuàng)建一個(gè)復(fù)數(shù)
str(x) 將對象x轉(zhuǎn)換為字符串
repr(x) 將對象x轉(zhuǎn)換為表達(dá)式字符串
eval(str) 用來計(jì)算在字符串中的有效Python表達(dá)式,并返回一個(gè)對象
tuple(s) 將序列s轉(zhuǎn)換為一個(gè)元組
list(s) 將序列s轉(zhuǎn)換為一個(gè)列表
chr(x) 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)字符
unichr(x) 將一個(gè)整數(shù)轉(zhuǎn)換為Unicode字符
ord(x) 將一個(gè)字符轉(zhuǎn)換為它的整數(shù)值
hex(x) 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)十六進(jìn)制字符串
oct(x) 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)八進(jìn)制字符串
bin(x) 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)二進(jìn)制字符串

數(shù)學(xué)函數(shù)

函數(shù) 作用
abs(x) 返回?cái)?shù)字的絕對值啃匿,如abs(-10) 返回 10
ceil(x) 返回?cái)?shù)字的上入整數(shù),如math.ceil(4.1) 返回 5
cmp(x, y) 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1
exp(x) 返回e的x次冪(ex),如math.exp(1) 返回2.718281828459045
fabs(x) 返回?cái)?shù)字的絕對值蛆楞,如math.fabs(-10) 返回10.0
floor(x) 返回?cái)?shù)字的下舍整數(shù)溯乒,如math.floor(4.9)返回 4
log(x) 如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x) 返回以10為基數(shù)的x的對數(shù),如math.log10(100)返回 2.0
max(x1, x2,...) 返回給定參數(shù)的最大值豹爹,參數(shù)可以為序列裆悄。
min(x1, x2,...) 返回給定參數(shù)的最小值,參數(shù)可以為序列帅戒。
modf(x) 返回x的整數(shù)部分與小數(shù)部分灯帮,兩部分的數(shù)值符號與x相同,
整數(shù)部分以浮點(diǎn)型表示逻住。
pow(x, y) x的y次方
round(x [,n]) 返回浮點(diǎn)數(shù)x的四舍五入值钟哥,如給出n值,則代表舍入到
小數(shù)點(diǎn)后的位數(shù)瞎访。
sqrt(x) 返回?cái)?shù)字x的平方根腻贰,數(shù)字可以為負(fù)數(shù),返回類型為實(shí)數(shù)扒秸,
如math.sqrt(4)返回 2+0j

3) 布爾類型(Bool)

TrueFalse來表示真假播演,也可以當(dāng)做整數(shù)來對待,True為1伴奥,
False為0写烤,但是不建議用來參與運(yùn)算!

4) 列表(List)

類似于數(shù)組拾徙,有序洲炊,內(nèi)容長度可變,使用中括號[]表示,元素間用逗號分隔暂衡,
元素的數(shù)據(jù)類型可以不一樣询微!用法示例如下(dir(list)可以查看所有的屬性與方法j):
(Tip:列表可嵌套,如果想訪問列表中的列表中的某個(gè)值可以寫多個(gè)[],比如:list1[1][2])

list1 = [1,2.0,"a",True]  # 定義列表
print(list1[1])           # 通過[下標(biāo)]訪問元素狂巢,從0開始撑毛,結(jié)果輸出:2.0
print(list1[1:3])         # 支持截取,比如這里的[1:3]唧领,結(jié)果輸出:[2.0, 'a']
print(list1[1:3:2])       # 還可以有第三個(gè)參數(shù)藻雌,步長,默認(rèn)為1疹吃,結(jié)果輸出:[2.0]
print(list1[2:])          # 輸出結(jié)果:['a', True]
print(list1[-2])          # 負(fù)數(shù)的話從后面開始訪問蹦疑,結(jié)果輸出:a
print(list1.index("a"))   # 返回參數(shù)在列表中的位置,結(jié)果輸出:2    

# 修改列表元素
list1[1] = 3.0            # 直接獲得元素后進(jìn)行修改萨驶,此時(shí)列表元素:[1, 3.0, 'a', True]

# 添加元素
list1.append('Jay')       # 追加一個(gè)元素歉摧,此時(shí)列表元素:[1, 2.0, 'a', True, 'Jay']
list1.insert(2,'pig')     # 插入一個(gè)元素,此時(shí)列表元素:[1, 2.0, 'pig', 'a', True]
print(list1.pop())        # 移除最后一個(gè)元素腔呜,并返回元素的值叁温,結(jié)果輸出:True         

# 刪除元素
del list1[0]              # 刪除索引位置的值,此時(shí)列表元素:[2.0, 'a', True]
list1.remove('a')         # 刪除指定的元素值核畴,此時(shí)列表元素:[1, 2.0, True]

# 其他(使用+號可以組合列表膝但,*號可以重復(fù)列表)
print(list1+list1)        # 輸出結(jié)果:[1, 2.0, 'a', True, 1, 2.0, 'a', True]
print(list1*2)            # 輸出結(jié)果:[1, 2.0, 'a', True, 1, 2.0, 'a', True]
print('a' in list1)       # 判斷列表中是否有此元素,輸出結(jié)果:True
print('b' not in list1)   # 判斷原始中是不是沒有這個(gè)元素谤草,輸出結(jié)果:True
for x in list:            # 迭代遍歷列表
print(len(list1))         # 獲得列表長度跟束,結(jié)果輸出:4
print(list1.count(1))     # 統(tǒng)計(jì)某個(gè)元素在列表中出現(xiàn)的次數(shù),結(jié)果輸出:2丑孩,因?yàn)門rue的值也是1
max(list1)                # 獲得列表中的元素最大值冀宴,列表元素類型需要為數(shù)字
min(list1)                # 獲得列表中的元素最小值,列表元素類型需要為數(shù)字
list1.sort()              # 對原列表元素進(jìn)行排序温学,本地排序(會修改值)略贮,返回None,
                          # 只能比較數(shù)字仗岖!默認(rèn)從小到大逃延,從大到小可以用可選參數(shù),括號里加上:
                          # key = lambda x:-1*x
                          
list1.reverse()           # 反轉(zhuǎn)列表元素轧拄,會修改列表揽祥,返回None
list2 = list1.copy()      # 拷貝列表,重新開辟了內(nèi)存空間檩电!和等號賦值不一樣拄丰!
list(tuple)               # 將元組或字符串轉(zhuǎn)換為列表

5) 元組(tuple)

受限的列表桅打,元組中的元素不能修改,使用小括號()表示愈案。
有一點(diǎn)要注意的是:當(dāng)元組中只有一個(gè)元素,需要在元素后添加逗號鹅搪,
否則會當(dāng)做括號運(yùn)算符使用站绪!元組可以當(dāng)做不能修改的參數(shù)傳遞給函數(shù),
而且元組所占用的內(nèi)存較小丽柿。使用的話恢准,除了沒有修改元組元素的方法外,
其他的和列表的方法基本一致甫题。

另外元組中的元素不能刪除馁筐,但是可以使用del語句來刪除整個(gè)元組
不過比較少用坠非,因?yàn)镻ython回收機(jī)制會在這個(gè)元組不再被使用時(shí)自動刪除
(和Java的gc有點(diǎn)像~) 還可以使用tuple(list)將字符串或列表轉(zhuǎn)換為元組敏沉。

??輸出結(jié)果:??

6) 字典(dict)

和列表,元組通過下標(biāo)序列來索引元素不同炎码,字典使用鍵值對的形式來存儲
數(shù)據(jù)盟迟,通過鍵來索引值,創(chuàng)建字典時(shí)潦闲,鍵不能重復(fù)攒菠,重復(fù)后面的會覆蓋
因?yàn)殒I必須不可變歉闰,所以可用數(shù)字辖众,字符串或元組,但是不能用列表和敬!
使用冒號:分割鍵與值凹炸,多個(gè)鍵值對用逗號,分隔;字典也是支持嵌套的概龄!
用法示例如下:

dict1 = {}                          # 定義一個(gè)空字典
dict2 = {'a': 1, 'b': 2, 3: "c"}    # 定義一個(gè)普通字典
dict4 = dict2.copy()                # 淺復(fù)制一個(gè)字典

# 可以使用fromkeys創(chuàng)建并返回新的字典还惠,有兩個(gè)參數(shù),鍵和鍵對應(yīng)的值
# 值可以不提供私杜,默認(rèn)None蚕键,不過有個(gè)小細(xì)節(jié)要注意,下面的例子輸出
# 的結(jié)果是:{1: ['a', 'b', 'c'], 2: ['a', 'b', 'c'], 3: ['a', 'b', 'c']}
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
dict3 = {}
dict3 = dict3.fromkeys(list1, list2)
print(dict3)

# 通過鍵查詢對應(yīng)的值衰粹,如果沒有這個(gè)鍵會報(bào)錯(cuò)TypeError锣光,這里輸出結(jié)果:2
print(dict2['b'])    
print(dict2.get("d"))               # 通過get()方法查詢鍵對應(yīng)的值,沒有的話會返回None
                                    # 還可以加上一個(gè)默認(rèn)的返回參數(shù)get(x,y)
print(dict2.setdefault("d"))        # 和get()類似铝耻,如果找不到鍵的話會自動添加 鍵:None                     
print("d" in dict2)                 # 字典中是否有此鍵誊爹,這里輸出結(jié)果:False
print("d" not in dict2)             # 字典中是否沒有此鍵蹬刷,這里輸出結(jié)果:True

print(dict2.keys())                 # 返回字典中所有的鍵,這里輸出結(jié)果:dict_keys(['a', 3, 'b'])
print(dict2.values())               # 返回字典中所有的值频丘,這里輸出結(jié)果:dict_values([1, 'c', 2])
print(dict2.items())                # 返回字典中所有的鍵值對办成,這里輸出結(jié)果:
                                    # dict_items([('a', 1), (3, 'c'), ('b', 2)])

# 修改鍵對應(yīng)的值,此時(shí)字典元素:{3: 'c', 'a': 1, 'b': 'HaHa'}
dict2['b'] = 'HaHa' 
dict2.update(b:'Pig')               # 使用update方法可以更新鍵對應(yīng)的值搂漠,不過鍵需要為字符串迂卢!

# 刪除字典元素
del(dict2['b'])                     # 刪除某個(gè)鍵值對,此時(shí)字典元素:{3: 'c', 'a': 1}
dict2.clear()                       # 移除字典中所有的鍵值對桐汤,此時(shí)剩下空字典:{}
del dict2                           # 刪除整個(gè)字典而克,刪除后無法再重復(fù)引用!U员萍!
print(dict2.pop('a'))               # 根據(jù)鍵刪除對應(yīng)的值,返回被刪除的值拣度。
print(dict2.popitem())              # 刪除一個(gè)項(xiàng)碎绎,隨機(jī),比如:('b', 2)

# 遍歷字典:
for d in dict2:
    print("%s:%s" % (d, dict2.get(d)))
    
for (k,v) in dict2.items():
    print("%s:%s" % (k, v))

7) 集合(set)

集合中的存儲的元素無序且不重復(fù)蜡娶,所以你無法去索引某個(gè)具體的元素混卵;
使用大括號{}包裹元素,逗號分隔窖张,如果有重復(fù)的元素會被自動剔除幕随!
另外有一點(diǎn)要注意的是,如果是創(chuàng)建空集合必須使用set()宿接,而不能用{}赘淮,
通過上面我們也知道了{}的話是直接創(chuàng)建一個(gè)空字典
用法示例如下:

set1 = set()  # 創(chuàng)建空集合
set2 = {1, 2, 3, 4, 5, 1}  # 普通方式創(chuàng)建集合
print(set2)  # 重復(fù)元素會被自動刪除睦霎,輸出結(jié)果:{1, 2, 3, 4, 5}

set3 = set('12345')  # 字符串
print(set3)  # 輸出:{'2', '5', '3', '4', '1'}梢卸,集合元素?zé)o序

print(6 in set2)  # 判斷集合中是否有此元素:輸出結(jié)果:False
print(6 not in set2)  # 判斷集合中是否有此元素:輸出結(jié)果:True

set2.add("6")  # 添加元素
print(set2)  # 輸出結(jié)果:{1, 2, 3, 4, 5, '6'}

set2.remove(2)  # 刪除元素,如果刪除的元素不存在會報(bào)錯(cuò)
print(set2)  # 輸出結(jié)果:{1, 3, 4, 5, '6'}

# 遍歷集合副女,輸出結(jié)果: 1  3   4   5   6
for data in set2:
    print(data, end="\t")

# 使用frozenset()函數(shù)定義不可變集合
set4 = frozenset({1, 2, 3, 4, 5})

8) 字符串

Python里對處理字符串可是日常蛤高,熟練掌握字符串的處理非常重要。
可以使用單引號('')或者雙引號("")來修飾字符串碑幅,
如果想讓字符串包含換行縮進(jìn)等格式時(shí)戴陡,可以使用三括號('''''')
來修飾,一般要打印段落文字的時(shí)候可以用這個(gè)沟涨。
另外恤批,字符串定義后就不能修改元素了,比如下面str1[0] = 'x'是會報(bào)錯(cuò)的裹赴,
只能通過+,*喜庞,分片等方式進(jìn)行拼接诀浪,間接得到相同的字符串內(nèi)容,不過卻不是原來
的字符了延都,變量指向了新的字符串雷猪,而舊的會被py的回收機(jī)制回收掉!

訪問字符串

str1 = "Hello Python"
print(str1[3])                  # 輸出結(jié)果:l
print(str1[2:])                 # 輸出結(jié)果:llo Python
print(str1[2:5])                # 輸出結(jié)果:llo
print(str1[2:10:2])             # 輸出結(jié)果:loPt
print(str1[0:8] + str1[8:])     # 輸出結(jié)果:Hello Python
str2 = str1[6:] * 3
print(str2)                     # 輸出結(jié)果:PythonPythonPython

轉(zhuǎn)義字符

轉(zhuǎn)義字符 作用 轉(zhuǎn)義字符 作用 轉(zhuǎn)義字符 作用
行尾的\ 續(xù)行符 \\ 反斜杠 \' 單引號
\a 響鈴 \b 退格 \e 轉(zhuǎn)義
\000 \n 換行 \v 縱向制表符
\t 橫向制表符 \r 回車 \f 換頁
\o 八進(jìn)制數(shù)代表字符 \x 十六進(jìn)制數(shù)代表字符

各種內(nèi)置方法

方法名 作用
capitalize() 把字符串的第一個(gè)字符改為大寫
casefold() 把整個(gè)字符串的所有字符改為小寫
center(width) 將字符串居中晰房,并使用空格填充至長度width的新字符串
count(sub[,start[,end]]) 返同sub在字符申里邊出現(xiàn)的次數(shù)春宣,
start和end參數(shù)表示范圍,可選
encode(encoding= 'utf-8 ',errors='strict') 以encoding指定的編碼格式對字符串進(jìn)行編碼
endswith(sub[,start[,end]]) 檢查字符串是否以sub 子字符串結(jié)束嫉你,如果是返回True,
否則返回False躏惋。start和end參數(shù)表示范圍幽污,可選
expandtabs([tabsize= 8]) 把字符串中的tab符號(\t)轉(zhuǎn)換為空格,如不指定參數(shù)簿姨,
默認(rèn)的空格數(shù)是tabsize=8
find(sub[,start[,end]]) 檢測sub是否包含在字符串中距误,如果有則返回索引值,
否則返回-1,start和end參數(shù)表示范圍扁位,可選
index(sub[,start[,end]]) 跟find方法一樣准潭,不過如果sub不在string中會產(chǎn)生一個(gè)異常
isalnum() 如果字符串中至少有一個(gè)字符,并且所有字符都是
字母或數(shù)字則返回True域仇,否則返回False
isalpha() 如果字符串至少有一個(gè)字符串刑然,并且所有字符都是
字母則返回True,否則返回False
isdecimal() 如果字符串只包含十進(jìn)制數(shù)字則返回True暇务,否則返回False
isdigit() 如果字符串只包含數(shù)字則返回True泼掠,否則返回False
islower() 如果字符串中至少包含一個(gè)區(qū)分大小寫的字符,并且這些字符
都是小寫垦细,則返回True择镇,否則返回False
isnumeric() 如果字符串中只包含數(shù)字字符,則返回True括改,否則返回False
isspace() 如果字符串中只包含空格腻豌,則返回True,否則返回False
istitle() 如果字符串是標(biāo)題化(所有單詞大寫開頭嘱能,其余小寫)吝梅,
則返回True,否則返回False
isupper() 如果字符串中至少包含一個(gè)區(qū)分大小寫的字符焰檩,并且這些
字符都是大寫憔涉,則返回True,否則返回False
join(sub) 以字符串作為分隔符析苫,插入到sub中所有的字符之間兜叨,使用+去拼接大量
字符串的時(shí)候是很低效率的穿扳,因?yàn)榧犹柶唇訒饍?nèi)存賦值一級垃圾回收
操作哎迄,此時(shí)用join來拼接效率會高一些戈咳,比如: ''.join(['Hello','Python'])
ljust(width) 返回一個(gè)左對齊的字符串炒事,并使用空格填充至長度為width的新字符串
lower() 轉(zhuǎn)換字符串所有大寫字符為小寫
lstrip() 去除字符串左邊的所有空格
partition(sub) 找到子字符串sub懈叹,把字符串分割成3元組(前奋岁,pre坷随,后)
如果字符串中不包含則返回('原字符串','','')
replace(old, new[,count]) 把字符串中的old子字符串替換成new枣申,如果count指定茂契,
則替換次數(shù)不超過count次
rfind(sub[,start[,end]]) 和find()方法類似屡久,不過是從右開始查找
rindex(sub[,start[,end]]) 和index()方法類似忆首,不過是從右開始查找
rjust(width) 返回一個(gè)右對齊的字符串,并使用空格填充至長度為width的新字符串
rpartition(sub) 類似于partition()被环,不過是從右邊開始查找
rstrip() 刪除字符串末尾的空格
split(sep=None,maxsplit=-1) 不帶參數(shù)默認(rèn)是以空格為分隔符切片字符串糙及,如果maxspli參數(shù)t
右設(shè)置,則僅分隔maxsplit個(gè)子字符串筛欢,返回切片后的子字符串拼接的列表
splitlines([keepends]) 按照'\n'分隔浸锨,返回一個(gè)包含各行作為元素的列表,如果keepends參數(shù)
指定版姑,則返回前keepends行
startswith(prefix[,start[,end]]) 檢查字符串是否以prefix開頭柱搜,是則返回True,否則返回False剥险。
start和end參數(shù)可以指定范圍檢查聪蘸,可選
strip([chars]) 刪除字符串前邊和后邊所有的空格,chars參數(shù)可定制刪除的字符串表制,可選
swapcase() 反轉(zhuǎn)字符串中的大小寫
title() 返回標(biāo)題化(所有的單詞都是以大寫開始宇姚,其余字母小寫)的字符串
translate(table) 按照table的規(guī)則(可由str.maketrans('a','b')定制)轉(zhuǎn)換字符串中的字符
upper() 轉(zhuǎn)換字符串中所有的小寫字符為大寫
zfill(width) 返回長度為width的字符串,原字符串右對齊夫凸,前邊用0填充

字符串格式化

其實(shí)就是format方法的使用而已浑劳,示例如下:

# 位置參數(shù)
str1 = "{0}生{1},{2}{3}夭拌!".format("人","苦短","我用","Python")
print(str1) # 輸出結(jié)果:人生苦短魔熏,我用Python!

# 關(guān)鍵字參數(shù)
str1 = "{a}生{c}鸽扁,蒜绽o6sg4yo!".format(a = "人", c = "苦短",b = "我用",d = "Python")
print(str1) # 輸出結(jié)果:人生苦短桶现,我用Python躲雅!

# 位置參數(shù)可以與關(guān)鍵字參數(shù)一起使用,不過位置參數(shù)需要在關(guān)鍵字參數(shù)前骡和,否則會報(bào)錯(cuò)相赁!

# 另外還有個(gè)叫替換域的東西相寇,冒號代表格式化符號開始,比如下面的例子:
str1 = "{0}:{1:.4}".format("圓周率", 3.1415926)
print(str1) # 輸出結(jié)果:圓周率:3.142

格式化操作符%钮科,這個(gè)就不說了唤衫,和上面print()那里的一致!

9) 運(yùn)算符

算術(shù)操作符:(+ - * / % **(冪绵脯,次方) //(地板除法佳励,舍棄小數(shù)))

print("3 + 7 = %d" % (3 + 7))   # 輸出結(jié)果: 3 + 7 = 10
print("3 - 7 = %d" % (3 - 7))   # 輸出結(jié)果: 3 - 7 = -4
print("3 * 7 = %d" % (3 * 7))   # 輸出結(jié)果: 3 * 7 = 21
print("7 / 3 = %f" % (7 / 3))   # 輸出結(jié)果: 7 / 3 = 2.333333
print("7 %% 3 = %d" % (7 % 3))  # 輸出結(jié)果: 7 % 3 = 1
print("3 ** 6 = %d" % (7 ** 3)) # 輸出結(jié)果: 3 ** 6 = 343
print("3 // 6 = %f" % (7 // 3)) # 輸出結(jié)果: 3 // 6 = 2.000000

比較運(yùn)算符:(== != > < >= <=)

賦值運(yùn)算符:(== += -= *= /= %= **= //=)

位運(yùn)算符:(&(按位與) |(按位或) ^(異或,不同為1) ~(取反) << >>)

邏輯運(yùn)算符:(and or not)

成員運(yùn)算符:(in not in)

身份運(yùn)算符(判斷是否引用同一個(gè)對象):(is is not)

運(yùn)算符優(yōu)先級

**(指數(shù)) ??>?? ~ + -(取反蛆挫,正負(fù)號) ??>?? * / % //(乘除赃承,求余,地板除) ??>?? << >>(左右移)
> ?? &(按位與) ??>??^ |(異或悴侵,按位或)??> ??< <= > >=(比較運(yùn)算符) ??>??等于運(yùn)算符??> ??賦值運(yùn)算符??
>??身份運(yùn)算符??>??成員運(yùn)算符??>??邏輯運(yùn)算符

10) 日期時(shí)間

日期時(shí)間并不屬于數(shù)據(jù)結(jié)構(gòu)楣导,只是覺得很常用,索性也在這里把用法mark下~
以來的兩個(gè)模塊是:timedatetime畜挨,詳細(xì)用法示例如下:

import time, datetime

# 獲取當(dāng)前時(shí)間
moment = time.localtime()   
print("年:%s" % moment[0])
print("月:%s" % moment[1])
print("日:%s" % moment[2])
print("時(shí):%s" % moment[3])
print("分:%s" % moment[4])
print("秒:%s" % (moment[5] + 1))
print("周幾:%s" % (moment[6] + 1))
print("一年第幾天:%s" % moment[7])
print("是否為夏令時(shí):%s" % moment[8]) 

# 格式化時(shí)間(這里要注意strftime和strptime是不一樣的!X肌巴元!)
moment1 = time.strftime('%Y-%m-%d %H:%M:%S')
moment2 = time.strftime('%a %b %d %H:%M:%S %Y', time.localtime())
moment3 = time.mktime(time.strptime(moment2, '%a %b %d %H:%M:%S %Y'))
print(moment1)  # 輸出結(jié)果:2017-12-02 11:08:02
print(moment2)  # 輸出結(jié)果:Sat Dec 02 11:08:02 2017
print(moment3)  # 輸出結(jié)果:1512184082.0   日期轉(zhuǎn)換為時(shí)間戳

# 獲得當(dāng)前時(shí)間戳
print(time.time())  # 輸出結(jié)果:1512185208.0942981

# 獲得當(dāng)前時(shí)間(時(shí)間數(shù)組,還需strftime格式化下)
print(datetime.datetime.now())  # 輸出結(jié)果:2017-12-02 11:34:44.726843

# 時(shí)間戳轉(zhuǎn)換為時(shí)間
# 方法一:(輸出結(jié)果:2017-12-02 11:08:02)
moment4 = 1512184082
moment5 = time.localtime(moment4)  # 轉(zhuǎn)換成時(shí)間數(shù)組
print(time.strftime('%Y-%m-%d %H:%M:%S', moment5))  # 格式化
# 方法二:
moment6 = datetime.datetime.utcfromtimestamp(moment4)
print(moment6)  # 直接輸出:2017-12-02 03:08:02
moment7 = moment6.strftime('%a %b %d %H:%M:%S %Y')
print(moment7)  # 格式化后輸出:Sat Dec 02 03:08:02 2017

# 延遲執(zhí)行
time.sleep(秒)


6.流程控制

1) if條件判斷

python中沒有switch-case驮宴,另外使用了 elif 代替了else if
每個(gè)條件后需要跟一個(gè)冒號(:)逮刨,通過縮放來劃分代碼塊,
嵌套的時(shí)候要注意堵泽!使用示例如下:

???輸出結(jié)果

另外修己,如果條件成立,你又不想做任何事情迎罗,可以直接使用pass空語句

2) while循環(huán)

python中沒有do-while睬愤,同樣要注意冒號和縮放!
可以搭配else使用纹安,還有無限循環(huán)這種東西:while True:
使用下面的break關(guān)鍵字可以跳出循環(huán)尤辱。
使用示例如下:

???輸出結(jié)果

3) for循環(huán)

和C或者Java那種for循環(huán)不同,并不能直接寫 for(int a = 0;a < 100;a++)
使用示例如下:

???

輸出結(jié)果

4) break厢岂,continue光督,else

break跳出循環(huán);continue跳過余下操作直接進(jìn)入下一次循環(huán)塔粒;
else也可以使用在循環(huán)结借,for循環(huán)條件不成立時(shí)執(zhí)行,如果先break的話不會執(zhí)行卒茬!

5) 條件表達(dá)式(簡化版的if-else)

a = x if 條件 else y

6) 斷言

當(dāng)assert關(guān)鍵字后面的判斷條件為假的時(shí)候船老,程序自動崩潰并拋出AssertionErro異常咖熟,
一般在測試程序的時(shí)候才會用到,要確保某個(gè)條件為真程序才能正常工作的時(shí)候使用~

7) 迭代器與生成器

迭代器:用于訪問集合努隙,是一種可以記住遍歷位置的對象球恤,會從第一個(gè)元素
開始訪問,直到結(jié)束荸镊,兩個(gè)基本的方法:iter()next()

???

輸出結(jié)果

生成器

應(yīng)該叫生成器函數(shù)吧咽斧,一種特別的函數(shù),用yield來返回值躬存,
調(diào)用時(shí)會返回一個(gè)生成器對象张惹,本質(zhì)上還是迭代器,只是更加簡潔岭洲,
yield對應(yīng)的值在函數(shù)調(diào)用的時(shí)候不會立即返回宛逗,只有去調(diào)用next()
方法的時(shí)候才會返回,使用for x in xxx的時(shí)候其實(shí)調(diào)用的還是next()方法雷激,
最簡單的使用示例如下:

???輸出結(jié)果:???

如果你用type()方法查下,會發(fā)現(xiàn)返回的對象類型是:<class 'generator'>
相比起迭代器沃饶,生成器更加簡潔優(yōu)雅脚牍,最經(jīng)典的例子就是實(shí)現(xiàn)斐波那契數(shù)列:

def func(n):
    a, b = 0, 1
    while n > 0:
        n -= 1
        yield b
        a, b = b, a + b

for i in func(10):
    print(i, end="\t")

# 輸出結(jié)果:1 1 2 3 5 8 13 21 34 55 
    

7.函數(shù)

對于一些重復(fù)使用的代碼塊岭妖,我們可以把他抽取出來寫成一個(gè)函數(shù)裁眯。

1) 函數(shù)定義

使用 def關(guān)鍵字 修飾鹉梨,后接函數(shù)名圓括號(傳入?yún)?shù)),
使用 return關(guān)鍵字 返回值穿稳,不寫的話默認(rèn)返回 None值存皂,
Python可以動態(tài)確定函數(shù)類型,返回不同的類型的值,可以利用
列表打包多種類型的值一次性返回旦袋,也可以直接用元組返回多個(gè)值骤菠;
另外函數(shù)參數(shù)如果有多個(gè)的話,可以用逗號隔開疤孕。
還有一個(gè)建議是:在函數(shù)第一行語句可以選擇性地使用文檔字符串用于存放
函數(shù)說明商乎,直接用三引號注釋包括即可,通過help方法可以拿到祭阀!

2) 形參與實(shí)參

定義函數(shù)時(shí)的參數(shù)是形參鹉戚,調(diào)用時(shí)傳入的是實(shí)參;

3) 關(guān)鍵字參數(shù)

參數(shù)有多個(gè)的時(shí)候柬讨,怕參數(shù)混淆傳錯(cuò)崩瓤,可以在傳入的時(shí)候
指定形參的參數(shù)名,比如: show(a = "a", b = "b")這樣踩官。

4) 默認(rèn)參數(shù)

定義的形參時(shí)候賦予默認(rèn)初值却桶,調(diào)用時(shí)就可以不帶
參數(shù)去調(diào)用函數(shù),比如:def sub(a = "1", b = "2")蔗牡,調(diào)用時(shí)直接
什么都傳sub()或者傳入一個(gè)參數(shù)sub(3)都可以颖系,還可以配合
關(guān)鍵字參數(shù)指定傳入的是哪個(gè)參數(shù)。

5) 可變參數(shù)

有時(shí)傳入的函數(shù)參數(shù)數(shù)目可能是不固定的辩越,比如嘁扼,要你
計(jì)算一組值的和,具體有多少個(gè)數(shù)字不知道黔攒,此時(shí)就可以用可變參數(shù)了趁啸。
只需要在參數(shù)前加上*號(其實(shí)是把數(shù)據(jù)打包成了元組),就代表這個(gè)
參數(shù)是可變參數(shù)督惰;如果有多個(gè)參數(shù)不傅,寫在可變參數(shù)后的參數(shù)要用
關(guān)鍵字參數(shù)指定
,否則會加入可變參數(shù)的范疇I团摺7萌ⅰ!有打包自然有
解包觉阅,如果想把列表或元組當(dāng)做可變參數(shù)傳入崖疤,需要在傳入的時(shí)候
在實(shí)參前加上*號!另外典勇,如果想把參數(shù)打包成元組的方式的話劫哼,
可以使用兩個(gè)星號(**)修飾~

6) 全局變量與局部變量

全局變量就是定義為在最外部的,可以在函數(shù)內(nèi)部進(jìn)行訪問但不能直接修改割笙;
局部變量就是定義在函數(shù)內(nèi)部的沦偎,而在函數(shù)外部無法訪問的參數(shù)或變量;

局部變量無法在外部訪問的原因
Python在運(yùn)行函數(shù)時(shí),會利用棧(Stack)來存儲數(shù)據(jù)豪嚎,執(zhí)行完
函數(shù)后搔驼,所有數(shù)據(jù)會被自動刪除。

函數(shù)中無法修改全局變量的原因
當(dāng)試圖在函數(shù)里修改全局變量的值時(shí)侈询,Python會自動在函數(shù)內(nèi)部新建一個(gè)
名字一樣的局部變量代替舌涨。如果硬是要修改,可以在函數(shù)內(nèi)部使用
global關(guān)鍵字 修飾全局變量扔字,但是不建議這樣做囊嘉,會使得程序
維護(hù)成本的提高。

7) 內(nèi)部函數(shù)

其實(shí)就是函數(shù)嵌套革为,一個(gè)函數(shù)里嵌套另一個(gè)函數(shù)扭粱,需要注意一點(diǎn):
內(nèi)部函數(shù)的作用域只在內(nèi)部函數(shù)的直接外部函數(shù)內(nèi),外部是
無法調(diào)用的震檩,如果調(diào)用會報(bào)錯(cuò)的琢蛤。

8) 閉包

Python中的閉包:如果在一個(gè)外部函數(shù)中,對外部作用域(非全局)的變量
進(jìn)行引用抛虏,那么內(nèi)部函數(shù)就被認(rèn)為是閉包博其。簡單的例子如下:

??? 輸出結(jié)果:???

不能在外部函數(shù)以外的地方調(diào)用內(nèi)部函數(shù),會報(bào)方法名未定義迂猴。
另外慕淡,內(nèi)部函數(shù)不能直接修改外部函數(shù)里的變量,會報(bào)UnboundLocalError錯(cuò)誤沸毁!
和前面函數(shù)里修改全局變量的情況一樣峰髓,如果硬是要修改的話
可以把外部函數(shù)中的變量間接通過容器類型來存放,或者使用
Python3 中提供的nolocal關(guān)鍵字修飾修改的變量息尺。例子如下:

??? 輸出結(jié)果:??? 400

9) lambda表達(dá)式

在Python中可以使用lambda關(guān)鍵字來創(chuàng)建匿名函數(shù)携兵,直接返回一個(gè)函數(shù)對象
不用去糾結(jié)起什么名字掷倔,省了定義函數(shù)的步驟眉孩,從而簡化代碼的可讀性个绍!
簡單的對比大小lambda表達(dá)式例子如下:

big = lambda x, y: x > y
print("第一個(gè)參數(shù)比第二個(gè)參數(shù)大:%s" % big(1, 2))
# 輸出結(jié)果:第一個(gè)參數(shù)比第二個(gè)參數(shù)大:False

10) 遞歸

其實(shí)就是函數(shù)調(diào)用自身勒葱,最簡單的遞歸求和例子如下:

def sum(n):
    if n == 1:
        return 1
    else:
        return n + sum(n - 1)

print("1到100的求和結(jié)果是: %d" % sum(100))

# 輸出結(jié)果:1到100的求和結(jié)果是: 5050

8.異常處理

1) 語法錯(cuò)誤與運(yùn)行異常區(qū)分

語法錯(cuò)誤是連編譯器那關(guān)都過不了的錯(cuò)誤,比如if后漏掉:冒號巴柿,跑都跑不起來凛虽;
運(yùn)行異常則是程序跑起來后,因?yàn)槌绦虻臉I(yè)務(wù)邏輯問題引起的程序崩潰广恢,比如除以0凯旋;

2) Python中的常見異常

異常 描述信息
AssertionError 斷言語句失敗
AttributeError 嘗試訪問未知的對象屬性
IndexError 索引超出序列的范圍
keyError 字典中查找一個(gè)不存在的Key
NameError 嘗試訪問一個(gè)不存在的變量
OSError 操作系統(tǒng)產(chǎn)生的異常,比如FileNotFoundError
SyntaxError Python語法錯(cuò)誤
TypeError 不同類型間的無效操作
ZeroDivisionError 除數(shù)為0
IOError 輸入輸出錯(cuò)誤
ValueError 函數(shù)傳參類型錯(cuò)誤

3) 異常捕獲

try-expect-else語句try-finally語句

# 1.最簡單的至非,try捕獲了任何異常钠署,直接丟給except后的代碼塊處理:
try:
    result = 1 / 0
except:
    print("捕獲到異常了!")  # 輸出:捕獲到異常了!
    
    
# 2.捕獲特定類型:
try:
    result = 1 / 0
except ZeroDivisionError:
    print("捕獲到除數(shù)為零的錯(cuò)誤")   # 輸出:捕獲到除數(shù)為零的錯(cuò)誤
    
    
# 3.針對不同的異常設(shè)置多個(gè)except
try:
    sum = 1 + '2'
    result = 1 / 0
except TypeError as reason:
    print("類型出錯(cuò):" + str(reason))
except ZeroDivisionError as reason:
    print("除數(shù)為0:" + str(reason))    
# 輸出:類型出錯(cuò):unsupported operand type(s) for +: 'int' and 'str'


# 4.對多個(gè)異常統(tǒng)一處理
try:
    result = 1 / 0
    sum = 1 + '2'
except (TypeError, ZeroDivisionError) as reason:
    print(str(reason))  # 輸出:division by zero


# 5.當(dāng)沒有檢測到異常時(shí)才執(zhí)行的代碼塊,可以用else
try:
    result = 4 / 2
except ZeroDivisionError as reason:
    print(str(reason))
else:
    print("沒有發(fā)生異常荒椭,輸出結(jié)果:%d" % result)
# 輸出:沒有發(fā)生異常谐鼎,輸出結(jié)果:2


# 6.無論是否發(fā)生異常都會執(zhí)行的一段代碼塊,比如io流關(guān)閉趣惠,
# 可以使用finally子句狸棍,如果發(fā)生異常先走except子句,后走finally子句味悄。
try:
    result = 4 / 2
except ZeroDivisionError as reason:
    print(str(reason))
else:
    print("沒有發(fā)生異常草戈,輸出結(jié)果:%d" % result)
finally:
    print("無論是否發(fā)生異常都會執(zhí)行~")
# 輸出結(jié)果:
# 沒有發(fā)生異常,輸出結(jié)果:2
# 無論是否發(fā)生異常都會執(zhí)行~

4) 拋出異常

使用raise語句可以直接拋出異常侍瑟,比如raise TypeError(異常解釋唐片,可選)

5) 上下文管理-with語句

當(dāng)你的異常捕獲代碼僅僅是為了保證共享資源(文件,數(shù)據(jù)等)的唯一分配丢习,
并在任務(wù)結(jié)束后釋放掉它牵触,那么可以使用with語句,例子如下:

try:
    with open('123.txt', "w") as f:
        for line in f:
            print(line)
except OSError as reason:
    print("發(fā)生異常:" + str(reason))

# 輸出結(jié)果:發(fā)生異常:not readable

6) sys.exc_info 函數(shù)

除了上面獲取異常信息的方式外咐低,還可以通過sys模塊的exc_info() 函數(shù)獲得:
示例如下:

# 輸出結(jié)果依次是:異常類揽思,類示例,跟蹤記錄對象
try:
    result = 1 / 0
except:
    import sys
    tuple_exception = sys.exc_info()
    
for i in tuple_exception:
    print(i)
    
# 輸出結(jié)果:
# <class 'ZeroDivisionError'>
# division by zero
# <traceback object at 0x7f3560c05808>


9.文件存儲

1) open函數(shù)與文件打開模式

Python中讀寫文件非常簡單见擦,通過open()函數(shù) 可以打開文件并
返回文件對象
使用help命令可以知道钉汗,open函數(shù)有好幾個(gè)參數(shù):

作為初學(xué)者,暫時(shí)了解前兩個(gè)參數(shù)就夠了:
file參數(shù)文件名鲤屡,不帶路徑的話會在當(dāng)前文件夾中查找损痰;
mode打開模式,有以下幾種打開方式:

模式 作用
r 只讀模式打開酒来,默認(rèn)
w 寫模式打開卢未,若文件存在,先刪除堰汉,然后重新創(chuàng)建
a 追加模式打開辽社,追加到文件末尾,seek()指向其他地方也沒用翘鸭,文件不存在滴铅,自動創(chuàng)建
b 二進(jìn)制模式打開
t 文本模式打開,默認(rèn)
+ 可讀寫模式就乓,可配合其他模式使用汉匙,比如r+拱烁,w+
x 如果文件已存在,用此模式打開會引發(fā)異常
U 通用換行符支持

2) 文件對象的方法

函數(shù) 作用
close() 關(guān)閉文件噩翠,關(guān)閉后文件不能再進(jìn)行讀寫操作
read(size=-1) 從文件讀取指定的字節(jié)數(shù)戏自,如果未設(shè)置或?yàn)樨?fù)數(shù),讀取所有
next() 返回文件下一行
readline() 讀取整行伤锚,包括換行符'\n'
seek(offset, from) 設(shè)置當(dāng)前文件指針的位置浦妄,從from(0文件起始位置,1當(dāng)前位置见芹,
2文件末尾)偏移offset個(gè)字節(jié)
tell() 返回文件的當(dāng)前位置
write(str) 將字符串寫入文件
writelines(seq) 寫入一個(gè)序列字符串列表剂娄,如果要換行,需要自己加入每行的換行符

3) 使用例子

# 讀取123.txt文件里的內(nèi)容打印玄呛,同時(shí)寫入到321.txt中
try:
    f1 = open("321.txt", "w")
    with open("123.txt", "r") as f2:
        for line in f2:
            print(line, end="")
            f1.write(line)

except OSError as reason:
    print("發(fā)生異常" + str(reason))
finally:
    f1.close()  # 用完要關(guān)閉文件阅懦,f2不用是因?yàn)橛昧藈ith

輸出結(jié)果

????

4) OS模塊中關(guān)于文件/目錄的常用函數(shù)

需要導(dǎo)入os模塊,使用的時(shí)候需加上模塊引用徘铝,比如os.getcwd()

函數(shù) 作用
getcwd() 返回當(dāng)前工作目錄
chdir(path) 改變當(dāng)前工作目錄
listdir(path='.') 不寫參數(shù)默認(rèn)列舉當(dāng)前目錄下所有文件和文件夾耳胎,'.'當(dāng)前目錄,'..'上一層目錄
mkdir(path) 創(chuàng)建文件夾惕它,若存在會拋出FileExistsError異常
mkdirs(path) 可用于創(chuàng)建多層目錄
remove(path) 刪除指定文件
rmdir(path) 刪除目錄
removedirs(path) 刪除多層目錄
rename(old,new) 重命名文件或文件夾
system(command) 調(diào)用系統(tǒng)提供的小工具怕午,比如計(jì)算器
walk(top) 遍歷top參數(shù)指定路徑下所有子目錄,返回一個(gè)三元組(路徑淹魄,[包含目錄]郁惜,[包含文件])
curdir 當(dāng)前目錄(.)
pardir 上一節(jié)目錄(..)
sep 路徑分隔符,Win下是'\'甲锡,Linux下是'/'
linesep 當(dāng)前平臺使用的行終止符兆蕉,win下是'\r\n',Linux下是'\n'
name 當(dāng)前使用的操作系統(tǒng)

os.path模塊(文件路徑相關(guān))

函數(shù) 作用
dirname(path) 獲得路徑名
basename(path) 獲得文件名
join(path1[,path2[,...]]) 將路徑名與文件名拼接成一個(gè)完整路徑
split(path) 分割路徑與文件名缤沦,返回元組(f_path, f_name)虎韵,如果完全使用目錄,
它也會將最后一個(gè)目錄作為文件名分離缸废,且不會判斷文件或目錄是否存在
splitext(path) 分隔文件名與擴(kuò)展名
getsize(file) 獲得文件大小包蓝,單位是字節(jié)
getatime(file) 獲得文件最近訪問時(shí)間,返回的是浮點(diǎn)型秒數(shù)
getctime(file) 獲得文件的創(chuàng)建時(shí)間企量,返回的是浮點(diǎn)型秒數(shù)
getmtime(file) 獲得文件的修改時(shí)間测萎,返回的是浮點(diǎn)型秒數(shù)
exists(path) 判斷路徑(文件或目錄)是否存在
isabs(path) 判斷是否為決定路徑
isdir(path) 判斷是否存在且是一個(gè)目錄
isfile(path) 判斷是否存在且是一個(gè)文件
islink(path) 判斷是否存在且是一個(gè)符號鏈接
ismount(path) 判斷是否存在且是一個(gè)掛載點(diǎn)
samefile(path1,path2) 判斷兩個(gè)路徑是否指向同一個(gè)文件 wenji

10.類與對象

1) 最簡單的例子

PS:Python中沒有像其他語言一樣有public或者private的關(guān)鍵字
來區(qū)分公有還是私有,默認(rèn)公有梁钾,如果你想定義私有屬性或者函數(shù)绳泉,
命名的時(shí)候在前面加上兩下劃線__即可逊抡,其實(shí)是偽私有姆泻,內(nèi)部
采用的是名字改編技術(shù)零酪,改成了_類名__私有屬性/方法名,比如
下面調(diào)用people._Person__skill拇勃,是可以訪問到私有成員的四苇!
類中的屬性是靜態(tài)變量。

輸出結(jié)果

2) __init__(self) 構(gòu)造方法

實(shí)例化對象的時(shí)候會自動調(diào)用方咆,當(dāng)你想傳參的時(shí)候可以用它~

輸出結(jié)果

3) 繼承

規(guī)則如下

  • 1.繼承寫法: class 子類(父類):
  • 2.子類可以繼承父類的所有屬性與方法月腋;
  • 3.子類定義與父類同名的屬性與方法會自動覆蓋;
  • 4.重寫時(shí)如果想調(diào)用父類的同名方法可以使用super()函數(shù). 方法名調(diào)用;

Python支持多繼承,多個(gè)父類用逗號隔開瓣赂,子類可同時(shí)繼承多個(gè)父類的
屬性與方法
多繼承的時(shí)候如果父類們中有相同的方法榆骚,調(diào)用的順序是
誰在前面先調(diào)用那個(gè)父類中的方法,比如有class Person(Name, Sex煌集,Age)妓肢,
三個(gè)父類里都有一個(gè)show的方法,那么子類調(diào)用的是Name里的show()!
如果不是得用多繼承不可的話苫纤,應(yīng)該盡量避免使用它碉钠,有時(shí)會出現(xiàn)
一些不可遇見的BUG。

還有一種叫組合的套路卷拘,就是在把需要用到的類丟到組合類中
實(shí)例化喊废,然后使用,比如把Book栗弟,Phone污筷,Wallet放到Bag里:

輸出結(jié)果:

4) 與對象相關(guān)的一些內(nèi)置函數(shù)

函數(shù) 作用
issubclass(class, classinfo) 如果第一個(gè)參數(shù)是第二個(gè)參數(shù)的子類,返回True乍赫,否則返回False
isinstance(object, classinfo) 如果第一個(gè)參數(shù)是第二個(gè)參數(shù)的實(shí)例對象颓屑,返回True,否則返回False
hasattr(object, name) 測試一個(gè)對象中是否有指定的屬性耿焊,屬性名要用引號括著揪惦!
getattr(object, name, [,default]) 返回對象的指定屬性值,不存在返回default值罗侯,沒設(shè)會報(bào)ArttributeError異常
setattr(object, name, value) 設(shè)置對象中指定屬性的值器腋,屬性不存在會新建并賦值
delattr(object, name) 刪除對象中的指定屬性的值,不存在會報(bào)報(bào)ArttributeError異常
property(fget,fset,fdel,doc) 返回一個(gè)可以設(shè)置屬性的屬性

11.模塊

1) 導(dǎo)入模塊

保存為.py后綴的文件都是一個(gè)獨(dú)立的模塊钩杰,比如有a.py和b.py文件纫塌,
你可以在a中import b,然后就可以使用b.py中的函數(shù)了讲弄。
模塊導(dǎo)入規(guī)則4.1 導(dǎo)包處就寫得詳細(xì)了措左,此處就不重復(fù)描述了?。

2) 指定模塊

導(dǎo)入其他模塊的時(shí)候避除,測試部分的代碼也會執(zhí)行怎披,可以通過
__name__告訴Python該模塊是作為程序運(yùn)行還是導(dǎo)入到其他程序中胸嘁。
作為程序運(yùn)行時(shí)該屬性的值是__main__,只有單獨(dú)運(yùn)行的時(shí)候才會執(zhí)行凉逛。
比如:

if __name__ == '__main__':
    test()

3) 搜索路徑

Python模塊的導(dǎo)入會有一個(gè)路徑搜索的過程性宏,如果這些搜索路徑都找不到的話,
會報(bào)ImportError状飞,可以通過打印sys.path可以看到這些搜索路徑毫胜,比如我的:

如果你的模塊都不在這些路徑里,就會報(bào)錯(cuò)诬辈,當(dāng)然也可以通過
sys.path.append("路徑") 把路徑添加到搜索路徑中酵使!

4) 下載安裝第三方庫

方法一Pycharm直接安裝

File -> Default Settings -> Project Interpreter -> 選擇當(dāng)前Python版本
可以看到當(dāng)前安裝的所有第三庫,點(diǎn)+號進(jìn)入庫搜索焙糟,在搜索頁找到想要的
庫后勾選點(diǎn)擊Install Package即可凝化,點(diǎn)-號可以卸載不需要的庫。

方法二命令行使用pip命令安裝

pip3 install 庫名                # 安裝
python3 -m pip install 庫名     # 作用同上酬荞,可以區(qū)分python2和python3而已
pip install --upgrade pip      # 更新pip
pip uninstall 庫名             # 卸載庫
pip list                      # 查看已安裝庫列表

結(jié)語

呼搓劫,歷時(shí)兩周,總算把Python的基礎(chǔ)知識過了一遍混巧,當(dāng)然肯定是會有遺漏的
后面想到再補(bǔ)上吧枪向,擼基本知識是挺乏味的,期待后續(xù)爬蟲學(xué)習(xí)~


來啊咧党,Py交易啊

想加群一起學(xué)習(xí)Py的可以加下秘蛔,智障機(jī)器人小Pig,驗(yàn)證信息里包含:
Python傍衡,python深员,pyPy蛙埂,加群钓简,交易抽诉,屁眼 中的一個(gè)關(guān)鍵詞即可通過落追;

image

驗(yàn)證通過后回復(fù) 加群 即可獲得加群鏈接(不要把機(jī)器人玩壞了F莞荨!屡江!)~~~
歡迎各種像我一樣的Py初學(xué)者芭概,Py大神加入,一起愉快地交流學(xué)♂習(xí)惩嘉,van♂轉(zhuǎn)py罢洲。

image

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市文黎,隨后出現(xiàn)的幾起案子惹苗,更是在濱河造成了極大的恐慌殿较,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸽粉,死亡現(xiàn)場離奇詭異,居然都是意外死亡抓艳,警方通過查閱死者的電腦和手機(jī)触机,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玷或,“玉大人儡首,你說我怎么就攤上這事∑眩” “怎么了蔬胯?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長位他。 經(jīng)常有香客問我氛濒,道長,這世上最難降的妖魔是什么鹅髓? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任舞竿,我火速辦了婚禮,結(jié)果婚禮上窿冯,老公的妹妹穿的比我還像新娘骗奖。我一直安慰自己,他們只是感情好醒串,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布执桌。 她就那樣靜靜地躺著,像睡著了一般芜赌。 火紅的嫁衣襯著肌膚如雪仰挣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天缠沈,我揣著相機(jī)與錄音椎木,去河邊找鬼。 笑死博烂,一個(gè)胖子當(dāng)著我的面吹牛香椎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播禽篱,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼畜伐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躺率?” 一聲冷哼從身側(cè)響起玛界,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤万矾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后慎框,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體良狈,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年笨枯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薪丁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馅精,死狀恐怖严嗜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洲敢,我是刑警寧澤漫玄,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站压彭,受9級特大地震影響睦优,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壮不,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一刨秆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忆畅,春花似錦衡未、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绊诲,卻和暖如春送粱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掂之。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工抗俄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人世舰。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓动雹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跟压。 傳聞我的和親對象是個(gè)殘疾皇子胰蝠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容