-
Teacher 繼承 Student 時,__init__()括號中需要寫被繼承類的全部參數, super(Teacher, self).__init__(name, gender)報錯是因為缺少了Student的score參數; t = Teacher('Alice', 'Female', 'English') Teacher繼承Student的三個參數后又定義了course參數,共4個參數,這個地方少了一個參數
查看全部 -
有參數的decorator
在外面套一層專門接收參數的函數
例:
請給 @performace 增加一個參數,允許傳入's'
import?time from?functools?import?reduce def?performance(prefix): ????def?performance_decorator(f): ????????def?fn(*args,?**kwargs): ????????????t1?=?time.time() ????????????f(*args,?**kwargs) ????????????t2?=?time.time() ????????????print('函數f運行時間是{}{}'.format(t2?-?t1,prefix)) ????????return?fn ????return?performance_decorator @performance('s') def?f(list_): ????return?reduce(lambda?x,y:?x*y,?list_) f(list(range(1,10000)))
解釋:
def performance(參數):
????def performance_decorator(函數f):
????????...
????return performance_decorator
performance_decorator = performance(參數)
新函數 = performance_decorator(原函數)
查看全部 -
裝飾器的作用:
給原函數裝飾裝飾變成新函數
裝飾器的語法:
@+裝飾器函數名
例:
編寫一個decorator計算函數的運行時間
import?time from?functools?import?reduce def?performance(f): ????def?fn(*args,?**kwargs): ????????t1?=?time.time() ????????f(*args,?**kwargs)???#接收函數用*args,**kwargs;在函數中用args,kwargs ????????t2?=?time.time() ????????print('函數f運行時間是{}s'.format(t2?-?t1)) ????return?fn @performance def?f(list_): ????return?reduce(lambda?x,y:?x*y,?list_) f(list(range(1,100000))) ==>函數f運行時間是2.1856231689453125s
解釋:
將函數f作為參數傳給函數performance
函數performance接收原函數f
在函數performance中定義新函數fn,新函數的參數用來接收原函數的參數,一般設為*args,**kwargs可接收任何形式參數
裝飾原函數
返回新函數fn
查看全部 -
def?calc_sum(list_): ????def?lazy_sum(): ????????return?sum(list_) ????return?lazy_sum f?=?calc_sum([1,?2,?3,?4]) f() ==>10
閉包:
內層函數引用外層函數的變量(參數也算是變量),最后外層函數返回內層函數
那么這個內層函數就是一個閉包(類似打包返回)
錯誤寫法:
#?希望一次返回3個函數,分別計算1x1,2x2,3x3: def?count(): ????fs?=?[] ????for?i?in?range(1,?4): ????????def?f(): ?????????????return?i*i ????????fs.append(f) ????return?fs f1,?f2,?f3?=?count()?#內層函數只被定義還沒運行,此時外層函數運行完畢i=3 f1()==>9???#運行內層函數 f2()==>9 f3()==>9
正確寫法:
def?count(): ????fs=[] ????for?i?in?range(1,4): ????????def?g(j=i):???????#為內層函數設置形參默認值 ????????????return?j*j ????????fs.append(g) ????return?fs f1,f2,f3=count() print(f1(),f2(),f3())
在Python中,函數形參默認值是指在定義函數時為形參指定的默認值,在調用函數時,如果沒有為該形參提供實際的參數值,函數會使用默認值
查看全部 -
Python在函數內部定義子函數,并把子函數返回
def?f(): ????def?g(): ????????return?... ????return?g x?=?f() x()
函數名g就是指向函數g的變量
不加小括號就只是一個變量,加上小括號才能調用函數
查看全部 -
匿名函數
lambda 參數 : 表達式
可以有多個參數,但只能有一個表達式,返回值就是表達式的結果
例:
map(lambda?x:x*x,[1,2,3,4]) reduce(lambda?x,y:x*y,[1,2,3,4]) sorted(['bob',?'about',?'Zoo',?'Credit'],key=lambda?x:x.lower())
查看全部 -
sorted(list, (key=函數對象f, reverse=True)) 默認從小到大排序
函數f的作用:
接受待排序列表的元素作為參數傳入函數f,并返回真正需要排序的字段
例1:
(姓名,成績)按成績進行排序
def?f(item): ????return?item[1] print(sorted([('Alice',?72),?('Candy',?90),?('Bob',?62)],key=f)) ==>[('Bob',?62),?('Alice',?72),?('Candy',?90)]
例2:
對字符串忽略大小寫進行排序
def?f(item): ????return?item.lower() print(sorted(['bob',?'about',?'Zoo',?'Credit'],key=f)) ==>['about',?'bob',?'Credit',?'Zoo']
查看全部 -
filter(函數f, list)將函數f作用到list的每個元素上,對元素進行判斷,篩選出為True的元素(以迭代器形式)
例1:
利用filter()函數,刪除 None 或者空字符串
def?is_not_empty(s): ????return?s?and?s.strip() for?item?in?filter(is_not_empty,?['test',?None,?'',?'str',?'??',?'END']): ????print(item)
str.strip()刪除字符串str中的空白字符
例2:
利用filter()過濾出1~100中平方根是整數的數
import?math ???? def?sqrt_is_int(n): ????#?解題思路:如果將一個數的平方根的整數部分再平方仍然等于這個數,則他的平方根一定是整數 ????return?int(math.sqrt(n))*int(math.sqrt(n))?==?n ???? for?item?in?filter(sqrt_is_int,list(range(1,101))): ????print(item) ???? ???? #?math.sqrt()的結果是float #?float*float結果可能是int
查看全部 -
reduce(函數f, list)對list的元素順序累(積/加...)
函數f必須接收兩個參數
例:
Python內置了求和函數sum(),但沒有求積的函數,請利用recude()來求積
from?functools?import?reduce def?f(x,y): ????return?x*y print(reduce(f,[1,3,5,7,9]))????? ==> f(1,3)??f(3,5)??f(15,7)??f(105,9) 945
查看全部 -
map(函數f, list) 把函數f作用在list的每一個元素上
例:
請利用map()函數,把一個list(包含若干不規范的英文名字)變成一個包含規范英文名字(首字母大寫,后續字母小寫)的list:
輸入:['alice', 'BOB', 'CanDY']
輸出:['Alice', 'Bob', 'Candy']def?f(s): ????return?s[0].upper()?+?s[1:].lower() ???? for?item?in?map(f,['alice',?'BOB',?'CanDY']): ????print(item) ==> Alice Bob Candy
str.lower()將字符串str變成小寫
str.upper()將字符串str變成大寫
注意:
1. 字符串切片會得到一個子字符串
2. 字符串的不可變性,不能在原字符串上修改某個索引位置
查看全部 -
請從頁面返回的內容中,過濾出鏈接含有www的內容。
import?requests from?bs4?import?BeautifulSoup url?=?"http://www.xianlaiwan.cn" response?=?requests.get(url) if?response.status_code?==?200: ????#?使用BeautifulSoup解析頁面內容 ????soup?=?BeautifulSoup(response.text,?'html.parser')?#'html.parser'是HTML解析器 ????#?找到所有的鏈接 ????links?=?soup.find_all('a')?????????#使用find_all()來查找特定標簽find_all() ????#?篩選出包含'www'的鏈接 ????www_links?=?[link['href']?for?link?in?links?if?link.get('href')!=None?and?'www'?in?link['href']]???????#以字典形式傳入屬性得到屬性值 ????for?link?in?www_links: ????????print(link) else: ????print("Failed?to?retrieve?the?webpage")
查看全部 -
網絡通信
server.py
import?socket server?=?socket.socket()?#創建server server.bind(('127.0.0.1',8999))?#綁定IP和端口?????127.0.0.1是本機回環IP server.listen(5)??#監聽端口(端口的最大連接數量) s?,?client_info?=?server.accept()??#接受連接,返回一個新的socket代理這個連接,和客戶端的信息(IP,端口) data?=?s.recv(1024)???#接收數據(最大字節數) while?1: ????data_append?=?s.recv(1024) ????if?str(data_append,'utf-8')?==?'end': ????????print(str(data,'utf-8')) ????????data?=?b'' ????else: ????????data?+=?data_append
client.py
import?socket client?=?socket.socket()?#創建client client.connect(('127.0.0.1',8999))?#連接server while?1: ????data?=?input('echo>>>') ????client.send(bytes(data,'utf-8'))?#發送bytes
查看全部 -
常用模式怎么記?
前操作,后文件格式,默認文本格式
r,rb
w,wb
a,ab
查看全部 -
一般使用close()關閉文件,但如果在close()之前,程序異常退出了,那么文件就得不到正確的關閉,就會造成文件損壞,文件內容丟失的問題
with關鍵字:
會確保不管在使用過程中是否發生異常,都會執行必要的“清理”的操作,釋放資源,比如文件使用后自動關閉等等。
查看全部 -
seek(index)移動文件中的游標位置
index:0 文件首部? ?index:2 文件尾部
注意:
往文件中寫完內容后,游標會在文件尾部,如果之后想讀取文件內容,需要把游標移動到文件首部,否則讀取不到任何內容
with?open('requirements.txt','a')?as?f: ????f.write('aaa\n') ????print(f.readlines()) ==>io.UnsupportedOperation:?not?readable
查看全部
舉報