Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
后端開發(fā)工程師,也需要提升WEB前端開發(fā)的能力。當下較為火熱的web前端開發(fā)技能,當然就有HTML5了。甚至很多非同行的小伙伴都知道H5。所以,作為開發(fā)人員,我們有必要修煉內(nèi)功。那么,我們繼續(xù)努力,開煉吧。
Dreamweaver 8+,F(xiàn)irefox
友情提示,在 IE上調(diào)試H5,可能不是一種明知的選擇。您可以選擇 火狐 或者 谷歌 瀏覽器。
H5中文亂碼解決
CSS樣式之label
CSS3樣式之div樣式
CSS3樣式之圖片,音頻與視頻
CSS樣式之文字大小寫
DOM調(diào)用
1) H5中文亂碼解決
[案例說明]:下圖中,你會看到 代碼明明看著沒有問題,但是運行起來卻是一垞亂碼,為何呢?
中文亂碼
【解決思路】:在 head 之間,聲明 meta,指定編碼格式,代碼如下:
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
【運行效果如下】:
一行代碼解決中文亂碼問題
2,CSS樣式之label
【案例說明】: 有一段文字,其中的關(guān)鍵詞需要全部高亮。有沒有好的方式?這個可以有,就是CSS樣式。
下面是2段一模一樣的文字,前一段是 原始文本,后一段是 把所有的 “互聯(lián)網(wǎng)”加粗高亮顯示的。
前后2段話對比
[原始段落]:
<p>
互聯(lián)網(wǎng)(英語:internet),又稱網(wǎng)際網(wǎng)絡(luò),或音譯因特網(wǎng)(Internet)、英特網(wǎng),是網(wǎng)絡(luò)與網(wǎng)絡(luò)之間所串連成的龐大網(wǎng)絡(luò),這些網(wǎng)絡(luò)以一組通用的協(xié)議相連,形成邏輯上的單一巨大國際網(wǎng)絡(luò)。通常internet泛指互聯(lián)網(wǎng),而Internet則特指因特網(wǎng)。這種將計算機網(wǎng)絡(luò)互相聯(lián)接在一起的方法可稱作“網(wǎng)絡(luò)互聯(lián)”,在這基礎(chǔ)上發(fā)展出覆蓋全世界的全球性互聯(lián)網(wǎng)絡(luò)稱互聯(lián)網(wǎng),即是互相連接一起的網(wǎng)絡(luò)結(jié)構(gòu)。互聯(lián)網(wǎng)并不等同萬維網(wǎng),萬維網(wǎng)只是一建基于超文本相互鏈接而成的全球性系統(tǒng),且是互聯(lián)網(wǎng)所能提供的服務(wù)其中之一。
</p>
【解決方案】:
第一步:把所有的 “互聯(lián)網(wǎng)”批量替換為“<label>互聯(lián)網(wǎng)</label>”;
第二步:加上 css聲明,如下這段 插入在<header>與 </head>之間 即可。
<style type="text/css">
p label {
font-weight:bold;
background:yellow;
}
</style>
3, CSS3樣式之div樣式
【案例說明】:如果給你4個div合子,如何分別對它們進行旋轉(zhuǎn),扭曲,縮放,稱動?
原始運行效果 及 原始代碼
【解決方案】:分別加上wrapper1, wrappere2, wrapper3, wrapper4的CSS樣式,分別使用 transform 的 rotate 旋轉(zhuǎn),skew 扭曲, scale 按比例縮放, translate 平移 即可滿足。
【代碼如下】:
.wrapper1 div {
width: 200px;
height: 200px;
background: orange;
color: Blue;
font-weight: bold;
text-align: center;
font-size: 1.5em;
transform: rotate(30deg);
}
.wrapper2 div {
width: 300px;
height: 100px;
line-height: 100px;
text-align: center;
color: #fff;
background: orange;
transform: skew(30deg);
}
.wrapper3 div {
width: 200px;
height: 200px;
line-height: 200px;
background: orange;
text-align: center;
color: #fff;
}
.wrapper3 div:hover {
transform: scale(0.5,0.5);
}
.wrapper4 div {
width: 200px;
height: 200px;
line-height: 200px;
text-align: center;
background: orange;
color: #fff;
transform: translate(50px,100px);
}
【效果如下】:
效果對比
4,CSS3樣式之圖片,音頻與視頻
【案例說明】:在網(wǎng)頁上如何插入圖片,音頻 及 視頻?
【運行效果】:
Firefox 與 IE8
【解決方案代碼】:
5,CSS3樣式之文字大小寫
[案例說明]:小張是外企的前端開發(fā)工程師,新聞編輯部或宣傳策劃部同仁跑來找他,說其有很一篇文章要發(fā)布到系統(tǒng)中,但是有些單詞,一會要大寫,一會要小寫,或某些是首字母要大寫,要命的是篇幅太長,處理起來非常耗時,希望小張來幫忙。
素有經(jīng)驗的小張,并不擔心同仁的稿件篇幅大小,幾行CSS代碼足矣。
【解決方案】:通過CSS的 text-transform方法可以處理文字的大小寫。
運行效果
代碼
6,DOM調(diào)用
【案例說明】:如果你所在的項目組,不允許使用JQUERY去操作web界面上的某個元素,那么你有什么替代解決方案?
【答案】:用原生態(tài)的 document.getElementById,document.getElementsByTagName, document.getElementsByClassName 等 結(jié)合CSS去操作。
代碼
運行效果
本文 主要把 H5 前端開發(fā)中可能碰到的一些常見的小問題拎出來,簡單的進行了說明回顧,及 解決思路與方法的提出。
希望能對大家有所幫助,尤其是工作中需要經(jīng)常詢問度娘與谷哥的小伙伴,希望提升H5基礎(chǔ)的小伙伴,或者是 零基礎(chǔ)卻希望了解H5并能做點東西的小伙伴。
碼字不易,您的關(guān)注,是我們前進的動力。
不管您有無程序開發(fā)經(jīng)驗,只要對HTML5前端開發(fā)感興趣,且生活與工作都在上海,不管是外地戶籍,還是本地戶籍,均有免費學習H5的機會。
當然,如果您想學習其它,如 OFFICE系列軟件高級操作,軟件測試培訓(xùn), .NET培訓(xùn), JAVA培訓(xùn) 等,都可以免費學習。
重點是:學習時間一般安排在周末,非工作日。
您只需要關(guān)注,并在下方留言給我即可,其它交給我來安排。一定要轉(zhuǎn)發(fā),收藏。
友情提示:既然是福利,大家快快動起來哦。
(結(jié)束)
從Fetch API 問世以來,我們就能使用漂亮的語法發(fā)送HTTP Request 或取后臺接口數(shù)據(jù),這篇文章將會分享我自己常用的Fetch方法( GET、POST、搭配await 或promise.all...等) ,隨著瀏覽器的普遍支持,也就不太需要使用XMLHttpRequest 或jQuery AJAX,我們的代碼看起來也就更加簡潔干凈啰~
fetch()方法,包含了需要fetch 的網(wǎng)址和對應(yīng)的屬性設(shè)定( 例如method、headers、mode、body...等,最基本的寫法屬性不一定要填),執(zhí)行之后會送出Request,如果得到回應(yīng)就會回傳帶有Response 的Promise 內(nèi)容,使用then 將回傳值傳遞下去。
fetch('網(wǎng)址') .then(function(response) { // 處理 response }).catch(function(err) { // 錯誤處理 });
舉例來說,通過天氣數(shù)據(jù)開放平臺可以取得許多氣象資料(例如阿里云的API開放平臺),下面的示例獲取北京的當日氣溫,因為結(jié)果返回為json格式,所以在fetch取得數(shù)據(jù)之后,通過json()的方法處理數(shù)據(jù),接著傳遞到下一層,就能顯示出「北京市的當日氣溫」。
fetch('天氣數(shù)據(jù)開放平臺網(wǎng)址') .then(res=> { return res.json(); }).then(result=> { let city=result.cwbopendata.location[14].parameter[0].parameterValue; let temp=result.cwbopendata.location[14].weatherElement[3].elementValue.value; console.log(`${city}的當前氣溫 ${temp} 攝氏度`); // 得到 北京市的氣溫 29.30攝氏度 });
以下列出Fetch常用的的Request屬性。(更多屬性請參考fetch Request )
以下列出Fetch常用的Response屬性。(更多屬性和方法請參考fetch Response )
以下列出Fetch常用的Response方法。(更多屬性和方法請參考fetch Response )
Get 是Fetch 最簡單的方法,使用Get 必須要將fetch 第二個參數(shù)里的method 設(shè)定為get,如果遇到跨域問題,就搭配其他屬性例如mode、credentials 來進行細部設(shè)定( 但針對非跨域的就沒用了),下方的示例我做了一個簡單的后端請求,通過fetch 傳遞姓名和年紀的參數(shù),就會看到后端回應(yīng)一串文字。
const name='oxxo'; const age=18; const uri=`https://網(wǎng)址/exec?name=${name}&age=${age}`; fetch(uri, {method:'GET'}) .then(res=> { return res.text(); // 使用 text() 可以得到純文字 String }).then(result=> { console.log(result); // 得到「你的名字是:oxxo,年紀:18 歲。」 });
使用POST方法可以搭配body屬性設(shè)定傳遞參數(shù),比如我的接口地址,可以接收name和age所組成的JSON請求,當網(wǎng)址接收到要求后,就會回應(yīng)一個json對象,需要注意的是,如果是傳遞「中文」可能會出現(xiàn)亂碼,這時可以使用encodeURI來做轉(zhuǎn)碼,且要通過JSON.stringify來轉(zhuǎn)換成string方式傳遞。
const uri='網(wǎng)址'; fetch(uri, { method:'POST', body:encodeURI(JSON.stringify({ name:'oxxo', age:18 })), headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' } }) .then(res=> { return res.json(); // 使用 json() 可以得到 json 對象 }).then(result=> { console.log(result); // 得到 {name: "oxxo", age: 18, text: "你的名字是 oxxo,年紀18歲~"} });
過去在XMLHttpRequest 或jQuery AJAX 的全盛時期,如果要確保每個GET 或POST 的要求,都要按照指定的順序進行,往往會用上一連串的callback 輔助,但是當callback 越來越多,代碼也就越來越難管理,然而fetch 返回的是一個Promise,我們也就能直接利用await 或promise.all 的作法,輕松掌握同步與非同步之間的轉(zhuǎn)換。
下方的例子是一個非同步的示例,因為沒有進行任何的同步處理,所以執(zhí)行之后,會先出現(xiàn)hello的文字,接著才是通過fetch 得到的結(jié)果。
const postURL=(name,age)=> { const uri='https://網(wǎng)址; return fetch(uri, { method:'POST', body:encodeURI(JSON.stringify({ name:name, age:age })), headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' } }) .then(res=> { return res.json(); }).then(result=>{ console.log(result); }); }; postURL('oxxo',18); console.log('hello!!!'); postURL('tom',18);
因為fetch 的特性,可以改成async 和await 的寫法,執(zhí)行后也就能按照我們要的順序進行。
async function(){ // 設(shè)定為 async const postURL=(name,age)=> { const uri='https://網(wǎng)址'; return fetch(uri, { method:'POST', body:encodeURI(JSON.stringify({ name:name, age:age })), headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' } }) .then(res=> { return res.json(); }).then(result=>{ console.log(result); }); }; await postURL('oxxo',18); // 使用 await console.log('hello!!!'); await postURL('tom',18); // 使用 await }();
最后那段await 的代碼,也可以改成promise.all 的方法,就會先fetch,然后再出現(xiàn)hello的文字,不過也因為promise.all無法保證其載入順序,就可能會發(fā)生tom 在oxxo之前出現(xiàn)的狀況呦。
await Promise.all([postURL('oxxo',18), postURL('tom',18)]); console.log('hello!!!');
說了這么多,你一定關(guān)心這個API的兼容性,現(xiàn)代瀏覽器大部分還是支持的,可以放心使用,如下圖所示:
文章來源:https://www.oxxostudio.tw/articles/201908/js-fetch.html
原文作者:oxxostudio
由于網(wǎng)頁為繁體內(nèi)容,術(shù)語描述和話術(shù)與我們有差異的問題,筆者在保證不改變原意的基礎(chǔ)上做了調(diào)整,并在此基礎(chǔ)上進行了錯誤校正,如發(fā)現(xiàn)問題,歡迎你的指正
Fetch API 的神奇,簡化了許多原本較為復(fù)雜的用法,也讓項目代碼寫起來更加干凈易讀好維護。
更多參考資源:
MDN:Using Fetch
https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch
AJAX 與Fetch API
https://eyesofkids.gitbooks.io/javascript-start-from-es6/content/part4/ajax_fetch.html
更多精彩內(nèi)容,請關(guān)注“前端達人”公眾號
遇到過得反爬蟲策略以及解決方法?
1.通過headers反爬蟲
2.基于用戶行為的發(fā)爬蟲:(同一IP短時間內(nèi)訪問的頻率)
3.動態(tài)網(wǎng)頁反爬蟲(通過ajax請求數(shù)據(jù),或者通過JavaScript生成)
4.對部分數(shù)據(jù)進行加密處理的(數(shù)據(jù)是亂碼)
解決方法:
對于基本網(wǎng)頁的抓取可以自定義headers,添加headers的數(shù)據(jù)
使用多個代理ip進行抓取或者設(shè)置抓取的頻率降低一些,
動態(tài)網(wǎng)頁的可以使用selenium + phantomjs 進行抓取
對部分數(shù)據(jù)進行加密的,可以使用selenium進行截圖,使用python自帶的pytesseract庫進行識別,但是比較慢最直接的方法是找到加密的方法進行逆向推理。
1 urllib 和 urllib2 的區(qū)別?
2 列舉網(wǎng)絡(luò)爬蟲所用到的網(wǎng)絡(luò)數(shù)據(jù)包,解析包?
3 簡述一下爬蟲的步驟?
4 遇到反爬機制怎么處理?
反爬機制:
headers方向
判斷User-Agent、判斷Referer、判斷Cookie。
將瀏覽器的headers信息全部添加進去
注意:Accept-Encoding;gzip,deflate需要注釋掉
5 常見的HTTP方法有哪些?
6 說一說redis-scrapy中redis的作用?
它是將scrapy框架中Scheduler替換為redis數(shù)據(jù)庫,實現(xiàn)隊列管理共享。
優(yōu)點:
7 遇到的反爬蟲策略以及解決方法?
8 如果讓你來防范網(wǎng)站爬蟲,你應(yīng)該怎么來提高爬取的難度 ?
9 scrapy分為幾個組成部分?分別有什么作用?
分為5個部分;Spiders(爬蟲類),Scrapy Engine(引擎),Scheduler(調(diào)度器),Downloader(下載器),Item Pipeline(處理管道)。
10 簡述一下scrapy的基本流程?
scrapy分為9個步驟:
11 python3.5語言中enumerate的意思是
對于一個可迭代的(iterable)/可遍歷的對象(如列表、字符串),enumerate將其組成一個索引序列,利用它可以同時獲得索引和值
enumerate多用于在for循環(huán)中得到計數(shù)
12 你是否了解谷歌的無頭瀏覽器?
無頭瀏覽器即headless browser,是一種沒有界面的瀏覽器。既然是瀏覽器那么瀏覽器該有的東西它都應(yīng)該有,只是看不到界面而已。
Python中selenium模塊中的PhantomJS即為無界面瀏覽器(無頭瀏覽器):是基于QtWebkit的無頭瀏覽器。
13 scrapy和scrapy-redis的區(qū)別?
scrapy是一個爬蟲通用框架,但不支持分布式,scrapy-redis是為了更方便的實現(xiàn)scrapy分布式爬蟲,而提供了一些以redis為基礎(chǔ)的組件
為什么會選擇redis數(shù)據(jù)庫?
因為redis支持主從同步,而且數(shù)據(jù)都是緩存在內(nèi)存中,所以基于redis的分布式爬蟲,對請求和數(shù)據(jù)的高頻讀取效率非常高
什么是主從同步?
在Redis中,用戶可以通過執(zhí)行SLAVEOF命令或者設(shè)置slaveof選項,讓一個服務(wù)器去復(fù)制(replicate)另一個服務(wù)器,我們稱呼被復(fù)制的服務(wù)器為主服務(wù)器(master),而對主服務(wù)器進行復(fù)制的服務(wù)器則被稱為從服務(wù)器(slave),當客戶端向從服務(wù)器發(fā)送SLAVEOF命令,要求從服務(wù)器復(fù)制主服務(wù)器時,從服務(wù)器首先需要執(zhí)行同步操作,也即是,將從服務(wù)器的數(shù)據(jù)庫狀態(tài)更新至主服務(wù)器當前所處的數(shù)據(jù)庫狀態(tài)
14 scrapy的優(yōu)缺點?為什么要選擇scrapy框架?
優(yōu)點:
采取可讀性更強的xpath代替正則 強大的統(tǒng)計和log系統(tǒng) 同時在不同的url上爬行 支持shell方式,方便獨立調(diào)試 寫middleware,方便寫一些統(tǒng)一的過濾器 通過管道的方式存入數(shù)據(jù)庫
缺點:
基于python爬蟲框架,擴展性比較差,基于twisted框架,運行中exception是不會干掉reactor,并且異步框架出錯后是不會停掉其他任務(wù)的,數(shù)據(jù)出錯后難以察覺
15 scrapy和requests的使用情況?
requests 是 polling 方式的,會被網(wǎng)絡(luò)阻塞,不適合爬取大量數(shù)據(jù)
scapy 底層是異步框架 twisted ,并發(fā)是最大優(yōu)勢
16 描述一下scrapy框架的運行機制?
從start_urls里面獲取第一批url發(fā)送請求,請求由請求引擎給調(diào)度器入請求對列,獲取完畢后,調(diào)度器將請求對列交給下載器去獲取請求對應(yīng)的響應(yīng)資源,并將響應(yīng)交給自己編寫的解析方法做提取處理,如果提取出需要的數(shù)據(jù),則交給管道處理,如果提取出url,則繼續(xù)執(zhí)行之前的步驟,直到多列里沒有請求,程序結(jié)束。
17 寫爬蟲使用多進程好,還是用多線程好?
IO密集型代碼(文件處理、網(wǎng)絡(luò)爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,造成不必要的時間浪費,而開啟多線程能在線程A等待時,自動切換到線程B,可以不浪費CPU的資源,從而能提升程序執(zhí)行效率)。在實際的數(shù)據(jù)采集過程中,既考慮網(wǎng)速和響應(yīng)的問題,也需要考慮自身機器的硬件情況,來設(shè)置多進程或多線程
18 常見的反爬蟲和應(yīng)對方法?
19 分布式爬蟲主要解決什么問題?
面對海量待抓取網(wǎng)頁,只有采用分布式架構(gòu),才有可能在較短時間內(nèi)完成一輪抓取工作。
它的開發(fā)效率是比較快而且簡單的。
20 如何提高爬取效率?
爬蟲下載慢主要原因是阻塞等待發(fā)往網(wǎng)站的請求和網(wǎng)站返回
1,采用異步與多線程,擴大電腦的cpu利用率; 2,采用消息隊列模式 3,提高帶寬
21 說說什么是爬蟲協(xié)議?
Robots協(xié)議(也稱為爬蟲協(xié)議、爬蟲規(guī)則、機器人協(xié)議等)也就是robots.txt,網(wǎng)站通過robots協(xié)議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
Robots協(xié)議是網(wǎng)站國際互聯(lián)網(wǎng)界通行的道德規(guī)范,其目的是保護網(wǎng)站數(shù)據(jù)和敏感信息、確保用戶個人信息和隱私不被侵犯。因其不是命令,故需要搜索引擎自覺遵守。
22 如果對方網(wǎng)站反爬取,封IP了怎么辦?
23 有一個jsonline格式的文件file
def get_lines(): with open('file.txt','rb') as f: return f.readlines() if __name__=='__main__': for e in get_lines(): process(e) # 處理每一行數(shù)據(jù)
現(xiàn)在要處理一個大小為10G的文件,但是內(nèi)存只有4G,如果在只修改get_lines 函數(shù)而其他代碼保持不變的情況下,應(yīng)該如何實現(xiàn)?需要考慮的問題都有那些?
def get_lines(): with open('file.txt','rb') as f: for i in f: yield i
Pandaaaa906提供的方法
from mmap import mmap def get_lines(fp): with open(fp,"r+") as f: m=mmap(f.fileno(), 0) tmp=0 for i, char in enumerate(m): if char==b"\n": yield m[tmp:i+1].decode() tmp=i+1 if __name__=="__main__": for i in get_lines("fp_some_huge_file"): print(i)
要考慮的問題有:內(nèi)存只有4G無法一次性讀入10G文件,需要分批讀入分批讀入數(shù)據(jù)要記錄每次讀入數(shù)據(jù)的位置。分批每次讀取數(shù)據(jù)的大小,太小會在讀取操作花費過多時間。
https://stackoverflow.com/questions/30294146/python-fastest-way-to-process-large-file
24 補充缺失的代碼
def print_directory_contents(sPath): """ 這個函數(shù)接收文件夾的名稱作為輸入?yún)?shù) 返回該文件夾中文件的路徑 以及其包含文件夾中文件的路徑 """ import os for s_child in os.listdir(s_path): s_child_path=os.path.join(s_path, s_child) if os.path.isdir(s_child_path): print_directory_contents(s_child_path) else: print(s_child_path)
25 輸入日期, 判斷這一天是這一年的第幾天?
import datetime def dayofyear(): year=input("請輸入年份: ") month=input("請輸入月份: ") day=input("請輸入天: ") date1=datetime.date(year=int(year),month=int(month),day=int(day)) date2=datetime.date(year=int(year),month=1,day=1) return (date1-date2).days+1
26 打亂一個排好序的list對象alist?
import random alist=[1,2,3,4,5] random.shuffle(alist) print(alist)
27 現(xiàn)有字典 d={'a':24,'g':52,'i':12,'k':33}請按value值進行排序?
sorted(d.items(),key=lambda x:x[1])
28 字典推導(dǎo)式
d={key:value for (key,value) in iterable}
29 請反轉(zhuǎn)字符串 "aStr"?
print("aStr"[::-1])
30 將字符串 "k:1 |k1:2|k2:3|k3:4",處理成字典 {k:1,k1:2,
str1="k:1|k1:2|k2:3|k3:4" def str2dict(str1): dict1={} for iterms in str1.split('|'): key,value=iterms.split(':') dict1[key]=value return dict1 #字典推導(dǎo)式 d={k:int(v) for t in str1.split("|") for k, v in (t.split(":"), )}
31 請按alist中元素的age由大到小排序
alist=[{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}] def sort_by_age(list1): return sorted(alist,key=lambda x:x['age'],reverse=True)
32 下面代碼的輸出結(jié)果將是什么?
list=['a','b','c','d','e'] print(list[10:])
代碼將輸出[],不會產(chǎn)生IndexError錯誤,就像所期望的那樣,嘗試用超出成員的個數(shù)的index來獲取某個列表的成員。例如,嘗試獲取list[10]和之后的成員,會導(dǎo)致IndexError。然而,嘗試獲取列表的切片,開始的index超過了成員個數(shù)不會產(chǎn)生IndexError,而是僅僅返回一個空列表。這成為特別讓人惡心的疑難雜癥,因為運行的時候沒有錯誤產(chǎn)生,導(dǎo)致Bug很難被追蹤到。
33 寫一個列表生成式,產(chǎn)生一個公差為11的等差數(shù)列
print([x*11 for x in range(10)])
34 給定兩個列表,怎么找出他們相同的元素和不同的元素?
list1=[1,2,3] list2=[3,4,5] set1=set(list1) set2=set(list2) print(set1 & set2) print(set1 ^ set2)
35 請寫出一段python代碼實現(xiàn)刪除list里面的重復(fù)元素?
l1=['b','c','d','c','a','a'] l2=list(set(l1)) print(l2)
用list類的sort方法:
l1=['b','c','d','c','a','a'] l2=list(set(l1)) l2.sort(key=l1.index) print(l2)
也可以這樣寫:
l1=['b','c','d','c','a','a'] l2=sorted(set(l1),key=l1.index) print(l2)
也可以用遍歷:
l1=['b','c','d','c','a','a'] l2=[] for i in l1: if not i in l2: l2.append(i) print(l2)
36 給定兩個list A,B ,請用找出A,B中相同與不同的元素
A,B 中相同元素: print(set(A)&set(B)) A,B 中不同元素: print(set(A)^set(B))
37 python新式類和經(jīng)典類的區(qū)別?
a. 在python里凡是繼承了object的類,都是新式類
b. Python3里只有新式類
c. Python2里面繼承object的是新式類,沒有寫父類的是經(jīng)典類
d. 經(jīng)典類目前在Python里基本沒有應(yīng)用
38 python中內(nèi)置的數(shù)據(jù)結(jié)構(gòu)有幾種?
a. 整型 int、 長整型 long、浮點型 float、 復(fù)數(shù) complex
b. 字符串 str、 列表 list、 元祖 tuple
c. 字典 dict 、 集合 set
d. Python3 中沒有 long,只有無限精度的 int
39 python如何實現(xiàn)單例模式?請寫出兩種實現(xiàn)方式?
第一種方法:使用裝飾器
def singleton(cls): instances={} def wrapper(*args, **kwargs): if cls not in instances: instances[cls]=cls(*args, **kwargs) return instances[cls] return wrapper @singleton class Foo(object): pass foo1=Foo() foo2=Foo() print(foo1 is foo2) # True
第二種方法:使用基類
New 是真正創(chuàng)建實例對象的方法,所以重寫基類的new 方法,以此保證創(chuàng)建對象的時候只生成一個實例
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance=super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance class Foo(Singleton): pass foo1=Foo() foo2=Foo() print(foo1 is foo2) # True
第三種方法:元類,元類是用于創(chuàng)建類對象的類,類對象創(chuàng)建實例對象時一定要調(diào)用call方法,因此在調(diào)用call時候保證始終只創(chuàng)建一個實例即可,type是python的元類
class Singleton(type): def __call__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance=super(Singleton, cls).__call__(*args, **kwargs) return cls._instance # Python2 class Foo(object): __metaclass__=Singleton # Python3 class Foo(metaclass=Singleton): pass foo1=Foo() foo2=Foo() print(foo1 is foo2) # True
40 反轉(zhuǎn)一個整數(shù),例如-123 --> -321
class Solution(object): def reverse(self,x): if -10<x<10: return x str_x=str(x) if str_x[0] !="-": str_x=str_x[::-1] x=int(str_x) else: str_x=str_x[1:][::-1] x=int(str_x) x=-x return x if -2147483648<x<2147483647 else 0 if __name__=='__main__': s=Solution() reverse_int=s.reverse(-120) print(reverse_int)
41 設(shè)計實現(xiàn)遍歷目錄與子目錄,抓取.pyc文件?
第一種方法:
import os def get_files(dir,suffix): res=[] for root,dirs,files in os.walk(dir): for filename in files: name,suf=os.path.splitext(filename) if suf==suffix: res.append(os.path.join(root,filename)) print(res) get_files("./",'.pyc')
第二種方法:
import os def pick(obj): if ob.endswith(".pyc"): print(obj) def scan_path(ph): file_list=os.listdir(ph) for obj in file_list: if os.path.isfile(obj): pick(obj) elif os.path.isdir(obj): scan_path(obj) if __name__=='__main__': path=input('輸入目錄') scan_path(path)
第三種方法
from glob import iglob def func(fp, postfix): for i in iglob(f"{fp}/**/*{postfix}", recursive=True): print(i) if __name__=="__main__": postfix=".pyc" func("K:\Python_script", postfix)
42 Python-遍歷列表時刪除元素的正確做法
遍歷在新在列表操作,刪除時在原來的列表操作
a=[1,2,3,4,5,6,7,8] print(id(a)) print(id(a[:])) for i in a[:]: if i>5: pass else: a.remove(i) print(a) print('-----------') print(id(a)) #filter a=[1,2,3,4,5,6,7,8] b=filter(lambda x: x>5,a) print(list(b))
列表解析
a=[1,2,3,4,5,6,7,8] b=[i for i in a if i>5] print(b)
倒序刪除
因為列表總是‘向前移’,所以可以倒序遍歷,即使后面的元素被修改了,還沒有被遍歷的元素和其坐標還是保持不變的
a=[1,2,3,4,5,6,7,8] print(id(a)) for i in range(len(a)-1,-1,-1): if a[i]>5: pass else: a.remove(a[i]) print(id(a)) print('-----------') print(a)
43 字符串的操作題目
全字母短句 PANGRAM 是包含所有英文字母的句子,比如:A QUICK BROWN FOX JUMPS OVER THE LAZY DOG. 定義并實現(xiàn)一個方法 get_missing_letter, 傳入一個字符串采納數(shù),返回參數(shù)字符串變成一個 PANGRAM 中所缺失的字符。應(yīng)該忽略傳入字符串參數(shù)中的大小寫,返回應(yīng)該都是小寫字符并按字母順序排序(請忽略所有非 ACSII 字符)
下面示例是用來解釋,雙引號不需要考慮:
(0)輸入: "A quick brown for jumps over the lazy dog"
返回: ""
(1)輸入: "A slow yellow fox crawls under the proactive dog"
返回: "bjkmqz"
(2)輸入: "Lions, and tigers, and bears, oh my!"
返回: "cfjkpquvwxz"
(3)輸入: ""
返回:"abcdefghijklmnopqrstuvwxyz"
def get_missing_letter(a): s1=set("abcdefghijklmnopqrstuvwxyz") s2=set(a) ret="".join(sorted(s1-s2)) return ret print(get_missing_letter("python"))
44 可變類型和不可變類型
1,可變類型有l(wèi)ist,dict.不可變類型有string,number,tuple.
2,當進行修改操作時,可變類型傳遞的是內(nèi)存中的地址,也就是說,直接修改內(nèi)存中的值,并沒有開辟新的內(nèi)存。
3,不可變類型被改變時,并沒有改變原內(nèi)存地址中的值,而是開辟一塊新的內(nèi)存,將原地址中的值復(fù)制過去,對這塊新開辟的內(nèi)存中的值進行操作。
45 is和==有什么區(qū)別?
is:比較的是兩個對象的id值是否相等,也就是比較倆對象是否為同一個實例對象。是否指向同一個內(nèi)存地址
==: 比較的兩個對象的內(nèi)容/值是否相等,默認會調(diào)用對象的eq()方法
46 求出列表所有奇數(shù)并構(gòu)造新列表
a=[1,2,3,4,5,6,7,8,9,10] res=[ i for i in a if i%2==1] print(res)
47 用一行python代碼寫出1+2+3+10248
from functools import reduce #1.使用sum內(nèi)置求和函數(shù) num=sum([1,2,3,10248]) print(num) #2.reduce 函數(shù) num1=reduce(lambda x,y :x+y,[1,2,3,10248]) print(num1)
48 Python中變量的作用域?(變量查找順序)
函數(shù)作用域的LEGB順序
1.什么是LEGB?
L: local 函數(shù)內(nèi)部作用域
E: enclosing 函數(shù)內(nèi)部與內(nèi)嵌函數(shù)之間
G: global 全局作用域
B: build-in 內(nèi)置作用
python在函數(shù)里面的查找分為4種,稱之為LEGB,也正是按照這是順序來查找的
49 字符串 "123" 轉(zhuǎn)換成 123,不使用內(nèi)置api,例如 int()
方法一: 利用 str 函數(shù)
def atoi(s): num=0 for v in s: for j in range(10): if v==str(j): num=num * 10 + j return num
方法二: 利用 ord 函數(shù)
def atoi(s): num=0 for v in s: num=num * 10 + ord(v) - ord('0') return num
方法三: 利用 eval 函數(shù)
def atoi(s): num=0 for v in s: t="%s * 1" % v n=eval(t) num=num * 10 + n return num
方法四: 結(jié)合方法二,使用 reduce,一行解決
from functools import reduce def atoi(s): return reduce(lambda num, v: num * 10 + ord(v) - ord('0'), s, 0)
50 Given an array of integers
給定一個整數(shù)數(shù)組和一個目標值,找出數(shù)組中和為目標值的兩個數(shù)。你可以假設(shè)每個輸入只對應(yīng)一種答案,且同樣的元素不能被重復(fù)利用。示例:給定nums=[2,7,11,15],target=9 因為 nums[0]+nums[1]=2+7=9,所以返回[0,1]
class Solution: def twoSum(self,nums,target): """ :type nums: List[int] :type target: int :rtype: List[int] """ d={} size=0 while size < len(nums): if target-nums[size] in d: if d[target-nums[size]] <size: return [d[target-nums[size]],size] else: d[nums[size]]=size size=size +1 solution=Solution() list=[2,7,11,15] target=9 nums=solution.twoSum(list,target) print(nums)
給列表中的字典排序:假設(shè)有如下list對象,alist=[{"name":"a","age":20},{"name":"b","age":30},{"name":"c","age":25}],將alist中的元素按照age從大到小排序 alist=[{"name":"a","age":20},{"name":"b","age":30},{"name":"c","age":25}]
alist_sort=sorted(alist,key=lambda e: e.__getitem__('age'),reverse=True)
51 python代碼實現(xiàn)刪除一個list里面的重復(fù)元素
def distFunc1(a): """使用集合去重""" a=list(set(a)) print(a) def distFunc2(a): """將一個列表的數(shù)據(jù)取出放到另一個列表中,中間作判斷""" list=[] for i in a: if i not in list: list.append(i) #如果需要排序的話用sort list.sort() print(list) def distFunc3(a): """使用字典""" b={} b=b.fromkeys(a) c=list(b.keys()) print(c) if __name__=="__main__": a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3] distFunc1(a) distFunc2(a) distFunc3(a)
52 統(tǒng)計一個文本中單詞頻次最高的10個單詞?
import re # 方法一 def test(filepath): distone={} with open(filepath) as f: for line in f: line=re.sub("\W+", " ", line) lineone=line.split() for keyone in lineone: if not distone.get(keyone): distone[keyone]=1 else: distone[keyone] +=1 num_ten=sorted(distone.items(), key=lambda x:x[1], reverse=True)[:10] num_ten=[x[0] for x in num_ten] return num_ten # 方法二 # 使用 built-in 的 Counter 里面的 most_common import re from collections import Counter def test2(filepath): with open(filepath) as f: return list(map(lambda c: c[0], Counter(re.sub("\W+", " ", f.read()).split()).most_common(10)))
53 請寫出一個函數(shù)滿足以下條件
該函數(shù)的輸入是一個僅包含數(shù)字的list,輸出一個新的list,其中每一個元素要滿足以下條件:
1、該元素是偶數(shù)
2、該元素在原list中是在偶數(shù)的位置(index是偶數(shù))
def num_list(num): return [i for i in num if i %2==0 and num.index(i)%2==0] num=[0,1,2,3,4,5,6,7,8,9,10] result=num_list(num) print(result)
54 使用單一的列表生成式來產(chǎn)生一個新的列表
該列表只包含滿足以下條件的值,元素為原始列表中偶數(shù)切片
list_data=[1,2,5,8,10,3,18,6,20] res=[x for x in list_data[::2] if x %2==0] print(res)
55 用一行代碼生成[1,4,9,16,25,36,49,64,81,100]
[x * x for x in range(1,11)]
56 輸入某年某月某日,判斷這一天是這一年的第幾天?
import datetime y=int(input("請輸入4位數(shù)字的年份:")) m=int(input("請輸入月份:")) d=int(input("請輸入是哪一天")) targetDay=datetime.date(y,m,d) dayCount=targetDay - datetime.date(targetDay.year -1,12,31) print("%s是 %s年的第%s天。"%(targetDay,y,dayCount.days))
57 兩個有序列表,l1,l2,對這兩個列表進行合并不可使用extend
def loop_merge_sort(l1,l2): tmp=[] while len(l1)>0 and len(l2)>0: if l1[0] <l2[0]: tmp.append(l1[0]) del l1[0] else: tmp.append(l2[0]) del l2[0] while len(l1)>0: tmp.append(l1[0]) del l1[0] while len(l2)>0: tmp.append(l2[0]) del l2[0] return tmp
58 給定一個任意長度數(shù)組,實現(xiàn)一個函數(shù)
讓所有奇數(shù)都在偶數(shù)前面,而且奇數(shù)升序排列,偶數(shù)降序排序,如字符串'1982376455',變成'1355798642'
# 方法一 def func1(l): if isinstance(l, str): l=[int(i) for i in l] l.sort(reverse=True) for i in range(len(l)): if l[i] % 2 > 0: l.insert(0, l.pop(i)) print(''.join(str(e) for e in l)) # 方法二 def func2(l): print("".join(sorted(l, key=lambda x: int(x) % 2==0 and 20 - int(x) or int(x))))
59 寫一個函數(shù)找出一個整數(shù)數(shù)組中,第二大的數(shù)
def find_second_large_num(num_list): """ 找出數(shù)組第2大的數(shù)字 """ # 方法一 # 直接排序,輸出倒數(shù)第二個數(shù)即可 tmp_list=sorted(num_list) print("方法一\nSecond_large_num is :", tmp_list[-2]) # 方法二 # 設(shè)置兩個標志位一個存儲最大數(shù)一個存儲次大數(shù) # two 存儲次大值,one 存儲最大值,遍歷一次數(shù)組即可,先判斷是否大于 one,若大于將 one 的值給 two,將 num_list[i] 的值給 one,否則比較是否大于two,若大于直接將 num_list[i] 的值給two,否則pass one=num_list[0] two=num_list[0] for i in range(1, len(num_list)): if num_list[i] > one: two=one one=num_list[i] elif num_list[i] > two: two=num_list[i] print("方法二\nSecond_large_num is :", two) # 方法三 # 用 reduce 與邏輯符號 (and, or) # 基本思路與方法二一樣,但是不需要用 if 進行判斷。 from functools import reduce num=reduce(lambda ot, x: ot[1] < x and (ot[1], x) or ot[0] < x and (x, ot[1]) or ot, num_list, (0, 0))[0] print("方法三\nSecond_large_num is :", num) if __name__=='__main___': num_list=[34, 11, 23, 56, 78, 0, 9, 12, 3, 7, 5] find_second_large_num(num_list)
60 閱讀一下代碼他們的輸出結(jié)果是什么?
def multi(): return [lambda x : i*x for i in range(4)] print([m(3) for m in multi()])
正確答案是[9,9,9,9],而不是[0,3,6,9]產(chǎn)生的原因是Python的閉包的后期綁定導(dǎo)致的,這意味著在閉包中的變量是在內(nèi)部函數(shù)被調(diào)用的時候被查找的,因為,最后函數(shù)被調(diào)用的時候,for循環(huán)已經(jīng)完成, i 的值最后是3,因此每一個返回值的i都是3,所以最后的結(jié)果是[9,9,9,9]
61 統(tǒng)計一段字符串中字符出現(xiàn)的次數(shù)
# 方法一 def count_str(str_data): """定義一個字符出現(xiàn)次數(shù)的函數(shù)""" dict_str={} for i in str_data: dict_str[i]=dict_str.get(i, 0) + 1 return dict_str dict_str=count_str("AAABBCCAC") str_count_data="" for k, v in dict_str.items(): str_count_data +=k + str(v) print(str_count_data) # 方法二 from collections import Counter print("".join(map(lambda x: x[0] + str(x[1]), Counter("AAABBCCAC").most_common())))
62 Python中類方法、類實例方法、靜態(tài)方法有何區(qū)別?
類方法: 是類對象的方法,在定義時需要在上方使用 @classmethod 進行裝飾,形參為cls,表示類對象,類對象和實例對象都可調(diào)用
類實例方法: 是類實例化對象的方法,只有實例對象可以調(diào)用,形參為self,指代對象本身;
靜態(tài)方法: 是一個任意函數(shù),在其上方使用 @staticmethod 進行裝飾,可以用對象直接調(diào)用,靜態(tài)方法實際上跟該類沒有太大關(guān)系
63 遍歷一個object的所有屬性,并print每一個屬性名?
class Car: def __init__(self,name,loss): # loss [價格,油耗,公里數(shù)] self.name=name self.loss=loss def getName(self): return self.name def getPrice(self): # 獲取汽車價格 return self.loss[0] def getLoss(self): # 獲取汽車損耗值 return self.loss[1] * self.loss[2] Bmw=Car("寶馬",[60,9,500]) # 實例化一個寶馬車對象 print(getattr(Bmw,"name")) # 使用getattr()傳入對象名字,屬性值。 print(dir(Bmw)) # 獲Bmw所有的屬性和方法
64 寫一個類,并讓它盡可能多的支持操作符?
class Array: __list=[] def __init__(self): print "constructor" def __del__(self): print "destruct" def __str__(self): return "this self-defined array class" def __getitem__(self,key): return self.__list[key] def __len__(self): return len(self.__list) def Add(self,value): self.__list.append(value) def Remove(self,index): del self.__list[index] def DisplayItems(self): print "show all items---" for item in self.__list: print item
65 關(guān)于Python內(nèi)存管理,下列說法錯誤的是 B
A,變量不必事先聲明 B,變量無須先創(chuàng)建和賦值而直接使用
C,變量無須指定類型 D,可以使用del釋放資源
66 Python的內(nèi)存管理機制及調(diào)優(yōu)手段?
內(nèi)存管理機制: 引用計數(shù)、垃圾回收、內(nèi)存池
引用計數(shù):引用計數(shù)是一種非常高效的內(nèi)存管理手段,當一個Python對象被引用時其引用計數(shù)增加1,
當其不再被一個變量引用時則計數(shù)減1,當引用計數(shù)等于0時對象被刪除。弱引用不會增加引用計數(shù)
垃圾回收:
1.引用計數(shù)
引用計數(shù)也是一種垃圾收集機制,而且也是一種最直觀、最簡單的垃圾收集技術(shù)。當Python的某個對象的引用計數(shù)降為0時,說明沒有任何引用指向該對象,該對象就成為要被回收的垃圾了。比如某個新建對象,它被分配給某個引用,對象的引用計數(shù)變?yōu)?,如果引用被刪除,對象的引用計數(shù)為0,那么該對象就可以被垃圾回收。不過如果出現(xiàn)循環(huán)引用的話,引用計數(shù)機制就不再起有效的作用了。
2.標記清除
調(diào)優(yōu)手段
1.手動垃圾回收
2.調(diào)高垃圾回收閾值
3.避免循環(huán)引用
67 內(nèi)存泄露是什么?如何避免?
內(nèi)存泄漏指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計錯誤,導(dǎo)致在釋放該段內(nèi)存之前就失去了對該段內(nèi)存的控制,從而造成了內(nèi)存的浪費。
有__del__()函數(shù)的對象間的循環(huán)引用是導(dǎo)致內(nèi)存泄露的主兇。不使用一個對象時使用: del object 來刪除一個對象的引用計數(shù)就可以有效防止內(nèi)存泄露問題。
通過Python擴展模塊gc 來查看不能回收的對象的詳細信息。
可以通過 sys.getrefcount(obj) 來獲取對象的引用計數(shù),并根據(jù)返回值是否為0來判斷是否內(nèi)存泄露
68 python常見的列表推導(dǎo)式?
[表達式 for 變量 in 列表] 或者 [表達式 for 變量 in 列表 if 條件]
69 簡述read、readline、readlines的區(qū)別?
read 讀取整個文件
readline 讀取下一行
readlines 讀取整個文件到一個迭代器以供我們遍歷
70 什么是Hash(散列函數(shù))?
散列函數(shù)(英語:Hash function)又稱散列算法、哈希函數(shù),是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個叫做散列值(hash values,hash codes,hash sums,或hashes)的指紋。散列值通常用一個短的隨機字母和數(shù)字組成的字符串來代表
71 python函數(shù)重載機制?
函數(shù)重載主要是為了解決兩個問題。
1。可變參數(shù)類型。
2。可變參數(shù)個數(shù)。
另外,一個基本的設(shè)計原則是,僅僅當兩個函數(shù)除了參數(shù)類型和參數(shù)個數(shù)不同以外,其功能是完全相同的,此時才使用函數(shù)重載,如果兩個函數(shù)的功能其實不同,那么不應(yīng)當使用重載,而應(yīng)當使用一個名字不同的函數(shù)。
好吧,那么對于情況 1 ,函數(shù)功能相同,但是參數(shù)類型不同,python 如何處理?答案是根本不需要處理,因為 python 可以接受任何類型的參數(shù),如果函數(shù)的功能相同,那么不同的參數(shù)類型在 python 中很可能是相同的代碼,沒有必要做成兩個不同函數(shù)。
那么對于情況 2 ,函數(shù)功能相同,但參數(shù)個數(shù)不同,python 如何處理?大家知道,答案就是缺省參數(shù)。對那些缺少的參數(shù)設(shè)定為缺省參數(shù)即可解決問題。因為你假設(shè)函數(shù)功能相同,那么那些缺少的參數(shù)終歸是需要用的。
好了,鑒于情況 1 跟 情況 2 都有了解決方案,python 自然就不需要函數(shù)重載了。
72 手寫一個判斷時間的裝飾器
import datetime class TimeException(Exception): def __init__(self, exception_info): super().__init__() self.info=exception_info def __str__(self): return self.info def timecheck(func): def wrapper(*args, **kwargs): if datetime.datetime.now().year==2019: func(*args, **kwargs) else: raise TimeException("函數(shù)已過時") return wrapper @timecheck def test(name): print("Hello {}, 2019 Happy".format(name)) if __name__=="__main__": test("backbp")
73 使用Python內(nèi)置的filter()方法來過濾?
list(filter(lambda x: x % 2==0, range(10)))
74 編寫函數(shù)的4個原則
1.函數(shù)設(shè)計要盡量短小
2.函數(shù)聲明要做到合理、簡單、易于使用
3.函數(shù)參數(shù)設(shè)計應(yīng)該考慮向下兼容
4.一個函數(shù)只做一件事情,盡量保證函數(shù)語句粒度的一致性
75 函數(shù)調(diào)用參數(shù)的傳遞方式是值傳遞還是引用傳遞?
Python的參數(shù)傳遞有:位置參數(shù)、默認參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)。
函數(shù)的傳值到底是值傳遞還是引用傳遞、要分情況:
不可變參數(shù)用值傳遞:像整數(shù)和字符串這樣的不可變對象,是通過拷貝進行傳遞的,因為你無論如何都不可能在原處改變不可變對象。
可變參數(shù)是引用傳遞:比如像列表,字典這樣的對象是通過引用傳遞、和C語言里面的用指針傳遞數(shù)組很相似,可變對象能在函數(shù)內(nèi)部改變。
76 如何在function里面設(shè)置一個全局變量
globals() # 返回包含當前作用余全局變量的字典。 global 變量 設(shè)置使用全局變量
77 對缺省參數(shù)的理解 ?
缺省參數(shù)指在調(diào)用函數(shù)的時候沒有傳入?yún)?shù)的情況下,調(diào)用默認的參數(shù),在調(diào)用函數(shù)的同時賦值時,所傳入的參數(shù)會替代默認參數(shù)。
*args是不定長參數(shù),它可以表示輸入?yún)?shù)是不確定的,可以是任意多個。
**kwargs是關(guān)鍵字參數(shù),賦值的時候是以鍵值對的方式,參數(shù)可以是任意多對在定義函數(shù)的時候
不確定會有多少參數(shù)會傳入時,就可以使用兩個參數(shù)
78 帶參數(shù)的裝飾器?
帶定長參數(shù)的裝飾器
def new_func(func): def wrappedfun(username, passwd): if username=='root' and passwd=='123456789': print('通過認證') print('開始執(zhí)行附加功能') return func() else: print('用戶名或密碼錯誤') return return wrappedfun @new_func def origin(): print('開始執(zhí)行函數(shù)') origin('root','123456789')
帶不定長參數(shù)的裝飾器
def new_func(func): def wrappedfun(*parts): if parts: counts=len(parts) print('本系統(tǒng)包含 ', end='') for part in parts: print(part, ' ',end='') print('等', counts, '部分') return func() else: print('用戶名或密碼錯誤') return func() return wrappedfun
79 為什么函數(shù)名字可以當做參數(shù)用?
Python中一切皆對象,函數(shù)名是函數(shù)在內(nèi)存中的空間,也是一個對象
80 Python中pass語句的作用是什么?
在編寫代碼時只寫框架思路,具體實現(xiàn)還未編寫就可以用pass進行占位,是程序不報錯,不會進行任何操作。
81 有這樣一段代碼,print c會輸出什么,為什么?
a=10 b=20 c=[a] a=15
答:10對于字符串,數(shù)字,傳遞是相應(yīng)的值
82 交換兩個變量的值?
a, b=b, a
83 map函數(shù)和reduce函數(shù)?
map(lambda x: x * x, [1, 2, 3, 4]) # 使用 lambda # [1, 4, 9, 16] reduce(lambda x, y: x * y, [1, 2, 3, 4]) # 相當于 ((1 * 2) * 3) * 4 # 24
84 回調(diào)函數(shù),如何通信的?
回調(diào)函數(shù)是把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),將整個函數(shù)當作一個對象,賦值給調(diào)用的函數(shù)。
85 Python主要的內(nèi)置數(shù)據(jù)類型都有哪些? print dir( ‘a(chǎn) ’) 的輸出?
內(nèi)建類型:布爾類型,數(shù)字,字符串,列表,元組,字典,集合
輸出字符串'a'的內(nèi)建方法
86 map(lambda x:xx,[y for y in range(3)])的輸出?
[0, 1, 4]
87 hasattr() getattr() setattr() 函數(shù)使用詳解?
hasattr(object,name)函數(shù):
判斷一個對象里面是否有name屬性或者name方法,返回bool值,有name屬性(方法)返回True,否則返回False。
class function_demo(object): name='demo' def run(self): return "hello function" functiondemo=function_demo() res=hasattr(functiondemo, "name") # 判斷對象是否有name屬性,True res=hasattr(functiondemo, "run") # 判斷對象是否有run方法,True res=hasattr(functiondemo, "age") # 判斷對象是否有age屬性,F(xiàn)alse print(res)
getattr(object, name[,default])函數(shù):
獲取對象object的屬性或者方法,如果存在則打印出來,如果不存在,打印默認值,默認值可選。注意:如果返回的是對象的方法,則打印結(jié)果是:方法的內(nèi)存地址,如果需要運行這個方法,可以在后面添加括號().
functiondemo=function_demo() getattr(functiondemo, "name")# 獲取name屬性,存在就打印出來 --- demo getattr(functiondemo, "run") # 獲取run 方法,存在打印出方法的內(nèi)存地址 getattr(functiondemo, "age") # 獲取不存在的屬性,報錯 getattr(functiondemo, "age", 18)# 獲取不存在的屬性,返回一個默認值
setattr(object, name, values)函數(shù):
給對象的屬性賦值,若屬性不存在,先創(chuàng)建再賦值
class function_demo(object): name="demo" def run(self): return "hello function" functiondemo=function_demo() res=hasattr(functiondemo, "age") # 判斷age屬性是否存在,F(xiàn)alse print(res) setattr(functiondemo, "age", 18) # 對age屬性進行賦值,無返回值 res1=hasattr(functiondemo, "age") # 再次判斷屬性是否存在,True
綜合使用
class function_demo(object): name="demo" def run(self): return "hello function" functiondemo=function_demo() res=hasattr(functiondemo, "addr") # 先判斷是否存在 if res: addr=getattr(functiondemo, "addr") print(addr) else: addr=getattr(functiondemo, "addr", setattr(functiondemo, "addr", "北京首都")) print(addr)
88 一句話解決階乘函數(shù)?
reduce(lambda x,y : x*y,range(1,n+1))
89 對設(shè)計模式的理解,簡述你了解的設(shè)計模式?
設(shè)計模式是經(jīng)過總結(jié),優(yōu)化的,對我們經(jīng)常會碰到的一些編程問題的可重用解決方案。一個設(shè)計模式并不像一個類或一個庫那樣能夠直接作用于我們的代碼,反之,設(shè)計模式更為高級,它是一種必須在特定情形下實現(xiàn)的一種方法模板。
常見的是工廠模式和單例模式
90 請手寫一個單例
#python2 class A(object): __instance=None def __new__(cls,*args,**kwargs): if cls.__instance is None: cls.__instance=objecet.__new__(cls) return cls.__instance else: return cls.__instance
91 單例模式的應(yīng)用場景有那些?
單例模式應(yīng)用的場景一般發(fā)現(xiàn)在以下條件下:
資源共享的情況下,避免由于資源操作時導(dǎo)致的性能或損耗等,如日志文件,應(yīng)用配置。
控制資源的情況下,方便資源之間的互相通信。如線程池等,1,網(wǎng)站的計數(shù)器 2,應(yīng)用配置 3.多線程池 4數(shù)據(jù)庫配置 數(shù)據(jù)庫連接池 5.應(yīng)用程序的日志應(yīng)用...
92 用一行代碼生成[1,4,9,16,25,36,49,64,81,100]
print([x*x for x in range(1, 11)])
93 對裝飾器的理解,并寫出一個計時器記錄方法執(zhí)行性能的裝飾器?
裝飾器本質(zhì)上是一個callable object ,它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數(shù)對象。
import time from functools import wraps def timeit(func): @wraps(func) def wrapper(*args, **kwargs): start=time.clock() ret=func(*args, **kwargs) end=time.clock() print('used:',end-start) return ret return wrapper @timeit def foo(): print('in foo()'foo())
94 解釋以下什么是閉包?
在函數(shù)內(nèi)部再定義一個函數(shù),并且這個函數(shù)用到了外邊函數(shù)的變量,那么將這個函數(shù)以及用到的一些變量稱之為閉包。
95 函數(shù)裝飾器有什么作用?
裝飾器本質(zhì)上是一個callable object,它可以在讓其他函數(shù)在不需要做任何代碼的變動的前提下增加額外的功能。裝飾器的返回值也是一個函數(shù)的對象,它經(jīng)常用于有切面需求的場景。比如:插入日志,性能測試,事務(wù)處理,緩存。權(quán)限的校驗等場景,有了裝飾器就可以抽離出大量的與函數(shù)功能本身無關(guān)的雷同代碼并發(fā)并繼續(xù)使用。
詳細參考:https://manjusaka.itscoder.com/2018/02/23/something-about-decorator/
96 生成器,迭代器的區(qū)別?
迭代器是遵循迭代協(xié)議的對象。用戶可以使用 iter() 以從任何序列得到迭代器(如 list, tuple, dictionary, set 等)。另一個方法則是創(chuàng)建一個另一種形式的迭代器 —— generator 。要獲取下一個元素,則使用成員函數(shù) next()(Python 2)或函數(shù) next() function (Python 3) 。當沒有元素時,則引發(fā) StopIteration 此例外。若要實現(xiàn)自己的迭代器,則只要實現(xiàn) next()(Python 2)或 __next__()( Python 3)
生成器(Generator),只是在需要返回數(shù)據(jù)的時候使用yield語句。每次next()被調(diào)用時,生成器會返回它脫離的位置(它記憶語句最后一次執(zhí)行的位置和所有的數(shù)據(jù)值)
區(qū)別: 生成器能做到迭代器能做的所有事,而且因為自動創(chuàng)建iter()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達式取代列表解析可以同時節(jié)省內(nèi)存。除了創(chuàng)建和保存程序狀態(tài)的自動方法,當發(fā)生器終結(jié)時,還會自動拋出StopIteration異常。
97 X是什么類型?
X=(i for i in range(10))
X是 generator類型
98 請用一行代碼 實現(xiàn)將1-N 的整數(shù)列表以3為單位分組
N=100 print ([[x for x in range(1,100)] [i:i+3] for i in range(0,100,3)])
99 Python中yield的用法?
yield就是保存當前程序執(zhí)行狀態(tài)。你用for循環(huán)的時候,每次取一個元素的時候就會計算一次。用yield的函數(shù)叫g(shù)enerator,和iterator一樣,它的好處是不用一次計算所有元素,而是用一次算一次,可以節(jié)省很多空間,generator每次計算需要上一次計算結(jié)果,所以用yield,否則一return,上次計算結(jié)果就沒了
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。