1循集、安裝pyenv
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
vim ~/.bash_profile +++
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
source ~/.bash_profile
2、安裝python
yum -y install gcc patch make
yum -y install gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel
apt-get -y install libgdbm-dev libssl-dev libsqlite0-dev libreadline-dev zlib1g-dev libbz2-dev libsqlite3-dev
pyenv install 3.5.2
3蔗草、使用pyenv
pyenv local 3.5.2 切換python版本咒彤,這個(gè)是針對(duì)當(dāng)前目錄以及子目錄設(shè)置python版本
pyenv local system 切換到系統(tǒng)python版本
pyenv global 3.5.2 切換全局python版本,一般不要使用咒精,影響yum等使用
pyenv globan system 切換全局python版本镶柱,或者 rm -f ~/.pyenv/version
4、vitrualenv 使用
基于某個(gè)版本來創(chuàng)建虛擬環(huán)境
pyenv virtualenv 3.5.2 test 創(chuàng)建一個(gè)名為test的虛擬環(huán)境
pyenv uninstall test 刪除一個(gè)test虛擬環(huán)境
5模叙、ipython安裝
pip install ipython 安裝ipython
6歇拆、修改pip源
vim ~/.pip/pip.conf +++
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com
7、安裝jupyter notebook
pip install jupyter
jupyter notebook --ip=0.0.0.0
或者用配置文件來啟動(dòng)
jupyter notebook --generate-config --allow-root
vim /root/.jupyter/jupyter_notebook_config.py
jupyter notebook --allow-root
8、常量故觅,變量
常量:一旦賦值厂庇,就不可在改變,換句話說输吏,就是不能對(duì)他重新賦值权旷。Python不存在常量。
字面常量:一個(gè)單獨(dú)出現(xiàn)的量贯溅,未賦值給任何的變量或常量
變量:是一個(gè)名字拄氯,在賦值符號(hào)的左邊
9、類型
Python數(shù)強(qiáng)類型語言它浅,不同類型的變量不能做運(yùn)算
Python是動(dòng)態(tài)類型語言译柏,變量可以重新賦值為其他類型
Python基本類型: int float byte bool none
Python組合類型: str list set
10、運(yùn)算符
算數(shù)運(yùn)算符: + - * / // ** % 只對(duì)int和float運(yùn)算
python 3 : 3/2 = 1.5
python 3 : 取整除 // 和 python 2 的除法表現(xiàn)一樣
python 2 : 3/2 = 1
比較運(yùn)算符: > < == != >= <= 返回值都是bool類型
邏輯運(yùn)算符: and or not
邏輯運(yùn)算符的操作數(shù)都是bool類型或者可以隱式轉(zhuǎn)換為bool類型
成員運(yùn)算符
身份運(yùn)算符
位運(yùn)算符: << >> & | ^
賦值運(yùn)算符: =
可以和算數(shù)運(yùn)算符和位運(yùn)算符一起使用 += -=姐霍,賦值運(yùn)算符返回none
運(yùn)算符的優(yōu)先級(jí)
** > */ > % > +- > 比較運(yùn)算(> < == != >= <= ) > 邏輯運(yùn)算符(and or not )
11鄙麦、表達(dá)式、語句
表達(dá)式:常量邮弹、變量、和運(yùn)算符一起構(gòu)成蚓聘,表達(dá)式有返回值
語句:關(guān)鍵字和表達(dá)式一起組成的語句腌乡,語句沒有返回值
12、列表以及其常用操作
列表是一個(gè)序列夜牡,用于順序的存儲(chǔ)數(shù)據(jù)
定義與初始化
lst = list()
lst = []
lst = [1, 2, 3]
lst = list(range(1, 10))
curd
訪問列表元素:lst[0]与纽、lst[-1]
.index(num) # 通過值查找第一個(gè)值得索引、
.index(num, start) # 指定從哪個(gè)索引開始查找
.index(num, start, end) # 指定到那個(gè)索引結(jié)束
當(dāng)值不存在的時(shí)候會(huì)拋出ValueError
.count(num) # 返回num值得個(gè)數(shù)
.index 和 .count 兩個(gè)方法的時(shí)間復(fù)雜度是O(n)
修改指定元素:lst[5] = 10
增加元素:無法使用所以操作塘装,使用固定方法
lst.append(value)急迂,lst.insert(index, value),分別是追加和插入(在index前邊)蹦肴,當(dāng)超出范圍僚碎,會(huì)在距離最近的一個(gè)元素前邊插入。
lst.extend(iter_obj) 將可迭代對(duì)象追加到末尾
lst + [1, 2, 3] = [0, 1, 2, 1, 2, 3] 將兩個(gè)list對(duì)象相加阴幌,有返回值勺阐,不會(huì)修改原來的list
刪除
lst.remove(value) 刪除列表中的第一個(gè)出現(xiàn)的value
lst.pop(index) 不指定index的話刪除最后一個(gè)值,如果指定index矛双,那么刪除索引位置元素
lst.clear() 刪除所有元素
其他操作
求長(zhǎng)度:len(lst)
反轉(zhuǎn)值:lst.reverse()
排序:lst.sort(reverse=True) 逆序排序渊抽,默認(rèn)是正序,是快速排序算法
復(fù)制:lst = list(range(1, 2)) lst2 = lst lst2[0] = x 復(fù)制操作傳遞的是引用议忽,所以修改lst2的時(shí)候lst也會(huì)被修改懒闷,叫淺拷貝
影子拷貝:lst2 = lst.copy() 這種方法如果列表中有l(wèi)ist,還是淺拷貝,叫影子拷貝愤估。只對(duì)第一層有效
深拷貝:import copy lst2 = copy.deepcopy(lst)
賦值操作帮辟,對(duì)可變對(duì)象是引用傳遞,對(duì)不可變對(duì)象是值傳遞
13灵疮、字符串操作以及定義
三引號(hào)可以定義多行字符串织阅,而且里邊單引號(hào)不用轉(zhuǎn)移
path = r'C:/windows/nt/system32' # 加r前綴代表次字符串是自然字符串,不會(huì)轉(zhuǎn)義
字符串是不可變對(duì)象震捣,可以用下標(biāo)操作荔棉,但是不能改變,是可迭代對(duì)象蒿赢,可以做 for x in str:
常用重點(diǎn)方法:
list(s) 將s字符串轉(zhuǎn)換成list類型
join lst = ['i', 'am', 'styd'] ''.join(lst) 將lst用''中的分隔符鏈接起來润樱。
split str.split() 默認(rèn)使用空格來分割,多個(gè)空格視為一個(gè)空格羡棵,如果指定' ' 來分割壹若,多個(gè)空格就會(huì)去處理,maxsplit=1皂冰,指定以后店展,最多分割1次。默認(rèn)為-1秃流,表示分割所有分隔符赂蕴。
rsplit 是split從右往左分割的版本,當(dāng)不指定maxsplit 的時(shí)候舶胀,他們兩個(gè)表現(xiàn)一樣概说,但是split是效率高一些
splitlines str.splitlines() 按行分割,并且默認(rèn)返回結(jié)果不帶操作符嚣伐,如果str.splitlines(True)糖赔,則返回結(jié)果帶換行符
partition str.partition() 總是返回一個(gè)三元組,他按照傳入的分隔符分割一次轩端,得到head放典、tail,返回結(jié)果是 head,sep,tail
rpartition str.rpartition() 是partition從右往左的版本
排版用函數(shù)
str.title() 將字符串中的每個(gè)單詞首字母大寫
str.capitalize() 只將字符串中的第一個(gè)字母大寫
str.center(80) 居中字符串基茵,用空格填充
str.zfill(80) 居右字符串刻撒,左邊用0填充
str.caseflod() 統(tǒng)一轉(zhuǎn)換成小寫,不同平臺(tái)表現(xiàn)不一樣耿导,通常用來忽略大小寫來比較声怔。
str.swapcase() 交換大小寫,大寫變小寫舱呻,小寫變大寫醋火。
str.expandtabs() 將\t 轉(zhuǎn)換為四個(gè)空格
str.format() #
修改用函數(shù)
str.replace() 替換字符串悠汽,返回一個(gè)新的字符串,例:str.replace('love', 'give up', 3) 將str中的love替換成give up芥驳,最多替換3次
str.strip() 刪除字符串兩邊的空格柿冲,\t \r \n 都會(huì)移除,如果指定字符串兆旬,則移除指定假抄,例:s.strip('#{}')
str.lstrip() 只移除左邊,str.rstrip()只移除右邊
str.ljust() 將字符串填充丽猬,左填充空格宿饱,也可以指定填充字符,例:str.ljust(10, '#')脚祟,填充字符串長(zhǎng)度只能為1
str.rjust() 如上
查找用函數(shù)
str.find('very', 3, 10) 用于找出一個(gè)子串最早的index 谬以,從左往右查找,返回子串首字母的索引由桌,找不到返回-1为黎,可以指定開始位置和結(jié)束為止
str.rfind('very', 3,10) 用于找出一個(gè)子串最早的index ,從右往左查找行您,返回子串首字母的索引铭乾,找不到返回-1,可以指定開始位置和結(jié)束為止
str.index 功能和find 一樣娃循,但是如果找不到子字符串炕檩,那么拋出valueError
str.rindex 功能和rfind 一樣,但是如果找不到子字符串淮野,那么拋出valueError
str.count('s', startposition) 查找字符串中指定字符出現(xiàn)的次數(shù)
判斷用函數(shù)
str.startswith('very', 2) 判斷字符串是否以某個(gè)前綴開始捧书,返回bool吹泡,可以指定start位置和stop位置骤星。
str.endswith('python', start, stop) 判斷字符串是否以某個(gè)后綴結(jié)尾,返回bool爆哑,可以指定start和stop位置
str.isalnum() 判斷是否僅僅含有數(shù)字或者字母的字符串
str.isdecimal() 判斷是否僅含數(shù)字
str.isidentifier() 判斷是否為合法標(biāo)識(shí)符洞难,1、字母或者下劃線開頭.揭朝。2队贱、僅包含字母數(shù)字和下劃線
字符串格式話是拼接字符串的一種手段
' '.join(['i', 'love', 'python'])
'i' + 'love' + 'python'
'i love %s' % ('python', ) 有幾個(gè)占位符,就寫幾個(gè)內(nèi)容的元組潭袱,不匹配的話拋出TypeError柱嫌,當(dāng)占位符是s/r的時(shí)候,隱式的調(diào)用了str() /repr()
'my name is {0}, i love {lang}, i am {age} years old'.format(lilei, lang='python', age=19)屯换,占位符和參數(shù)不匹配的話會(huì)拋出異常
{數(shù)字i} 會(huì)把位置參數(shù)當(dāng)成一個(gè)列表args编丘,args[i] 當(dāng)i不是args的索引的時(shí)候与学,拋出indexError
{關(guān)鍵字k} 會(huì)把關(guān)鍵字參數(shù)當(dāng)成一個(gè)字典kwargs,使用kwargs[k]當(dāng)k不是kwargs的key時(shí),會(huì)拋出KeyError
'{{}} {}'.format(18) 兩層大括號(hào)轉(zhuǎn)義了嘉抓,結(jié)果是{} 18
2.6 版本大括號(hào)里邊的數(shù)字或者參數(shù)不能省略
14索守、bytes與字符串
str 是文本序列,bytes是字節(jié)序列
文本是有編碼的(utf-8,gbk...)抑片,字節(jié)沒有這種說法
文本編碼指的是字符如何使用字節(jié)來表示
python3默認(rèn)使用utf-8卵佛,在linux上
s = '你好'
s.encode() # 將字符串編碼為bytes,bin(s.encode())敞斋,將bytes轉(zhuǎn)換為2進(jìn)制.
b.decode() # 將bytes解碼為str截汪,可以指定編碼格式
b.hex()轉(zhuǎn)化為16進(jìn)制
string的所有操作bytes都支持
b'abc'.find(b'b') 結(jié)果為1
'你好'.encode().find(b'\xa9') 是按照字節(jié)來找的
bytes 由 str通過encode方法轉(zhuǎn)化得到
bytes通過b前綴定義bytes
15、bytearray
是bytes的可變版本渺尘,bytes和str是不可變的
b = b'bas'
b[1] = b'c' 會(huì)報(bào)錯(cuò)
b = bytearray(b)
b[1] = int(b'B'.hex(), 16) 將bytes轉(zhuǎn)換為16進(jìn)制挫鸽,然后轉(zhuǎn)化為int,就可以變化了
操作的是單個(gè)字節(jié)鸥跟,python沒有byte這種類型丢郊,但是byte都可以用int表示,而且int必須是0-255范圍
b 等于 bytearray(b'aBc')
bytearray 用來做圖像處理医咨,用來修改大對(duì)象的bytes內(nèi)容枫匾,節(jié)省內(nèi)存
16、線性結(jié)構(gòu)
列表拟淮、元組干茉、字符串、bytes很泊、bytearray
特點(diǎn):
可迭代
len獲取長(zhǎng)度
可以使用下標(biāo)操作符通過索引訪問
可以切片
lst[start:stop:step] 從start 開始角虫,到stop結(jié)束,不包含stop委造,步進(jìn)值為step戳鹅,返回一個(gè)新的list
支持負(fù)數(shù)索引 lst[-5:-3],如果超出索引范圍昏兆,start=0枫虏,stop=-0,當(dāng)start>=stop時(shí)爬虱,返回空列表
如果step為負(fù)數(shù)隶债,則遍歷從右邊到左邊,lst[::-1] = lst.reverse()
相關(guān)函數(shù):
enumerate(): 將一個(gè)可迭代對(duì)象轉(zhuǎn)化為key value迭代器
len():求一個(gè)可迭代對(duì)象的長(zhǎng)度
iter():將一個(gè)可迭代對(duì)象轉(zhuǎn)化為一個(gè)迭代器
next():求一個(gè)迭代器的下一個(gè)值
17跑筝、解構(gòu)與封裝
1死讹、x, y = y, x 這樣就可以直接把x、y的值交換
2曲梗、lst = [1, 2]
first, second = lst 這樣就可以把線性結(jié)構(gòu)賦值給變量
3赞警、t = 1, 2 # t為一個(gè)元組 與 t = (1, 2) 等效
封裝:定義一個(gè)元組逛腿,可以省略小括號(hào),封裝出來的一定是一個(gè)元組
解構(gòu)的變化:
lst = list(range(1000))
head, *mid, tail = lst 這樣的話仅颇,head=1单默,tail=999,mid=剩下的忘瓦。加*號(hào)代表的是剩下的所有元素搁廓。
python的一個(gè)慣例,用單個(gè)下劃線_表示丟棄該變量耕皮,但是_也是一個(gè)合法的標(biāo)識(shí)符境蜕,通常不要用_來表示。
當(dāng)上一個(gè)語句有out時(shí)候凌停,值就會(huì)被主動(dòng)保存到_這個(gè)變量中粱年。(ipython)
多層次解構(gòu):
_, (_, val), *_ = lst # 這樣val就得到一個(gè)值,解構(gòu)可以支持多層次
用的最多的地方:
key, _, value = 'env = prod'.partition('=')
key=> env
value=> prod
18罚拟、集合與集合操作
數(shù)學(xué)意義上的集合:
定義:
s = set()台诗、s = set(range(3))、s = {1,2,3,4}
增加元素:
s.add(2) 原地修改赐俗。
s.update(range(1,30)) 增加一個(gè)可迭代對(duì)象拉队,原地修改。對(duì)于已經(jīng)存在的元素什么也不做阻逮。不存在的話粱快,追加進(jìn)
刪除元素:
s.remove(2) 原地修改。刪除不存在的時(shí)候叔扼,報(bào)錯(cuò)keyerror
s.pop(2) 刪除并且返回被刪除的元素事哭,元素不存在拋出keyerror,隨機(jī)的pop出元素瓜富。
s.clear() 清空set
s.discard(3) 刪除不存在的時(shí)候鳍咱,不報(bào)錯(cuò)浅役,什么也不做。
修改:
集合不能修改單個(gè)元素
查找:
集合不能通過索引來訪問骄崩,沒有訪問單個(gè)元素的方法媳荒,不是線性結(jié)構(gòu)。集合元素沒有順序族铆。
成員運(yùn)算符:判斷一個(gè)元素是否在容器中。
in、not in
集合的成員運(yùn)算符和其他線性結(jié)構(gòu)的時(shí)間復(fù)雜度不同
做成員運(yùn)算的時(shí)候集合的效率遠(yuǎn)高于列表
做成員運(yùn)算時(shí)干旧,列表的效率和列表的規(guī)模有關(guān)O(n)
做成員運(yùn)算時(shí),集合的效率和集合的規(guī)模無關(guān)O(1)
%%timeit ipython的功能
集合的運(yùn)算
s1 = {1, 2, 3}
s2 = {2, 3}
s1.intersection(s2) 交集運(yùn)算
s1.intersection_update(s2) 交集運(yùn)算妹蔽,運(yùn)算完后將結(jié)果賦予s1
s1 & s2 交集運(yùn)算椎眯,set將按位與運(yùn)算符為求交集運(yùn)算
s1.difference(s2) 求差集
s1.difference_update(s2) 差集運(yùn)算挠将,運(yùn)算完后將結(jié)果賦予s1
s1 - s2 差集運(yùn)算,set重載了 -
s1.symmetric_difference(s2) 對(duì)稱差集编整,不同時(shí)在兩個(gè)集合舔稀。
s1.symmetric_difference_update(s2) 對(duì)稱差集,不同時(shí)在兩個(gè)集合掌测。將返回的結(jié)果賦值于s1
s1 ^ s2 對(duì)稱差集内贮,重載了異或
s1.union(s2) 并集計(jì)算。
s1.update(s2) 并集的update版本汞斧,將球出來的結(jié)果賦值給s1
s1 | s2 并集計(jì)算夜郁,重載了按位或。
集合相關(guān)的判斷
s1 = {1, 2, 3, 4}
s2 = {2, 3}
s2.issubset(s1) 返回bool粘勒,判斷s2是否是s1的子集竞端。
s1.issuperset(s2) 返回bool,判斷s1是否是s2的超集庙睡。
s1.isdisjoint(s2) 是不是不相交的事富,返回bool。如果兩個(gè)集合沒有交集乘陪,返回false
集合的應(yīng)用
有一個(gè)api赵颅,它要求有認(rèn)證,并且有一定權(quán)限才可以訪問暂刘,例如要求滿足權(quán)限A,B,C中任意饺谬,有一個(gè)用戶具有權(quán)限B,C,D ,那么此用戶是否有權(quán)限訪問此api谣拣。
有一個(gè)任務(wù)列表募寨,存儲(chǔ)全部的任務(wù),有一個(gè)列表森缠,存儲(chǔ)已經(jīng)完成的任務(wù)拔鹰,找出未完成的任務(wù)。
集合的限制
集合的元素不能重復(fù)
集合的元素不能是list贵涵、bytearray列肢、set本身
集合的元素可以是tuple、bytes
集合的元素必須可hash宾茂,用hash(obj) 來看是否可hash
19瓷马、字典
字典是一種key-value結(jié)構(gòu),是沒有順序的跨晴,不是線性結(jié)構(gòu)欧聘。
d = {}
d = dict()
d = {'a': 1, 'b': 2}
d = dict([('a', 1), ('b', 2)]) 可迭代對(duì)象的元素必須是一個(gè)二元組,二元組的第0個(gè)元素為字典的key端盆,第一個(gè)元素為字典的value怀骤,也可以是一個(gè)字典费封。
d = dict.fromkeys(range(5), 'abc') 傳入的可迭代對(duì)象的元素為key,值為abc蒋伦,生成:{0: 'abs', 1: 'abs', 2: 'abs', 3: 'abs', 4: 'abs'}
字典的基本操作
增加與修改:
d['a'] = 1 直接使用key作為下標(biāo)進(jìn)行賦值弓摘。如果下表不存在,會(huì)增加kv對(duì)痕届。
d.update([('a', 2), ('b', 0)]) 增加一個(gè)可迭代對(duì)象衣盾,必須為二元組,也可以傳入一個(gè)dict爷抓,如果已經(jīng)存在key势决,則更新key的值。通常用來合并字典蓝撇。
刪除:
d.pop(key) 將key=key的元素刪除果复。并返回其value,如果key不存在渤昌,那么拋出keyerror虽抄。
d.pop(key, 'default') 如果指定默認(rèn)值,那么key不存在独柑,不會(huì)拋出異常迈窟,會(huì)返回default。
d.popitem() 返回一個(gè)元組忌栅,隨機(jī)的刪除一個(gè)key-value對(duì)车酣。
d.clear() 清空一字典。
讀人餍鳌:
d['c'] 取下標(biāo)為c的值湖员,如果下標(biāo)不存在,拋出異常
d.get('c','default') 返回下標(biāo)的值瑞驱,如果下表不存在娘摔,那么返回默認(rèn)
d.setdefault('c', 'default') 先調(diào)用get(k, 'default'),如果存在c唤反,那么不會(huì)對(duì)c的value產(chǎn)生影響凳寺,如果不存在c,那么c的value設(shè)置為default彤侍。
遍歷:
字典的元素是成對(duì)出現(xiàn)的肠缨。
d.values() 返回字典的值,是一個(gè)可迭代對(duì)象拥刻。
d.items() 返回字典的k-v 對(duì)怜瞒。
d.keys() 返回字典的所有的keys父泳。
python2和python3在上邊的返回不同之處為般哼,2返回的是列表吴汪。3返回的是生成器,3中不會(huì)復(fù)制出一份內(nèi)存蒸眠。數(shù)據(jù)規(guī)模大漾橙,2就會(huì)占用很大內(nèi)存。
python2中對(duì)應(yīng)使用:
d.iterkeys()楞卡、d.iteritems()霜运、d.itervalues() 返回對(duì)于的迭代器。
for x, y in {'a': 'c', 'b': 1 }.items(): 來遍歷蒋腮。
字典的限制:
key 必須是可 hash
value 沒有限制淘捡。
字典的變體:
默認(rèn)字典:
from collections import defaultdict
初始化的時(shí)候需要傳入一個(gè)函數(shù),這個(gè)函數(shù)也叫工廠函數(shù)池摧,當(dāng)我們使用一個(gè)key的時(shí)候焦除,如果這個(gè)key不存在,defaultdict會(huì)自動(dòng)調(diào)用初始化時(shí)傳入的函數(shù)作彤,生成一個(gè)對(duì)象作為這個(gè)key的value
這個(gè)工廠函數(shù)可以自定義膘魄,然后返回一個(gè)值。
有序字典:
from collections import OrderedDict
有序字典竭讳,會(huì)保持插入時(shí)的順序创葡。既要求是一個(gè)key-value,又要求是一個(gè)有序的绢慢,可以用到灿渴。
19、列表解析式胰舆,得到的結(jié)果是列表逻杖。
[ x * x for i in [1, 2, 3, 4, 5]] 使用簡(jiǎn)潔的語法實(shí)現(xiàn)一些功能,效率稍微高一些思瘟。
[ x for x in range(10) if x % 2 ==0] 列表解析式可以添加if子句荸百。
[ x for x in range(10) if x %2 == 0 if x < 5] 可以寫多個(gè)if子句。
[ x for x in range(10) if x %2 ==0 and x < 5] 可以加多個(gè)邏輯運(yùn)算
[(x, y, z) for x in range(5) if x > 2 for y in range(5) if y > 1 for z in range(5) if z > 3] 可以存在多個(gè)for 和 多個(gè)if
使用列表解析讓代碼更簡(jiǎn)潔滨攻。一眼看不出解析式結(jié)果是什么時(shí)候够话,那就不要用了
x ** 2 if x % 2 ==0 else x ** 3
和解析式比較像,叫if表達(dá)式代表當(dāng)條件滿足時(shí)返回x ** 2光绕,當(dāng)條件不滿足時(shí)返回 x ** 3 女嘲,只能是雙分支可以,2.7以上可以诞帐。
[ x ** 2 if x % 2 == 0 else x ** 3 for x in range(10)]
20欣尼、生成器
g = (x ** 2 for x in range(100000)) 如果最外邊的是[],那么返回列表,占用內(nèi)存愕鼓,如果用小括號(hào)钙态,那么返回一個(gè)生成器。不占用內(nèi)存菇晃。
next(g) 求這個(gè)值得時(shí)候才會(huì)計(jì)算册倒。
生成器不支持下標(biāo)操作,需要下標(biāo)訪問的時(shí)候用列表解析磺送。只需要對(duì)結(jié)果迭代的時(shí)候驻子,優(yōu)先使用生成器。
21估灿、集合解析
{x for x in range(10)} 外邊是大括號(hào)崇呵,其他和列表解析是完全一樣的
22、字典解析
{str(x): x for x in range(10)} 左邊的表達(dá)式是用:隔開的馅袁,所以是字典解析式演熟。
23、可迭代對(duì)象與迭代器
可迭代對(duì)象都有__iter__方法司顿。這個(gè)對(duì)象可以在for x in obj中出現(xiàn)芒粹。
迭代器是可迭代對(duì)象,迭代器都有next方法大溜。list數(shù)據(jù)類型是一個(gè)可迭代對(duì)象化漆,但是不是一個(gè)迭代器。
可迭代對(duì)象可以轉(zhuǎn)換為迭代器钦奋。迭代器可以使用next方法座云。從迭代器中取出下一個(gè)元素。
迭代器會(huì)保存一個(gè)指針付材,指向迭代對(duì)象的當(dāng)前元素
可迭代對(duì)象可以使用iter方法來轉(zhuǎn)換為迭代器朦拖。
for in 循環(huán)對(duì)于可迭代對(duì)象:首先調(diào)用iter方法轉(zhuǎn)化為迭代器,然后不斷地調(diào)用next方法厌衔,直到拋出異常璧帝。
24、函數(shù)
函數(shù)定義指定多種參數(shù)
參數(shù)默認(rèn)值
def inc(base, x=2):
調(diào)用時(shí)傳遞的話富寿,就使用傳遞的睬隶,如果不傳遞,那么就使用默認(rèn)
調(diào)用時(shí)默認(rèn)值寫道最后页徐。
可變參數(shù)
def sum(*args): 參數(shù)前加* 表示這個(gè)參數(shù)是可變的苏潜,傳參只能以位置參數(shù)的形式,args 構(gòu)成一個(gè)元組变勇。
def connect(*kwargs): 參數(shù)前加2個(gè)*表示這個(gè)參數(shù)是可變的恤左,傳參只能以關(guān)鍵字參數(shù)的形式,kwargs構(gòu)成一個(gè)字典。
通常來說:
默認(rèn)參數(shù)靠后飞袋,可變參數(shù)靠后戳气,默認(rèn)參數(shù)和可變參數(shù)不同時(shí)出現(xiàn)。
25授嘀、參數(shù)解構(gòu)
函數(shù)調(diào)用時(shí)物咳,使用一個(gè)* 來表示將一個(gè)可迭代對(duì)象解構(gòu)成位置參數(shù)
def add(x,y):
return x + y
t = [1, 2]
add(*t)==> 3
函數(shù)調(diào)用時(shí)锣险,使用兩個(gè)* 來表示將一個(gè)字典解構(gòu)成關(guān)鍵字參數(shù)
d={x:1, y:2}
add(**d) ==>3
26蹄皱、keyword-only 參數(shù)
def fn(*, x): * 之后的參數(shù)只能通過關(guān)鍵字參數(shù)來賦值⌒痉簦可以有默認(rèn)值巷折。
print(x)
27、函數(shù)
函數(shù) return None 或者 直接return 是一樣的崖咨,用來結(jié)束函數(shù)
python規(guī)則指定所有在賦值語句左面的變量都是局部變量
作用域:
是一個(gè)變量的可見范圍叫做這個(gè)變量的作用域锻拘。函數(shù)內(nèi)部是一個(gè)局部作用域,不能直接用全局作用域的變量击蹲。
變量的作用域?yàn)樽兞慷x同級(jí)的作用域署拟。
上級(jí)作用域?qū)ο录?jí)作用域只讀可見。下級(jí)只能看見上級(jí)歌豺,不能修改推穷。
全局變量:
xx = 1
def fn():
global xx # global 可以提升變量作用域?yàn)槿肿兞浚嵘皇且粋€(gè)標(biāo)記类咧,并沒有定義馒铃。注意提升支隊(duì)本作用域有用。如果要在其他非全局作用于使用痕惋,也要使用global提升区宇。
xx += 1
print(xx) ==> 2
閉包
函數(shù)已經(jīng)結(jié)束,但是函數(shù)內(nèi)部部分變量的引用還存在值戳,python的閉包可以用可變?nèi)萜鲗?shí)現(xiàn)议谷。py2唯一的方式。
nonlocal關(guān)鍵字
def counter():
x = 0
def inc():
nonlocal x # nonlocal 關(guān)鍵字用于標(biāo)記一個(gè)變量由他的上級(jí)作用域定義堕虹。通過nonlocal標(biāo)記的變量柿隙,可讀可寫。
x += 1
return x
return inc
函數(shù)默認(rèn)參數(shù)的作用域:
def fn(xxyy=[]):
xxyy.append(1)
print(xxyy)
這個(gè)參數(shù)多次調(diào)用鲫凶,xxyy的值會(huì)一直加禀崖,造成這種情況的是,xxyy其實(shí)是fn函數(shù)的一個(gè)對(duì)象的變量fn.__defaults__螟炫,因?yàn)楹瘮?shù)也是一個(gè)對(duì)象波附。而且函數(shù)定義在全局作用域。
def fn(a=0, b=0):
a = 1
b = 1
這個(gè)參數(shù)多次調(diào)用,a掸屡、b的值也都是0封寞,因?yàn)橘x值既定義,上邊那個(gè)例子沒有對(duì)xxyy重新賦值仅财,只是做了append狈究。而此例子中,做了重新賦值盏求。
解決方法:
1抖锥、使用不可變類型作為默認(rèn)值,通常如果使用一個(gè)可變類型作為默認(rèn)參數(shù)的時(shí)候碎罚,會(huì)使用None來代替磅废。
def fn(lst=None):
if lst is None: # 如果是默認(rèn)的話,就將其賦值為一個(gè)列表荆烈,也就實(shí)現(xiàn)了默認(rèn)參數(shù)為可變類型的功能拯勉。
lst = []
lst.append(3)
print(lst)
2、函數(shù)體內(nèi)不改變默認(rèn)值