python===### 地址1. mac 下python 2.7的地址 /Library/Python/2.7/3.6/Library/Frameworks/Python.framework/Versions/3.6/- 避免循環(huán)導(dǎo)入依賴的方法 依賴放在最后面------# 正則表達式+表示至少一個字符{n}表示n個字符 *表示任意個字符?表示0個或一個字符.可以匹配任何字符\w匹配字母\d匹配數(shù)字\s匹配一個空格r代表正則表達式^表示行的開頭求妹,$表示行的結(jié)束\d$必須以數(shù)字結(jié)束\w$必須以字母結(jié)束多加一個\代表轉(zhuǎn)義字符'ABC\\-001'匹配:abc\001\d{3} 可以匹配:010, 230,123\s+ 表示至少一個空格\s{4}表示至少4個空格\d{3,8} 表示3到8個數(shù)字\d{3}\s+\d{3,8}\d{3} 三個數(shù)字雁歌,\s匹配一個空格 \d{3-8}3-8個數(shù)字## 進階 [0-9a-zA-Z\_] 匹配一個數(shù)字虑瀑,一個字母赂蕴,或者下劃線[0-9a-zA-Z\_]+ 匹配至少由一個數(shù)字字母或者下劃線組成的字符串[a-zA-Z\_][0-9a-zA-Z\_]匹配由字母或者下劃線開頭禀晓,后接任意個由一個數(shù)字构灸,字母澜躺,下劃線組成的字符串### 方法- match 表示是否匹配瞒斩,如果匹配 返回match對象增拥,否則返回None- split() 方法用于切割 'ab c'.split(' ')- ###### finditer : 返回string中所有與pattern相匹配的全部字串啄巧,返回形式為迭代器。 ### 提取子字符串sd=re.match(r'^(\d{3})-(\d{6})','021-2345678')### 輸出第幾組函數(shù)print(sd.group(1))輸出第一組函數(shù)### 替換字符串re.subpath = re.sub('[_]', '/', url1)將_全部替換為/### |是或的意思掌栅,匹配到兩個的任何一個都行sd=re.compile('| {7}')## 預(yù)編譯正則表達式每次使用都要編譯所以先預(yù)編譯一下### 兩個字符串 或匹配sd=re.compile('/places/default/(index|view)/.*?[\d]$')#### 正則Demo```find_id = re.compile('\w{0,5}-\w{0,5}-\w{0,7}-\d{0,3}')str='fan-jia-liang-57'```## numpy函數(shù): 1.shape函數(shù):計算數(shù)組大小 2.mat函數(shù) 將目標數(shù)據(jù)轉(zhuǎn)換為矩陣 3.zero 函數(shù) 將數(shù)組初始化為0 4.numpy.array將list轉(zhuǎn)換為numpy的數(shù)組 5.random ranint 取隨機數(shù) 6.去掉字符串最后的換行符:line=line[:-1] 7.numpy比較兩個array是否全部相同秩仆, if(arry1==array2).all() print(true)### python讀取文件的三種方法:- f = open("foo.txt") # 返回一個文件對象 line = f. adline() # 調(diào)用文件的 readline()方法 while line: print line, # 后面跟 ',' 將忽略換行符 #####print(line, end = '') # 在 Python 3中使用 line = f.readline() f.close()- for line in open("foo.txt"): print line,- f = open("c:\\1.txt","r") lines = f.readlines()#讀取全部內(nèi)容 for line in lines print line python 往txt寫內(nèi)容: with open('a.txt','w') as f: for i in a: f.write(i) ### python 字符亂碼問題 ### 字符串編碼encoding 將str轉(zhuǎn)換為機器碼decoding 將機器碼轉(zhuǎn)換為str#### plt 亂碼- 在/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages下- 在py中加 plt.rcParams['font.sans-serif']=['SimHei']將simhei字體下載放在pyplot中即可解決亂碼#### requests亂碼# list- list.index()求元素的下標- str list和 int list 互相轉(zhuǎn)換 nums=[int (i) for i in nums]- s = re.findall("\d+",nums)找出字符串中所有數(shù)字- list1 = ["這", "是", "一個", "測試"] for index, content in enumerate(list1): print (index) print (content)- 元組轉(zhuǎn)List tuple =list(tuple)- list 去除重復(fù)元素 list=set(list)- 查找元素 a.index(s) 查找s元素的下標位置- 逆序輸出list reversed(a)- list的復(fù)制 ``` import copy a=[123,234,677] b=a[:] print(b) c=copy.deepcopy(a) print(c) ```### tuple1. 對于不可變類型,不管是深拷貝還是淺拷貝猾封,都只是創(chuàng)建一個引用2. 元組為不可變類型3. 對于str類型澄耍,如果兩個str相同,那么是is和=的晌缘,這是python的優(yōu)化方法,善意的謊言逾苫。。枚钓。4. 在小的整數(shù)上也會采取這種措施 停留interning5. ### dict#### 散列方法獲得dict[key]的值铅搓,首先調(diào)用hash(key)來計算key的散列值,把這個值的低幾位數(shù)字作為偏移量搀捷,在散列表中查找表元星掰,如果表元是空的多望,就拋出異常。 如果不為空氢烘,則檢查key是否等于found_key如果相等則返回結(jié)果怀偷。如果不相等,發(fā)生散列沖突播玖,發(fā)生的原因:在尋找元素值時椎工,如果發(fā)生了沖突,算法會在散列值中另外取幾位蜀踏。然后將新得到的數(shù)字當做索引來尋找表元维蒙。 如果找到的為空,拋出keyerror果覆,如果沖突颅痊,重復(fù)剛才步驟#### 帶來的后果##### dict 的key值必須是可散列的, 也就是說是固定不變的,str,bytes 還有數(shù)字類型##### 消耗的空間比較大##### 鍵值的查詢很快鍵值的次序取決于添加順序?qū)τ诓淮嬖诘膁ict 會拋出keyerror,解決方法:重寫missing方法- 字典sd局待, 設(shè)置元素sd[i]=i,得到元素 sd.getvalue(i)- 儲存 like_dict['a']=we- 得到dict類型的key和value print(dict.keys()) print(dict.values())- 遍歷字典 for (k,v) in dict.items() 1. #### list 和tuple 的相同點和不同點 - list和tuple 可以相互轉(zhuǎn)換斑响,list可變,tuple不可變 - tuple比list更快更安全 - tuple是可以hash的,list不行 2. dict的內(nèi)部實現(xiàn)钳榨,算法的實現(xiàn) tuple 和list作為dict 的key值有什么問題: 3. python的多進程舰罚,協(xié)程實現(xiàn)和多線程 GIL全局鎖 #### 查看dict 是否有某個key值 dict.get(key)- 字典的復(fù)制 dict.copy()- python字符串反轉(zhuǎn) str[::-1]- extends 函數(shù)a=[1,2,3,4]b=[1,2,3,4,5]a.extend(b for i in b not in a)a=[1,2,3,4,1,2,3,4,5]### 字典20.判斷一個屬性是否在字典中 print d.has_key('site') if 'sa' in dic.keys(): 應(yīng)該用后面的,python3不能用前面的了?21: if value[i].get(each[i]) == None: value[i][each[i]] = 1 else: value[i][each[i]] += 122.import sys sys.version import django django.VERSION 查看各種安裝包的版本23.啟動ipython python3 -m IPython notebook-----------# python 的魔法函數(shù)## list__set__item(): __get__item():__ len __ 求元素的長度__delete_item()通過類似于list的用法,實現(xiàn)修改和插入薛耻。 通過對方法的重寫营罢,方便## function__repr ___ 將對象用字符串表示出來,如果沒實現(xiàn)昭卓,輸出類似于__str __是在調(diào)用 str()函數(shù)時,或者print 時才會使用
__doc__在方法中''' ''' 寫的注釋? 可以得到
__call__ 調(diào)用函數(shù)的對象時默認執(zhí)行的方法瘟滨,可以重寫
### 下劃線
單下劃線候醒,私有變量? 不能通過導(dǎo)入來調(diào)用
雙下劃線,受保護變量 子類也不能調(diào)用
前后下劃線: 系統(tǒng)定義的名字
## 函數(shù)式編程
map(func,rang(2)) 將func函數(shù)的返回值寫入list,然后將list返回
print reduce(lambda x, y: x * y, range(1, 5)) 將1,2傳入然后計算出結(jié)果杂瘸,x=2,y=3,然后將結(jié)果給x,再找一個數(shù)給
---------------
### pickle
1.pickle存中文字符
? ? pickle.dump(json.dumps(data,ensure_ascii=False),output)
2. pickle 寫文件時必須指定文件名
# I/O操作
####? 按行讀取
```import csv
with open('A.csv','rb') as csvfile:
reader = csv.reader(csvfile)
rows = [row for row in reader] print rows
```
#### 一次讀取為str
with open('html.txt','r') as opener:
html=opener.read()
#### 按行讀取倒淫,忽略首行元素
headers=next(reader)
## 追加寫入csv文件
with open("filename.csv","a+") as csvfile:
rU 或 Ua 以讀方式打開, 同時提供通用換行符支持 (PEP 278)
a+表示追加寫入
w? ? 以寫方式打開,
a? ? 以追加模式打開 (從 EOF 開始, 必要時創(chuàng)建新文件)
r+? ? 以讀寫模式打開
w+? ? 以讀寫模式打s開 (參見 w )
a+? ? 以讀寫模式打開 (參見 a )
rb? ? 以二進制讀模式打開
wb? ? 以二進制寫模式打開 (參見 w )
ab? ? 以二進制追加模式打開 (參見 a )
rb+? ? 以二進制讀寫模式打開 (參見 r+ )
wb+? ? 以二進制讀寫模式打開 (參見 w+ )
ab+? ? 以二進制讀寫模式打開 (參見 a+ )
## csv
將list寫入csv文件
writer=csv.writer(open('ip_message.csv','w'))
### 按行寫入
writer.writerow(fields)
for i in result:
? ? writer.writerow((i,result[i]))
#### 將dict 寫入csv文件
```
with open('dict.csv', 'wb') as csv_file:
? ? writer = csv.writer(csv_file)
? ? for key, value in mydict.items():
? ? ? writer.writerow([key, value])
```
#### 將tuple 寫入csv
```
def write_in_csv(tuple):
? ? with open('message.csv', 'a')as opener:
? ? ? ? writers=csv.writer(opener)
? ? ? ? writers.writerow(tuple)
```
## 文件目錄和文件讀寫
```
print(__file__)
print(os.path.abspath(__file__))
上面文件目錄
path=os.path.abspath(os.path.dirname(__file__))
image_path=os.path.join(path,'dataset')
# 將目錄下文件名轉(zhuǎn)換為List
file=os.listdir(image_path)
```
# yeild
## 回調(diào)函數(shù)
將一個函數(shù)以參數(shù)形式傳到另一個函數(shù)中
--------
# 輸出
## 輸出格式
print ('a%sb%s'%(a,b))
### format
print('好的代理:{}'.format(each))
#### 多個format
print("sd{1}{0}".format(b,a))
----------https://www.baidu.com/s?wd=14.118.254.90
將變量放在字符串中輸出
```
cc=China
url='{}/{cc}/{cc}.gif'.format(BASE_URL,cc=cc.lower())
http://flupy.org/data/flags/china/china.gif
```
## 不換行輸出
pyhton2:
## 編碼
中文無法顯示的話
i.decode(encoding='utf-8')
--------
# Exception
## raise
類似于java 中的throw? 可以根據(jù)情況自己拋出異常
if response.code==200:
? ? raise RuntimeError("wwe")
except RuntimeError as e:
? ? print(e.args)
ValueError 數(shù)據(jù)轉(zhuǎn)換異常
IndexError 數(shù)組下標異常
在異常中加的參數(shù)作為args參數(shù)
### 自定義異常類
class OutboundsError(Exception):
? ? def __init__(self,errormsg):
? ? ? ? self.errormsg=errormsg
? ? def __str__(self):
? ? ? ? print("調(diào)用了這里")
? ? ? ? return self.errormsg
當打印對象時會調(diào)用 __ str__ 方法
### except
多個異常:
(KeyError,FilenotFoundError) as e:
## 配置logging
首先new一個handler
RotatingFileHandler
然后添加到app.logger
------
# 日期和日歷
## datetime
```
a = datetime(2012, 9, 23)
```
from datetime import datetime
獲得過幾天的日期
yesterday = today - datetime.timedelta(days=1) #用今天日期減掉時間差败玉,參數(shù)為1天敌土,獲得昨天的日期
tomorrow = today + datetime.timedelta(days=1) #用今天日期加上時間差,參數(shù)為1天运翼,獲得明天的日期
print(afterday.year)
print(afterday.month)
print(afterday.day)
------
# 神奇的函數(shù)
### lambda 表達式的學習
a=[1,2,3,4]
g=lambda x:x**2
for each in a:
? ? print(g(each))
pydoc3 -p:5000 在5000端口查看消息
##### 根據(jù) 字母表獲得 所有字母
a=[chr(i) for i in rang(97,123)]
ord(a)=97
#### sys.argv[1]
#### 在console導(dǎo)入路徑或者py文件
import sys
sys.path.append("/path/to/your/test.py")
### 迭代器
```
a=iter(a)
print(next(a))
```
next函數(shù)返干,返回迭代器的下一個對象
## 并發(fā)
并發(fā)是指一次處理多件事。
并行是指一次做多件事血淌。
二者不同矩欠,但是有聯(lián)系财剖。
一個關(guān)于結(jié)構(gòu),一個關(guān)于執(zhí)行癌淮。
并發(fā)用于制定方案躺坟,用來解決可能(但未必)并行的問題。
### yield
### 協(xié)程
```
def simple_coroutine():
? ? print('corroutine is start')
? ? x=yield
? ? print('corrountine reeived',x)
mycoro=simple_coroutine()
print mycoro
next(mycoro)
#向yield發(fā)送一個值乳蓄,輸出x為23
mycoro.send(23)
```
###### 先要調(diào)用next函數(shù),作為預(yù)激協(xié)程的指令咪橙,讓協(xié)程跳轉(zhuǎn)到第一個yield表達式? 產(chǎn)出變量的初始值None
next函數(shù)可以包裝為裝飾器
```
def start(func):
? ? def star(*args,**kwargs):
? ? ? ? sd=func(*args,**kwargs)
? ? ? ? next(sd)
? ? ? ? return sd
? ? return star
```
個人體會:通過send語句將值傳遞給yield對象
執(zhí)行下一個yield讓協(xié)程進入下一個狀態(tài)
當執(zhí)行完后,協(xié)程為yield狀態(tài)
python3 查看生成器狀態(tài):
##### from inspect import getgeneratorstate
協(xié)程來處理異常類:
如果傳入的異常無法處理虚倒,協(xié)程就會終止
協(xié)程的四個狀態(tài):
gen_created: 等待開始執(zhí)行? (只有在多線程應(yīng)用中才能看到)
gen_running:解釋器正在執(zhí)行
gen_suspended:在yield表達式處暫停
gen_closed 執(zhí)行結(jié)束
類似于return 的關(guān)鍵字美侦,返回的類型為生成器
不過不會直接退出函數(shù)
而是等到 循環(huán)結(jié)束,返回一個list
#### yield from
可以簡化yield語法
###? GIL
global interpreter lock 全局解釋鎖
一次只能有一個線程在運行
gIL對io密集型任務(wù) 的影響很小
Python 標準庫中的所有阻塞型 I/O 函數(shù)都會釋放 GIL裹刮,允許其他線程運
行音榜。time.sleep() 函數(shù)也會釋放 GIL。因此捧弃,盡管有 GIL赠叼,Python 線程還是能在 I/O
密集型應(yīng)用中發(fā)揮作用
當某個線程在等待I/O時,python調(diào)度程序會切換到另一個線程
ProcessPool 使用了多進程來繞開多線程
### cpu密集
ProcessPoolExecutor? 多進程的 多少個核就有多少個進程
multiprocessing? 繞開GIL
python-parallelize庫
定義一個python-parallelize 裝飾器违霞,可以應(yīng)用到任何函數(shù)上
生成器: 類似于鏈表推導(dǎo)嘴办,
只不過只會放入內(nèi)存一次
也就是說只能輸出一次,用完就沒了
#### *args,**kwargs
*args是tuple
**kwrgs是dict
def play(*args,**kwargs):
? ? print(args)
? ? print(kwargs)
(2, 3)
{'age': 3, 'name': 2}
play(2,3,name=2,age=3)
#### filter 函數(shù)
過濾函數(shù)?
- a=range(10)
print(filter(lambda x:x>3,a))
#### random
values=[1,2,3,4]
- random.choice
random.choice(values)
從List中隨機選擇元素
- 提取出n個不同的樣本
random.sample(values,2)
- random 打亂順序
random.shuffle(values)
- 生產(chǎn)隨機整數(shù)
random.randint(0,10)
- 生成0-1 范圍內(nèi)均勻分布的浮點數(shù)
random.random()
- 生成n位隨機二進制整數(shù)
random.getrandbits(200)
### 運算符
& 按位運算符 取交集
| 按位運算符? 取并集
^ 當二進制位不相等時,取1
~ 按位取反
<< 左移運算符? 高位丟棄买鸽,低位補0
>> 右移涧郊,低位丟棄,高位補0
### 生成器
節(jié)省內(nèi)存
```
pos = (n for n in mylist if n > 0)
for each in pos:
print each
```
- 列表推導(dǎo)
? b=[for each in b if b>0]? //占用內(nèi)存比較多
- 求list中最大的元素
? print(max(mylist))
- chr(97)-> a? 輸入數(shù)字眼五,輸出字母
- join 函數(shù)妆艘, b.join(a)? b加入a中 每個b加入到a的每個元素中
? a="sbv"? b="-"? c=b.join(a)
? print(c)
- xrange返回的為xrange類型,本質(zhì)為生成器看幼,性能不會放入內(nèi)存
### input
input 會自動判斷類型
raw_input不會
input 輸入不能有空格
raw_ input可以
還是raw_input合適點
### id
查看變量地址空間
##### isinstance和type的區(qū)別
isinstance 是廣義上的判斷批旺,可以根據(jù)父類來判斷
----
# 面向?qū)ο?/p>
## 繼承
## 構(gòu)造方法的初始化
```
class A:
? ? def spam(self):
? ? ? ? print('A.spam')
class B(A):
? ? def spam(self):
? ? ? ? print('B.spam')
? ? ? ? super().spam()? # Call parent spam()
```
----
## 抽象類
## 裝飾器
裝飾器是可調(diào)用對象,其參數(shù)是另一個函數(shù)
不改變函數(shù)的前提下诵姜,增強函數(shù)的功能
在導(dǎo)入時執(zhí)行調(diào)用
1. @property
將方法變?yōu)閷傩?/p>
本質(zhì)是為了增加原的功能汽煮。
將原函數(shù)作為參數(shù)傳到另一個函數(shù)中
相當于方法套了一層方法。
def identify(f):
? ? print(f())
? ? return ()
def foo():
? ? return 'bar'
identify(foo)
上面等價于:
def identify(f):
print(f())
@identify
def foo():
return "sd"
閉包;
## 一些坑
- a//2 還是int 類型? a/=2 就是float類型
-----
## pip
- pip list --outdate
列出所有可以升級的軟件
-? pip install? --upgrade requests
升級一個包
- 升級所有可用的包
for i in `pip list -o --format legacy|awk '{print $1}'` ; do pip install --upgrade $i; done
# OS
__ file __ 屬性為當前py文件的路徑
execv(file,args)
execv()執(zhí)行一個新的程序棚唆,用新的程序代替子進程的空間
### 面試問題
1. 深拷貝和淺拷貝的區(qū)別 深拷貝和淺拷貝復(fù)制一個對象暇赤,然后把之前的對象刪掉,引用技術(shù)應(yīng)該怎么變
2. 對一個對象進行如何操作才能使他的引用計數(shù)增加或者減少
3. python垃圾回收機制
4. 復(fù)制一個list的方法
5. python內(nèi)部list和tuple的實現(xiàn)的數(shù)據(jù)結(jié)構(gòu) 數(shù)組
6. 數(shù)據(jù)庫索引宵凌,b樹和b+樹的實現(xiàn)和區(qū)別鞋囊,為什么不用紅黑樹
7. ping的端口號 基于什么協(xié)議的
? 基于iCMP協(xié)議,沒有端口號? 控制報文協(xié)議
8. python? ? _ _init_ _方法和_ _? _new_ _的區(qū)別
? new: 創(chuàng)造對象是調(diào)用瞎惫,會返回當前對象的一個實例
? init: 創(chuàng)造完對象后調(diào)用失暴,無返回值
? 同時存在坯门,會優(yōu)先調(diào)用new方法
? new_是靜態(tài)方法,init是實例方法
9. python的閉包函數(shù)? 變量在閉包中調(diào)用的次序
10. 每行大小為16個字節(jié),總共1G大小的文件逗扒,限制內(nèi)存1MB,找出頻率出現(xiàn)次數(shù)最多的單詞
? ? 解決方法: 1mb內(nèi)存可以處理 2^16次方個單詞古戴,首先進行切分為100個文件,然后
11. 如何從一個很長的字符串來找一個子字符串 KMP算法
哪些是可變類型
哪些是不可變類型
深拷貝和淺拷貝的區(qū)別
裝飾器的特點
裝飾器有哪些優(yōu)點
1. 便于開發(fā)
2. 便于代碼復(fù)用
3.
## python語言內(nèi)部
#### 內(nèi)存管理
1. 引用計數(shù)
將一個對象放入列表中矩肩,引用增加
分配一個新的名稱现恼,引用增加
引用計數(shù)減少: 顯式的銷毀
sys.getrefcount( )函數(shù)可以獲得對象的當前引用計數(shù)
2. 垃圾回收
? 當引用計數(shù)清零時,垃圾回收機制
3. == 和is 的區(qū)別?
? ==比較對象的數(shù)據(jù)黍檩,is比較對象的標識(id)
4. copy和deepcopy
? copy了后叉袍,內(nèi)部對象的引用還沒有變,僅僅是復(fù)制了表面
? deepcopy是遞歸復(fù)制刽酱,完全是兩個不同的對象
5. numpy就是一個很好地例子喳逛,它的運行速度真的非常快棵里,因為很多算術(shù)運算其實并不是通過Python實現(xiàn)的润文。
6. 答:“猴子補丁”就是指,在函數(shù)或?qū)ο笠呀?jīng)定義之后殿怜,再去改變它們的行為典蝌。
7. 偶爾也會出現(xiàn)引用循環(huán)(reference cycle)。垃圾回收器會定時尋找這個循環(huán)头谜,并將其回收骏掀。舉個例子,假設(shè)有兩個對象o1和o2柱告,而且符合o1.x == o2和o2.x == o1這兩個條件截驮。如果o1和o2沒有其他代碼引用,那么它們就不應(yīng)該繼續(xù)存在际度。但它們的引用計數(shù)都是1葵袭。
8. 答:print的輸出是標準輸出,可以指向任何可以輸出的流甲脏,包括http輸出
9. 閉包: 外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)眶熬,可以通過外部函數(shù)的返回值來繼續(xù)調(diào)用內(nèi)嵌函數(shù)妹笆,推遲函數(shù)的
鴨子類型:
走起路來像鴨子块请,只關(guān)心行為
又比如list.extend()方法中,我們并不關(guān)心它的參數(shù)是不是list,只要它是可迭代的,所以它的參數(shù)可以是list/tuple/dict/字符串/生成器等.