當我們不知道要傳遞多少參數給函數時,例如我們傳遞一個清單或元組,我們就使用*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’語句,你可以自訂;
生成器會在每次暫停循環時保存本地變數狀態。迭代器只需要一個可迭代物件就能進行迭代,不需要使用局部變數
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中的裝飾器用於修改或註入函數或類別中的程式碼。
使用裝飾器,您可以包裝類別或函數方法調用,以便在執行原始程式碼之前或之後執行一段程式碼。
裝飾器可用於檢查權限,修改或追蹤傳遞給方法的參數,將呼叫記錄到特定方法等
如果在一個理想的世界中,NumPy只含有最基本的陣列資料型別和運算,如索引、排序、重塑和基本元素函數。
2)所有數字代碼都將駐留在SciPy中。儘管如此,NumPy仍然保持著向後相容的目標,試圖保留其前身所支援的所有功能。
因此,儘管更適合屬於SciPy,NumPy仍然包括一些線性代數函數。無論如何,SciPy都包含比其他數值演算法更全面的線性代數模組版本和其他許多數值演算法。
若用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就不可以了;
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%’
# Q94.描述下scrapy框架運作的機制?
調度器將請求佇列裡的請求交給下載器去獲取請求對應的回應資源,並將回應交給自己編寫的解析方法做提取處理:
#如果提取出需要的數據,則交給管道文件處理;
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常問的面試題目有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!