您好,登錄后才能下訂單哦!
今天小編給大家分享一下Python常問的面試題有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
當我們不知道向函數傳遞多少參數時,比如我們向傳遞一個列表或元組,我們就使用*args:
def func(*args): for i in args: print(i) func(3,2,1,4,7) 3 2 1 4 7
在我們不知道該傳遞多少關鍵字參數時,使用**kwargs來收集關鍵字參數:
def func(**kwargs): for i in kwargs: print(i,kwargs[i]) func(a=1,b=2,c=7) a.1 b.2 c.7
使用命令os.remove(filename)或os.unlink(filename)
您可以通過以下方法訪問C中用Python編寫的模塊:
Module = = PyImport_ImportModule(“<modulename>”)
它是一個Floor Divisionoperator,用于分割兩個操作數,結果為商,只顯示小數點前的數字。
例如,10 // 5 = 2和10.0 // 5.0 = 2.0。
字符串中的前導空格就是出現在字符串中第一個非空格字符前的空格。
我們使用方法Istrip()可以將它從字符串中移除。
’ Data123 '.lstrip()
結果:
'Data123 ’
最初的字符串當中既有前導字符也有后綴字符,調用Istrip()去除了前導空格,如果我們想去除后綴空格,可以使用rstrip()方法。
'Data123 '.rstrip() 'Data123'
a,b = 0, 1 while b<100: print (b) a, b = b, a+b
如果字符串只含有數字字符,可以用函數int()將其轉換為整數。
int(‘22’)
我們檢查一下變量類型:
type('22') <class'str'> type(int('22')) <class'int'>
要想生成隨機數,我們可以從random模塊中導入函數random()。
from random import random random() 0.013501571090371978
我們還可以使用函數randint(),它會用兩個參數表示一個區間,返回該區間內的一個隨機整數。
from random import randint randint(2,7) 4
最簡單的方法就是用capitalize()方法。
'daxie'.capitalize() 'Daxie'
對于這個問題,我們可以使用isalnum()方法。
'DATA123'.isalnum() True 'DATA123!'.isalnum() False
我們還可以用其它一些方法:
'123'.isdigit()#檢測字符串是否只由數字組成 True '123'.isnumeric()#只針對unicode對象 True 'data'.islower()#是否都為小寫 True 'Data'.isupper()#是否都為大寫 False
Python中的連接就是將兩個序列連在一起,我們使用+運算符完成:
'22'+'33' ‘2233' [1,2,3]+[4,5,6] [1, 2,3, 4, 5, 6] (2,3)+(4) TypeError Traceback (most recent call last) <ipython-input-7-69a1660f2fc5> in <module> ----> 1 (2,3)+(4) TypeError: can only concatenate tuple (not "int") to tuple
這里運行出錯,因為(4)被看作是一個整數,修改一下再重新運行:
(2,3)+(4,) (2, 3,4)
在調用一個函數的過程中,直接或間接地調用了函數本身這個就叫遞歸。但為了避免出現死循環,必須要有一個結束條件,舉個例子:
def facto(n): if n==1: return 1 return n*facto(n-1) facto(5) 120
生成器會生成一系列的值用于迭代,這樣看它又是一種可迭代對象。
它是在for循環的過程中不斷計算出下一個元素,并在適當的條件結束for循環。
我們定義一個能逐個“yield”值的函數,然后用一個for循環來迭代它。
def squares(n): i=1 while(i<=n): yield i**2 i+=1 for i in squares(5): print(i) 1 4 9 16 25
迭代器是訪問集合元素的一種方式。
迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。
迭代器只能往前不會后退。我們使用inter()函數創建迭代器。
odds=iter([1,2,3,4,5]) #每次想獲取一個對象時,我們就調用next()函數 next (odds) 1 next (odds) 2 next (odds) 3 next (odds) 4 next (odds) 5
1)在使用生成器時,我們創建一個函數;在使用迭代器時,我們使用內置函數iter()和next();
2)在生成器中,我們使用關鍵字‘yield’來每次生成/返回一個對象;
3)生成器中有多少‘yield’語句,你可以自定義;
4)每次‘yield’暫停循環時,生成器會保存本地變量的狀態。而迭代器并不會使用局部變量,它只需要一個可迭代對象進行迭代;
5)使用類可以實現你自己的迭代器,但無法實現生成器;
6)生成器運行速度快,語法簡潔,更簡單;
7)迭代器更能節約內存。
Python新手可能對這個函數不是很熟悉,zip()可以返回元組的迭代器。
list(zip([‘a’,‘b’,‘c’],[1,2,3]))
[(‘a’,1), (‘b’, 2), (‘c’, 3)]
在這里zip()函數對兩個列表中的數據項進行了配對,并用它們創建了元組。
我們可以使用函數/方法getcwd(),從模塊os中將其導入。
import os
os.getcwd()
‘C:\Users\37410\Desktop\代碼’
這個也比較簡單,在我們想計算長度的字符串上調用函數len()即可。
len(‘Data 123’)
8
從列表中刪除并返回最后一個對象或obj。
list.pop(obj = list [-1])
有時,當我們想要遍歷列表時,一些方法會派上用場。
1)filter()
過濾器允許我們根據條件邏輯過濾一些值。
list(filter(lambda x:x> 5,range(8))) [6,7] 2)map()
Map將函數應用于iterable中的每個元素。
list(map(lambda x:x ** 2,range(8))) [0,1,4,9,16,25,36,49] 3)reduce()
在我們達到單個值之前,Reduce會反復減少序列順序。
from functools import reduce reduce(lambda x,y:xy,[1,2,3,4,5]) -13
def list_sum(num_List):如果len(num_List)== 1: return num_List [0] else: return num_List [0] + list_sum(num_List [1:]) print(list_sum([3,4,5,6,11])) 29
import random def random_line(fname): lines = open(fname).read().splitlines() return random.choice(lines) print(random_line('test.txt'))
def file_lengthy(fname): open(fname)as f: for i,l in enumerate(f): pass return i + 1 print(“file of lines:”,file_lengthy(“test.txt”))
import os os.chdir('C:\Users\lifei\Desktop') with open('Today.txt') as today: count=0 for i in today.read(): if i.isupper(): count+=1 print(count)
以下代碼可用于在Python中對列表進行排序:
list = ["1", "4", "0", "6", "9"] list = [int(i) for i in list] list.sort() print (list) Django有關
對于Django框架遵循MVC設計,并且有一個專有名詞:MVT,
M全拼為Model,與MVC中的M功能相同,負責數據處理,內嵌了ORM框架;
V全拼為View,與MVC中的C功能相同,接收HttpRequest,業務處理,返回HttpResponse;
T全拼為Template,與MVC中的V功能相同,負責封裝構造要返回的html,內嵌了模板引擎
Flask是一個“微框架”,主要用于具有更簡單要求的小型應用程序。
Pyramid適用于大型應用程序,具有靈活性,允許開發人員為他們的項目使用數據庫,URL結構,模板樣式等正確的工具。
Django也可以像Pyramid一樣用于更大的應用程序。它包括一個ORM。
Django架構
開發人員提供模型,視圖和模板,然后將其映射到URL,Django可以為用戶提供服務。
Django使用SQLite作為默認數據庫,它將數據作為單個文件存儲在文件系統中。
如過你有數據庫服務器-PostgreSQL,MySQL,Oracle,MSSQL-并且想要使用它而不是SQLite,那么使用數據庫的管理工具為你的Django項目創建一個新的數據庫。
無論哪種方式,在您的(空)數據庫到位的情況下,剩下的就是告訴Django如何使用它。
這是項目的settings.py文件的來源。
我們將以下代碼行添加到setting.py文件中:
DATABASES ={‘default’: {‘ENGINE’: ‘django.db.backends.sqlite3’, ‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’),
這是我們在Django中使用write一個視圖的方法:
from django.http import HttpResponse import datetime def Current_datetime(request): now =datetime.datetime.now() html ="<html><body>It is now %s</body></html>"%now return HttpResponse(html)
返回當前日期和時間,作為HTML文檔。
模板是一個簡單的文本文件。
它可以創建任何基于文本的格式,如XML,CSV,HTML等。
模板包含在評估模板時替換為值的變量和控制模板邏輯的標記(%tag%)。
Django提供的會話允許您基于每個站點訪問者存儲和檢索數據。
Django通過在客戶端放置會話ID cookie并在服務器端存儲所有相關數據來抽象發送和接收cookie的過程。
所以數據本身并不存儲在客戶端。
從安全角度來看,這很好。
在Django中,有三種可能的繼承樣式:
抽象基類:當你只希望父類包含而你不想為每個子模型鍵入的信息時使用;
多表繼承:對現有模型進行子類化,并且需要每個模型都有自己的數據庫表。
代理模型:只想修改模型的Python級別行為,而無需更改模型的字段。
數據分析
map函數執行作為第一個參數給出的函數,該函數作為第二個參數給出的iterable的所有元素。
如果給定的函數接受多于1個參數,則給出了許多迭代。
我們可以使用下面的代碼在NumPy數組中獲得N個最大值的索引:
importnumpy as np arr =np.array([1, 3, 2, 4, 5]) print(arr.argsort()[-3:][::-1]) 4 3 1
Q86.如何用Python/ NumPy計算百分位數?
importnumpy as np a =np.array([1,2,3,4,5] p =np.percentile(a, 50) #Returns 50th percentile, e.g. median print(p) 3
1)Python的列表是高效的通用容器。
它們支持(相當)有效的插入,刪除,追加和連接,Python的列表推導使它們易于構造和操作。
2)有一定的局限性
它們不支持元素化加法和乘法等“向量化”操作,可以包含不同類型的對象這一事實意味著Python必須存儲每個元素的類型信息,并且必須在操作時執行類型調度代碼在每個元素上。
3)NumPy不僅效率更高,也更方便
你可以獲得大量的矢量和矩陣運算,這有時可以避免不必要的工作。
4)NumPy數組更快
你可以使用NumPy,FFT,卷積,快速搜索,基本統計,線性代數,直方圖等內置。
Python中的裝飾器用于修改或注入函數或類中的代碼。
使用裝飾器,您可以包裝類或函數方法調用,以便在執行原始代碼之前或之后執行一段代碼。
裝飾器可用于檢查權限,修改或跟蹤傳遞給方法的參數,將調用記錄到特定方法等
1)在理想的世界中,NumPy只包含數組數據類型和最基本的操作:索引,排序,重新整形,基本元素函數等。
2)所有數字代碼都將駐留在SciPy中。然而,NumPy的一個重要目標是兼容性,因此NumPy試圖保留其前任任何一個支持的所有功能。
3)因此,NumPy包含一些線性代數函數,即使它們更恰當地屬于SciPy。無論如何,SciPy包含更多全功能的線性代數模塊版本,以及許多其他數值算法。
4)如果你使用python進行科學計算,你應該安裝NumPy和SciPy。大多數新功能屬于SciPy而非NumPy。
與2D繪圖一樣,3D圖形超出了NumPy和SciPy的范圍,但就像2D情況一樣,存在與NumPy集成的包。
Matplotlib在mplot3d子包中提供基本的3D繪圖,而Mayavi使用功能強大的VTK引擎提供各種高質量的3D可視化功能。
爬蟲和scary框架
scrapy是一個Python爬蟲框架,爬取效率極高,具有高度定制性,但是不支持分布式。
而scrapy-redis一套基于redis數據庫、運行在scrapy框架之上的組件,可以讓scrapy支持分布式策略,Slaver端共享Master端redis數據庫里的item隊列、請求隊列和請求指紋集合。
因為redis支持主從同步,而且數據都是緩存在內存中的,所以基于redis的分布式爬蟲,對請求和數據的高頻讀取效率非常高。
Python自帶:urllib,urllib2
第 三 方:requests
框 架:Scrapy
urllib和urllib2模塊都做與請求URL相關的操作,但他們提供不同的功能。
urllib2.:urllib2.urlopen可以接受一個Request對象或者url,(在接受Request對象時候,并以此可以來設置一個URL 的headers),urllib.urlopen只接收一個url
urllib 有urlencode,urllib2沒有,因此總是urllib,urllib2常會一起使用的原因
scrapy是封裝起來的框架,他包含了下載器,解析器,日志及異常處理,基于多線程,。
twisted的方式處理,對于固定單個網站的爬取開發,有優勢;但是對于多網站爬取 100個網站,并發及分布式處理方面,不夠靈活,不便調整與括展。
request 是一個HTTP庫, 它只是用來,進行請求,對于HTTP請求,他是一個強大的庫,下載,解析全部自己處理,靈活性更高,高并發與分布式部署也非常靈活,對于功能可以更好實現。
主要 MyISAM 與 InnoDB 兩個引擎,其主要區別如下:
1)InnoDB 支持事務,MyISAM 不支持,這一點是非常之重要。事務是一種高
級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM就不可以了;
2)MyISAM 適合查詢以及插入為主的應用,InnoDB 適合頻繁修改以及涉及到安全性較高的應用;
3)InnoDB 支持外鍵,MyISAM 不支持;
4)MyISAM 是默認引擎,InnoDB 需要指定;
5)InnoDB 不支持 FULLTEXT 類型的索引;
6)InnoDB 中不保存表的行數,如 select count(*) from table 時,InnoDB;
需要掃描一遍整個表來計算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數即可。
注意的是,當 count(*)語句包含 where 條件時 MyISAM 也需要掃描整個表;
7)對于自增長的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM表中可以和其他字段一起建立聯合索引;
8)清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會重建表;
9)InnoDB 支持行鎖(某些情況下還是鎖整表,如 update table set a=1 whereuser like ‘%lee%’
從start_urls里獲取第一批url并發送請求,請求由引擎交給調度器入請求隊列,獲取完畢后,
調度器將請求隊列里的請求交給下載器去獲取請求對應的響應資源,并將響應交給自己編寫的解析方法做提取處理:
如果提取出需要的數據,則交給管道文件處理;
2)如果提取出url,則繼續執行之前的步驟(發送url請求,并由引擎將請求交給調度器入隊列…),直到請求隊列里沒有請求,程序結束。
將多個表聯合起來進行查詢,主要有內連接、左連接、右連接、全連接(外連接)
IO密集型代碼(文件處理、網絡爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,造成不必要的時間浪費,
而開啟多線程能在線程A等待時,自動切換到線程B,可以不浪費CPU的資源,從而能提升程序執行效率)。
在實際的數據采集過程中,既考慮網速和響應的問題,也需要考慮自身機器的硬件情況來設置多進程或多線程。
1)優化索引、SQL 語句、分析慢查詢;
2)優化硬件;采用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等;
3)采用MySQL 內部自帶的表分區技術,把數據分層不同的文件,能夠提高磁盤的讀取效率;
4)選擇合適的表引擎,參數上的優化;
5)進行架構級別的緩存,靜態化和分布式;
6)采用更快的存儲方式,例如 NoSQL存儲經常訪問的數據
1)ip
2)帶寬
3)cpu
4)io
1)scrapy自帶
2)付費接口
1)通過Headers反爬蟲從用戶請求的Headers反爬蟲是最常見的反爬蟲策略。
可以直接在爬蟲中添加Headers,將瀏覽器的User-Agent復制到爬蟲的Headers中;或者將Referer值修改為目標網站域名。
2)基于用戶行為反爬蟲
通過檢測用戶行為,例如同一IP短時間內多次訪問同一頁面,或者同一賬戶短時間內多次進行相同操作。
大多數網站都是前一種情況,對于這種情況,使用IP代理就可以解決。
可以專門寫一個爬蟲,爬取網上公開的代理ip,檢測后全部保存起來。
有了大量代理ip后可以每請求幾次更換一個ip,這在requests或者urllib2中很容易做到,這樣就能很容易的繞過第一種反爬蟲。
對于第二種情況,可以在每次請求后隨機間隔幾秒再進行下一次請求。
有些有邏輯漏洞的網站,可以通過請求幾次,退出登錄,重新登錄,繼續請求來繞過同一賬號短時間內不能多次進行相同請求的限制。
3)動態頁面的反爬蟲
首先用Fiddler對網絡請求進行分析,如果能夠找到ajax請求,也能分析出具體的參數和響應的具體含義,我們就能采用上面的方法。
直接利用requests或者urllib2模擬ajax請求,對響應的json進行分析得到需要的數據。
但是有些網站把ajax請求的所有參數全部加密了,沒辦法構造自己所需要的數據的請求。
這種情況下就用selenium+phantomJS,調用瀏覽器內核,并利用phantomJS執行js來模擬人為操作以及觸發頁面中的js腳本。
以上就是“Python常問的面試題有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。