① django model的get和filter方法的區別
django的get和filter方法是django model常用到的,搞清楚兩者的區別非常重要。
為了說明它們兩者的區別定義2個models
class Student(models.Model):
name = models.CharField('姓名', max_length=20, default='')
age = models.CharField('年齡', max_length=20, default='')
class Book(models.Model):
student = models.ForeignKey(Student)
一.先說下django的get方法:
1django的get方法是從資料庫的取得一個匹配的結果,返回一個對象,如果記錄不存在的話,它會報錯。
比如我資料庫里有一條記錄,記錄的name的值是"python"的話,我用student = Student.objects.get(name='老王python'),
返回的是一個記錄對象,你可以通過student.__dict__來查看,它返回的是一個字典的形式,{'key':valeus},key是欄位的名稱,而values是值的內容。
而如果我用get方法來查詢一個資料庫里不存在的記錄,程序會報錯。
比如:student = Student.objects.get(name='老王'),你自己可以運行看下。
2如果你用django的get去取得關聯表的數據的話,而關鍵表的數據如果多於2條的話也會報錯。
比如我的student表裡有一個記錄:
id name age
1 python 24
book表:
id student_id
1 1
2 1
我用
student = Student.objects.get(name='python')
book = Book.objects.get(student)
它也會報錯,因為book表有2條記錄和student表相匹配。
二.再說下django filter:
1django的filter方法是從資料庫的取得匹配的結果,返回一個對象列表,如果記錄不存在的話,它會返回[]。
比如我資料庫里有一條記錄,記錄的name的值是Python的話,我用student = Student.objects.filter(name='老王python')
它返回的student是一個對象的列表,可以看的出來student[0]和上面的get方式返回的student的結果是一樣的。
② Python 中關於filter函數問題求教
看文字的話會很亂,和圖一起看會好一點
首先,it是個生成器(_odd_iter),並使n=3,隨後,it作為一個生成器存在於filter對象中(迭代器),並使it為一個filter對象,經過循環,到達next語句,先計算it _odd_iter(生成器),生成了新的數之後,開始計算filter。第一次循環的時候第18行的代碼相當於 it = filter(_not_divisible(3), it ),等號右面的it還在等待next調用生成值,生成值之後,就將它代入為lambda的x中……第二次循環的時候第18行代碼變成 it = filter(_not_divisible(5), filter(_not_divisible(3), it ) ),同樣等號右面的it仍然在等待next調用生成新的值
我剛看這個教程,不知道對不對。。。
對了我看見有一個人問把代碼第18行改成 it = filter(lambda x: x % n > 0, it)
會失去過濾功能,我覺得,lambda是一個臨時函數,所以覺得像filter(div(5), filter(div(3), it))這種存在多個lambda臨時函數的話是很奇怪的,
在調試時,發現filter只檢測了一個n(最近被賦值的),相當於7%5,9%7這樣,因此失去過濾素數功能。模擬一下,在將要輸出5的時候,it = filter()的那行代碼變為:
it = filter(lambda x : x % n >0 , filter (lambda x : x % n > 0 , it ) ),it將值賦給x,但是,我覺得n被賦值時,會刷新其他lambda中的n,造成類似於 it =filter(lambda x : x % 5 >0 , filter (lambda x : x % 5 > 0 , it ) )的情況
③ django model filter變數為空則篩選全部
django的filter方法是從資料庫的取得匹配的結果,返回一個對象列表,如果記錄不存在的話,它會返回[]。
比如我資料庫里有一條記錄,記錄的name的值是Python的話,我用
student=Student.objects.filter(name='python')
它返回的student是一個對象的列表,可以看的出來student[0]和上面的get方式返回的student的結果是一樣的。
④ python filter對象怎麼遍歷
糾正一下你的這句話
其實才是真正的filter的入參,而x指的是filter的另一個入參it。
這里的it是一個生成器對象,而filter每次會得到一個由它生成的值。所以x指的不是it,只是it產生的一個值。
至於怎麼實現將it中的數據遍歷下去,這個很好解釋。
我們知道filter接受兩個參數function和iterable。而filter的功能就等價於(item for item in iterable if function(item)),它就是這么遍歷完的。。。
it裡面到底是啥? 正如你知道的,它就是一個生成器對象。每當一次調用結束後它就會掛起,直到下一次被激活。
while True:
n = next(it)
yield n it = filter(_not_divisible(n), it)#怎麼就實現了循環遍歷 it了?
它的實質就是把得到的每個素數從生成器中剔除。
⑤ python中的filter函數怎麼用
filter就是按條件篩選:
filter(bool,['spam','','ni'])
list(filter(bool,[''spam,'','ni']))
輸出的結果為['spam','ni']
#按照bool型篩選,因為中間的『』,為空,不是bool型所以過濾掉。
⑥ python filter函數
不會死循環,生成器是個虛擬抽象的概念,你可以認為_odd_iter()primes() 裡面運行的時候
python解釋器並不生成實際的List,也就不會耗費內存和時間
真正分配給List內存只在以下過程, primes()這個生成器是逐步分配內存的!!
forninprimes():
ifn<1000:
print(n)
else:
break
另外提醒你下,你的程序只能在Python 3.x版本下正確運行:-)因為你用的是 filter返回生成器對象的用法!!如果你要你的程序在Python 2.x正確運行,需改成如下形式。
根據你最新的追問,「為什麼it=filter(lambda x : x%n>0 ,it)不行??「直接在filter里用Lambda表達式是完全可以的,你的原因是你的Lambda表達式漏輸入了一個n,請看如下形式.
#Python2.x下需導入itertools庫的ifilter才能和python3.x的filter等效
importitertools
def_odd_iter():
n=1
whileTrue:
n=n+2
yieldn
def_not_divisible(n):
returnlambdax:x%n>0
defprimes():
yield2
it=_odd_iter()
whileTrue:
n=next(it)
yieldn
#it=itertools.ifilter(_not_divisible(n),it)
it=itertools.ifilter(lambdax,n=n:x%n>0,it)
forninprimes():
ifn<1000:
print(n)
else:
break
⑦ python中的filter函數怎麼用
關於it=filter(_not_divisible(n),it) , 函數加不加括弧只是表象,你應該說第一個參數應該是一個函數,是這個意思不? 你自己看_not_divisible(n)的定義,它return一個lambda函數.理解了嗎?
def _not_divisible(n): return lambda x: x % n > 0
關於x的值怎麼傳進去,你看看Python基礎里lambda函數怎麼用,就理解了
3. 為什麼外面加while True,你問這個問題說明你有2個地方沒弄明白,一是python程序基本的運行流程,哪個先運行,哪個後運行,這個順序,流程,結構你沒搞明白, 還有生成器你也沒搞明白怎麼回事
建議先把python基礎打牢,網上的說法基本上都是python簡單易學,但是任何一門語言到了一定的程序都不是那麼容易,基礎不牢,基本概念不搞清楚,沒法深入,永遠都只能寫寫十幾行的腳本
⑧ python中的filter()函數怎麼用特別是一個函數有多個輸入參數時。
map是把函數調用的結果放在列表裡面返回,它也可以接受多個 iterable,在第n次調用function時,將使用iterable1[n], iterable2[n], ...作為參數。
filter(function, iterable)
這個函數的功能是過濾出iterable中所有以元素自身作為參數調用function時返回True或bool(返回值)為True的元素並以列表返回.
def f_large_than_5(x):
return x > 5
filter(f_large_than_5, range(10))
>>[6,7,8,9]
⑨ python中的filter函數怎麼用
python filter內建函數
filter函數是python內建函數,可以操作任何可迭代類型,如list,tuple,string.
filter需要帶上一個函數function和一個可迭代序列作為參數。filter()將調用該function作用於每一個可迭代序列的元素,並返回一個由該function驗證後返回值為true的元素組成新的可迭代序列,新序列的類型保持與filter參數序列的類型一致
2.filter與數字
下面用這個例子來說明:
#建個數字列表
numbers=[1,5,9,8,4,6,3,7]
#定義一個過濾標准,取小於5的數
deflessThanFive(element):
returnelement<5
printfilter(lessThanFive,numbers)
輸出結果是列表:[1,4,3]
解說:此處的過濾函數lessThanFive必需帶入一個參數(filter()會調用lessThanFive,參數是列表nembers中的每一個元素,一次一個)。filter()返回所有值都是小於5的列表
3.filter與字元串
下面用如下例子說明:
#定義元組類型
names=('Jack','Jill,'Steve','')
#篩選出名字
new_names=filter(None,names)
printnew_names
輸出結果是元組:
('Jack','Jill,'Steve')
在元組names最後一個名字是空字元串,而filter的第一個參數是None,這說明需要使用identity函數(該函數是簡單的返回該元素的)
因為python對空字元串,0和None作為False,所以上面的filter的語句就是移除空元素。
4.filter和函數
目的:找出以J開頭的名字
defstartsWithJ(element):
ifelement:
returnelement[0]=='J'
returnFalse
j_names=filter(startsWithJ,names)
printj_names
輸出結果是元組:('Jack','Jill')
注意到了嗎,上面的2個結果都是tuple而不是list,再一次說明fliter的返回值類型與參數序列的類型保持一致
⑩ python中的filter函數怎麼用
filter()函數是 Python 內置的另一個有用的高階函數,filter()函數接收一個函數 f 和一個list,這個函數 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數,首先,要編寫一個判斷奇數的函數:
def is_odd(x):
return x % 2 == 1
然後,利用filter()過濾掉偶數:
>>>filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
結果:
[1, 7, 9, 17]
利用filter(),可以完成很多有用的功能,例如,刪除 None 或者空字元串:
def is_not_empty(s):
return s and len(s.strip()) > 0
>>>filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
結果:
['test', 'str', 'END']
注意: s.strip(rm) 刪除 s 字元串中開頭、結尾處的 rm 序列的字元。
當rm為空時,默認刪除空白符(包括'\n', '\r', '\t', ' '),如下:
>>> a = ' 123'
>>> a.strip()
'123'
>>> a = '\t\t123\r\n'
>>> a.strip()
'123'
練習:
請利用filter()過濾出1~100中平方根是整數的數,即結果應該是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
方法:
import math
def is_sqr(x):
return math.sqrt(x) % 1 == 0
print filter(is_sqr, range(1, 101))
結果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]