1. 程式人生 > >筆試題2

筆試題2

一、填空題(每空1分) 總分:108分 1.HTML作用是_____。CSS作用是_____。JS作用是_____。 html是通過標籤搭建頁面結構; css是通過樣式美化頁面; js是給頁面新增動態功能。

2.$(“span”).text()含義____。$(“span”).text(“span標籤”)含義____。$(“input”).val()含義____。 $(“span”).text()獲取span標籤的文字內容; $(“span”).text(“span標籤”)修改span標籤的文字內容為“span標籤”; $(“input”).val()獲取輸入框中輸入的值;

3.如果模組test.py是被其它模組匯入的,name__的值是

___,如果模組test.py被直接執行,name__的值是___。模組是什麼_____。 test;_main_;模組就是.py檔案,一個.py檔案就稱為一個模組;

4.Django建立專案命令_____,建立application命令_____,執行專案命令_____。 django-admin startproject test python manage.py startapp test python manage.py runserver

5.innerText()和innerHTML()的區別是_____。$(“span”).clssList.add(‘s’)的含義_____。 innerText()是將所有字串進行原樣展示的函式; innerHTML()會將標籤字串轉化為html標籤並載入到頁面中; $(“span”).clssList.add(‘s’)給span標籤追加一個類名s,不會覆蓋原有類名;

6.包和資料夾的區別是_____。包的作用是_____。 包中含有__init__.py檔案,而資料夾中沒有__init__.py檔案; 包的作用主要是管理模組,方便模組之間的引入;

7.Django模板語言中,{{ }}的含義_____。{% %}的含義_____。{# #}的含義_____。 {{}}用來載入變數的值; {%%}是用來載入Django內建標籤; {##}是註釋符號,用來添加註釋;

8.Django模板語言內建的過濾器___、。內建的標籤___、。 過濾器:sale, upper, lower, first, lase, cut 標籤:for, if, block, autoescape, load

9.Django執行異常中,TemplateDoesNotFound表示____,Page not Found表示____。 TemplateDoesNotFound:模板檔案.html沒找到。 Page not Found:頁面沒找到,url錯誤。

10.onmousedown含義____,onclick含義____,$(document).ready()含義_____。 onmousedown:滑鼠被按下時的事件; onclick:滑鼠單擊時的事件; $(document).ready():等document文件(頁面標籤)全部載入完以後,再執行一些操作。

11.IndentationError異常原因____,寫檔案模式”a”含義____,”wb”含義____。 IndentationError:行縮排錯誤; a:追加內容,不覆蓋原有內容; wb:寫入二進位制資料;

二、判斷題(每題1分) 1.jQuery是一個第三方框架,主要是為了讓js語法更加簡潔。 錯,不是框架,是庫

2.js中的document指的是文件物件。 對

3.帶有js程式碼的網頁不一定是一個動態網頁,而沒有js程式碼的網頁一定是靜態網頁。 對

4.Syntax異常表示語法錯誤,IndexError表示索引錯誤,TypeError表示值錯誤。 錯,TypeError表示型別錯誤。

5.Django使用的html語法和HTML語言中的html語法是一致的。 錯,Django中自帶一套模板語法,{{}} {%%}等,跟html語言中的語法是有區別的。

6.Scrapy和Requests是爬蟲應用很廣的框架,但是Scrapy是非同步的,而requests是同步的。 錯,Requests是庫,不是框架。

7.狀態碼200表示GET請求成功、500表示服務端異常、404表示客戶端請求異常。 對

8.埠是對映不同的服務的,80是http服務,6379是mongodb服務、443是https服務。 錯,6379是Redis服務。

9.在Django啟動後,請求url,Django控制檯沒有任何輸出,說明url地址拼錯了。 錯,說明Django服務同時執行的視窗太多了。

10.$(‘div.span’).find()是查詢所有後代元素、children()是查詢直接子元素。 對

三、簡答題(每題4分) 1.寫出Django配置url路由傳遞引數有幾種寫法,並概述有什麼不同? a>path(‘params/<username>/<password>/’); 通過路徑傳參,引數名稱固定; b>re_path(r’^params/(\d+)/(\w+)/$’); 通過正則表示式路徑傳參,引數名稱自定義; c>re_path(r'^params/(?P<id>\d+)/(?P<username>\w+)/$'); 通過正則表示式路徑傳參,引數名稱固定; d>path(‘params/’); 通過url拼接引數,引數名稱不固定;

2.描述Django載入templates模板檔案時的特點。 a>首先從根目錄下的templates中查詢是否存在模板檔案; b>如果根目錄下沒有找到,再從app下的templates中查詢模板檔案; c>如果app下也沒有查詢到,則丟擲異常;

3.urls.py檔案和views.py檔案的作用是什麼。描述urls.py和views.py之間的關係。 urls.py是定義網址/路由的,供前端進行訪問; views.py是定義檢視函式並給前端訪問返回響應的; 兩者之間是繫結/對映關係,當前端訪問url路由時,Django會找到url路由對映的檢視函式,並呼叫這個檢視函式,最終給前端返回響應資料。

4.描述Django專案的主要組成部分。 a>和專案根目錄重名的資料夾,主要包含了 settings.py,urls.py等主要檔案; b>專案下的app應用資料夾,主要包含了 models.pyapp.py,views.py等主要檔案; c>專案根目錄下的manage.py檔案;

5.cookie和session的區別和作用。 區別: a>cookie儲存在客戶端 session儲存在服務端 b>資料儲存大小 cookie只適合儲存一些小的資料,例如使用者登入狀態、使用者瀏覽記錄…session儲存在伺服器,理論上來說大小沒有限制 c>安全性 session安全性要比cookie安全 作用: a>首次訪問網站得時候,伺服器會將session中儲存的資料,通過Set-Cookie欄位向客戶端返回一些cookie資訊; b>客戶端在接收到伺服器響應之後,會解析響應頭中得Set-Cookie欄位,將資料快取在本地; c>客戶端再次訪問伺服器得時候,會在請求頭中攜帶這些cookie資訊,用於表明客戶端和伺服器之間得連線狀態;

6.js查詢元素的幾種方法是什麼?jQuery中查詢元素的幾種方法是什麼?(每問至少四個) js查詢元素: document.getElementById(); document.getElementsByClassName(); document.getElementsByName(); document.getElementsByTagName(); jquery查詢元素: $().find(); $().parent(); $().children(); $().next(); $().parents(); $().findall();

7.描述scrapy的爬蟲去重原理? a>將request的請求url、請求方法、請求引數進行hash加密; b>將生成的加密資訊存放在set集合中,如果set中存在了這個資訊,就無法再新增到set中,只能新增不同的加密資訊到set中; c>如果這個加密資訊成功的新增到了set中,說明這個請求之前沒有操作過,就將這個請求物件request放入佇列中,等待著排程器排程;

8.概述常見的爬蟲去重策略? a>將url加密儲存到資料庫中,每次獲取新的url後,都和資料庫中的url進行對比,如果已經存在就跳過這個url的請求; b>利用set()集合進行去重; c>布隆去重;

9.pyspider框架中,@every、@age的作用是什麼?itag的作用是什麼? @every是設定爬蟲定時啟動的時間; @age是設定url去重的時間週期,在這個時間範圍內,重複的url是不會被重新請求的。 itag的作用有兩個: a>用於重新執行專案的時候,需要修改itag的值,如果itag的值相同,專案不會被重啟;在crawl_config中配置。 b>用於做增量式爬蟲,在sele.crawl()中設定,以這個itag的值作為這一個url是否需要重新爬取的標記,如果下一次又重獲獲得了相同的url,檢視itag的值是否變化,如果沒有變化,就將這個url過濾掉,認為這個url的內容沒有發生變化。如果itag的值發生了變化,就重新爬取這個url的內容。

10.概述Django專案和App應用之間的關係?為什麼要建立多個App應用?為什麼要在每一個App內各建立一個urls.py檔案? 第一問: 一個Django專案可以管理多個App應用; 第二問: 將一個專案中的功能按照模組來進行劃分,每一個模組對應一個App應用,這樣後期除錯和維護程式碼更加方便,專案結構和專案整體的邏輯關係會更加清晰。 第三問: 每一個app都有自己的url路由系統,這樣做可以防止將所有的url都放在同一個urls.py中造成的結構混亂,內容過多等問題,除錯和維護起來更加方便。

11.概述前端和後臺和伺服器三者之間的關係。 前端是面向使用者的,使用者通常會通過前端的瀏覽器訪問url地址來獲取一些資料資訊,而後臺則是用來提供url地址供使用者使用,然後通過將使用者需要的資料儲存在響應中返回給瀏覽器,最終將資料展示在頁面中。而伺服器則是給後臺專案的執行提供環境和資料庫支援。

12.Django模板繼承的優勢?extends標籤和block標籤的作用是什麼? 優勢:通過將所有頁面或者大部分頁面中重複的一些標籤內容,提取出來儲存成一個或多個單獨的html檔案稱為父模板,然後讓其它的子模版繼承這個公共的父模板,可以減少子模版中重複的程式碼,這樣程式碼更加精簡,並且子模版還可以在父模板的基礎上新增自己的內容。 extends:在子模版中使用,表明這個子模版的繼承關係是哪一個父模板; block:子模版可以重寫這個塊,用於新增自己的內容; 13.中action、method什麼含義?表單資料的含義? action表示請求的url地址; method表示請求方法; 表單資料是指在標籤中的標籤裡填寫的文字內容,一般用於傳送請求的時候作為引數使用。

14.$.ajax()請求中,url/type/data/dataType/error/success引數的含義? url表示請求地址。 type表示請求型別,比如GET還是POST。 data表示請求攜帶的引數。 dataType表示伺服器返回的資料型別。 error表示請求失敗時要執行的回撥函式。 success表示請求成功時要執行的回撥函式。

四、程式設計題(每題3分)(要求使用列表推導式,不能使用for迴圈。)

  1. 自定義Django過濾器將[‘html’,‘css’,‘js’]首字母全部大寫,並從a-z的升序排列。結果:[‘Css’,…] list = [‘html’, ‘css’, ‘js’] list.sort() list = [data[0].upper() + data[1:] for data in list] print(list)

2.對列表[1,2,1,2,3]去重,刪除重複元素,得到新列表[1,2,3]。要求使用列表推導式。 l = [1,2,1,2,3] print([res for res in set(l)])

3.列表[1,2,3], 先使用map()和lambda函式得到新列表[1,4,9],並取出新列表中大於3的數字。 li = [1,2,3] new_li = map(lambda x:x**2, li) print([res for res in new_li if res > 3])

一、填空題(每題1分,共19分) 1.os.path.exists()含義___.os.mkdir()含義___.os.chdir()含義___.os.path.pardri含義___. 判斷檔案是否存在; 建立資料夾; 切換工作目錄(切換資料夾); 獲取父級目錄;

2.for x in range(1,11,2)含義___.d={‘a’:’1’, ‘b’:’2’}進行遍歷,同時得到鍵和值的寫法___. 只在x的值為奇數的時候執行迴圈體內容; for key, value in d.items():

3.json.dumps()含義___.json.loads()含義___.形參在哪設定___.實參在哪設定___. dumps: 將字典轉化成json字串; loads: 將json字串轉化成字典 形參在宣告函式時設定; 實參在呼叫函式時設定;

4.js中宣告函式的關鍵字___.document物件含義___.$(‘#p’).attr(‘class’)含義___. function; 表示html文件樹物件; 獲取id=”p”的標籤的class屬性值;

5.說含義,$(‘#p’).attr(‘name’,’123’)___.$(‘#p’).remove()___.$(‘#p’).show()_.$(‘#p’).after(). attr(): 獲取id=”p”的標籤name屬性的值,如果不存在name屬性則新增name屬性,且值為123; remove():刪除id=”p”的標籤; show(): 顯示id=”p”的標籤; after(): 在id=”p”的標籤後新增新的標籤;

6.類屬性在哪宣告___.物件屬性在哪宣告___. 類屬性在類中且位於函式外宣告的屬性; 物件屬性是在類中的__init__()函式中宣告的屬性;

二、判斷題(每題1分,共6分) 1.break關鍵字不一定非得用在for或者while迴圈中。(錯,只能在for和while迴圈中使用)

2.python支援多繼承。(對)

3.父類可以呼叫子類的屬性和方法,子類也可以呼叫父類的屬性和方法。(錯,子類可以呼叫父類的屬性和方法,但是父類不能呼叫子類的屬性和方法。)

4.makemigrations是收集資料,migrate是同步資料。(對) 5.phantomjs是用來載入js程式碼的工具,又稱為無頭瀏覽器。(對)

6.color: red; 樣式是用來調整標籤的背景顏色的。(錯,設定字型顏色的屬性)

三、簡答題(每題3分,共63分) 1.函式function eat(){}和(function eat(){})()的區別是什麼。 function eat(){}時普通函式,必須手動呼叫; (function eat(){})()是自動呼叫的函式;

2.request.GET[‘name’]和request.GET.get(‘name’, ‘1’)的區別是什麼。 request.GET[‘name’]:獲取不到name屬性會丟擲異常。 request.GET.get(‘name’, ‘1’):獲取不到name屬性就是用預設值1。

3.請求頭或者響應頭中Set-cookie和Cookie欄位的作用是什麼。 Set-cookie是服務端向客戶端傳遞資料;儲存在響應頭中。 Cookie是客戶端向服務端傳遞資料;儲存在請求頭中。

4.html中submit事件和click事件的區別是什麼。 submit事件一般用於form表單提交資料時使用,使用它會自動向action指定的url地址傳送請求,而其它事件則不會自動傳送請求; click事件一般用於非表單型別的點選操作,可以給任意一個標籤繫結click事件,在click事件繫結的函式中設定具體的操作;

5.簡述ajax請求和一般的GET請求的區別。 ajax請求一般用於頁面中區域性資料發生改變時使用,它不會讓整個頁面重新載入,只會重新載入部分資料,可以提高頁面的渲染時間; get請求則會重新渲染整個頁面,將頁面中的所有資料重新載入一遍,頁面渲染效率沒有ajax請求快;

6.關鍵字return和yield的在函式中的相同點和不同點分別是什麼。 相同點:都可以在函式內部返回值。 不同點: a>在一個函式中,關鍵字return之後寫的程式碼不會再執行,而關鍵字yield之後寫的程式碼仍然可以執行; b>函式內部有return說明函式有返回值;而函式內部有yield,那麼這個函式就是一個生成器; [x for x in range(1,5)]—>[1,2,3,4] 列表生成式 (x for x in range(1,5))----><genator object> -->yield 1 列表生成器 7.scrapy各部分之間的資料流向是如何互動的。 1>引擎將起始url構造成Request交給排程器; 2>排程器對Request物件生成指紋資訊,根據是否去重來決定是否將Request放入佇列中; 3>引擎從排程器得佇列中不斷得獲取下一個Request請求; 4>引擎將Reques請求交給下載器Downloader進行下載,期間會經過下載器中介軟體process_request得處理; 5>下載器下載完成以後,經過process_response將Response物件返回給引擎; 6>引擎將Response物件交給爬蟲Spider進行解析,提取資料,期間經過爬蟲中介軟體; 爬蟲Spider將提取得結果傳遞給引擎,引擎將item交給管道,將Request物件交給排程器繼續排程;

8.正則表示式match()和search()函式的區別是什麼。 Match()只匹配一個結果,並且只有正確結果在目標字串得開頭位置才能匹配到,如果不在開頭位置,無法匹配。 Search()只匹配一個結果,但是正確結果可以在目標字串得任意位置。

9.(.*?)和.*?的區別是什麼。.*和.*?的區別是什麼(不能只說貪婪或非貪婪,否則給半分)。 (.*?)表示一個要提取的分組資訊,後續可以通過group()函式提取資料; .*?表示省略後續字元; .*: 貪婪匹配,在能夠匹配正確結果得前提下,儘可能多得匹配字元。 .*?: 非貪婪匹配,在能夠匹配正確結果得前提下,儘可能少得匹配字元。

10.Django中使用自定義表單的步驟。自定義表單中CharField()和CharInput()的區別是什麼。 步驟: a>在app中新建一個forms.py檔案,並在該檔案中定義一個類; b>在類中宣告自己需要的欄位,並設定欄位型別; c>在views.py中,建立該類的物件,並將該物件渲染到html模板中; CharField()是用於指定一個欄位最終獲取的資料型別; CharInput()是決定表單輸入框中能夠輸入什麼資料,不能輸入什麼資料;

11.同一個檢視函式對應了兩個GET請求,如何區分這兩個GET請求。 a>如果一個請求沒有攜帶引數,另一個請求攜帶了引數,那麼可以在檢視函式中判斷此次請求是否攜帶引數來區分兩個請求; b>如果兩個請求都攜帶引數,那麼可以通過判斷兩個引數的不同來區分兩個請求;

12.模板中使用url的name=”add”值反向獲取url,那麼不傳引數和傳遞引數分別如何實現。 不傳參:{% url ‘add’ %} 傳參:{% url ‘add’ 10 20 %}

13.re_path(‘^add/(?P<a>\d+)/(?P<b>\d+)/?’)的含義是什麼?^是什麼意思?$是什麼意思。 表示url路由中可以傳遞引數,並且指定了獲取的值分別要賦值給形參a和b,所以檢視函式中必須宣告兩個形參a和b; ^表示路由以add開頭; $表示路由以/結尾;

14.STATICFILES_DIRS=[os.path.join()]的作用。STATIC_URL=”/static/”的作用。 STATICFILES_DIRS=[os.path.join()]設定根目錄下static資料夾的搜尋路徑; STATIC_URL=”/static/”設定app下static資料夾的搜尋路徑;

15.簡述csrf_token防跨站請求偽造的防護原理。 django模板中的form表單如果傳送POST請求,需要新增{% csrf_token %}標籤,當程式啟動時,在渲染Html頁面時,django會將這個標籤渲染成一個隱藏在網頁原始碼中的input標籤,這個標籤的值是一個隨機字串,當傳送POST請求時,瀏覽器會預設將這個隱藏input標籤的值攜帶到請求中,經過django後臺的認證,如果上傳的隨機字串和django提供的隨機字串一致,就說明請求是合法的。如果上傳的隨機字串和django提供的隨機字串不一致,那麼此次請求就是非法的,會出現403錯誤。

16.標籤<input name=”age” class=”age” id=”age” value=”age”>中name的作用是什麼。value的作用是什麼。 name的值是用於views.py中的檢視函式用於獲取input表單中輸入的值; value中的內容是會直接顯示在input標籤中的;

17.form表單中is_valid()函式的作用是什麼。該函式和cleaned_data字典的關係是什麼。 is_valid()函式是用於驗證自定義Form表單中的資料是否合法; 關係:只有is_valid()的返回值是True時,cleaned_data這個字典才會被建立,而且將form表單提交的資料存放在cleaned_data這個字典中,如果is_valided()返回值是False,那麼這個字典cleaned_data是不存在的;

18.ORM的特點是什麼。相比原生的SQL語句有什麼優勢。 ORM的特點是將資料庫、表、欄位之間的關係轉化成了類、物件、屬性的關係,對於資料庫中表和欄位的操作都是通過物件和屬性來完成的。 優勢: a>SQL語句很難記牢,但是類和物件操作資料庫表使用和掌握起來就非常容易; b>使用類和物件來操作資料庫可以有效防止SQL注入的問題;

19.AutoField()是什麼欄位。什麼場景下使用。models.CharField(null=xxx)中null的作用。 AutoField()是一個自動遞增的整數型別的欄位,一般該欄位會作為表的主鍵使用; null是針對資料庫而言的,表示該欄位在資料庫中可以儲存空值;

20.說出response.xpath(“//div[contains(@class, ‘red’)]/a/@href”)的含義。 獲取類名包含red的div標籤下的直接子標籤a的href屬性的值;

21.列舉至少五個請求頭中攜帶的欄位,並說明每一個欄位的含義。 User-Agent: 瀏覽器標識; Host:瀏覽器請求的主機地址; Cookie:瀏覽器請求攜帶的Cookie資訊; Referer:表示這一次請求是從哪一個地址點選跳轉過來的; Accept:表示瀏覽器希望接收的資料型別; Accept-Lanague:表示瀏覽器希望接收的語言型別;

四、程式設計題(每題3分,共12分) 1.使用map和lambda函式將[1,2,3]轉化成[‘1’,’2’,’3’]; map(lambda x: str(x), [1,2,3]) 2.使用reduce和lambda函式將[1,2,3]轉化成’123’; reduce(lambda x, y: str(x) + str(y), [1,2,3]) 3.寫一個html的label標籤和input標籤,要求能夠實現點選label游標定位到input。並設定input標籤預設展示的字元是”請輸入內容”; <label for=”name”></label> <input id=”name” placeholder=”請求輸入內容”> 游標定位要求for的值和id值保持一致就行了,不是一定要寫name這個值。

4.現有列表list1=[“張三”, “李三”, “張四”, “張五”, “李四”, “王三”, “王四”, “王五”],請將列表1中所有以’張’開頭的名字放到list2中(使用列表推導式)。 [x for x in list1 if x[0] == “張”]