關于it=filter(_not_divisible(n),it) , 函數(shù)加不加括號只是表象,你應該說第一個參數(shù)應該是一個函數(shù),是這個意思不? 你自己看_not_divisible(n)的定義,它return一個lambda函數(shù).理解了嗎?
創(chuàng)新互聯(lián)公司是專業(yè)的黃浦網(wǎng)站建設公司,黃浦接單;提供成都網(wǎng)站制作、做網(wǎng)站,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行黃浦網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
def _not_divisible(n): return lambda x: x % n 0
關于x的值怎么傳進去,你看看Python基礎里lambda函數(shù)怎么用,就理解了
3. 為什么外面加while True,你問這個問題說明你有2個地方?jīng)]弄明白,一是python程序基本的運行流程,哪個先運行,哪個后運行,這個順序,流程,結(jié)構(gòu)你沒搞明白, 還有生成器你也沒搞明白怎么回事
建議先把python基礎打牢,網(wǎng)上的說法基本上都是python簡單易學,但是任何一門語言到了一定的程序都不是那么容易,基礎不牢,基本概念不搞清楚,沒法深入,永遠都只能寫寫十幾行的腳本
當然是函數(shù)式那一套黑魔法啦,且聽我細細道來。
lambda表達式
也就是匿名函數(shù)。
用法:lambda 參數(shù)列表 : 返回值
例:
+1函數(shù)
f=lambda x:x+1
max函數(shù)(條件語句的寫法如下)
f_max=lambda x,y:x if xy else y
上述定義的函數(shù)與用def定義的函數(shù)沒有區(qū)別,而且左邊的f=在某些情況下并不是必要的。
filter,map,reduce
filter函數(shù)接受兩個參數(shù),第一個是過濾函數(shù),第二個是可遍歷的對象,用于選擇出所有滿足過濾條件的元素,不同版本的filter的返回值稍有區(qū)別,我用的是python3.5,filter返回的是經(jīng)過過濾的可遍歷對象。
例:
去除小寫字母
s=filter(lambda x:not str(x).islower(),"asdasfAsfBsdfC")
for ch in s:
print(ch)
map函數(shù)接受的參數(shù)類型與filter類似,它用于把函數(shù)作用于可遍歷對象的每一個元素。類似于數(shù)學中映射的概念。
例:
求y=2x+1(偷偷用了一下range函數(shù)生成定義域)
s=map(lambda x:2*x+1,range(6))
for x in s:
print(x)
reduce函數(shù)對每個元素作累計操作,它接受的第一個參數(shù)必須是有兩個參數(shù)的函數(shù)。
例:
求和
from functools import reduce
s=reduce(lambda x,y:x+y,range(1,6))
print(s)
求乘積(第三個可選參數(shù)表示累計變量的初值)
from functools import reduce
s=reduce(lambda x,y:x*y,range(1,6),1)
print(s)
柯里化(curry)函數(shù)
如果一個函數(shù)需要2個參數(shù),而你只傳入一個參數(shù),那么你就可以得到一個柯里化的函數(shù),這是函數(shù)式編程語言的重要特性之一,遺憾的是,python并不能在語法層面支持柯里化調(diào)用,但它在庫中提供了接口。
例:
*3函數(shù)
f_mul=lambda x,y:x*y
from functools import partial
mul3=partial(f_mul,3)
print(mul3(1))
print(mul3(6))
打包與解包
有點類似于函數(shù)式中的模式匹配,略牽強。
t=(1,2,3)
x,y,z=t
列表生成式
這個也有點牽強,不知道嚴格意義上講屬不屬于函數(shù)式風格。
例:生成奇數(shù)序列
l=[2*x+1 for x in range(10)]
for i in l:
print(i)
最后來一個彩蛋(以前某答主提到的用調(diào)分函數(shù)來美顏的算法,忘了出處了,侵刪)
from PIL import Image
from math import sqrt
im = Image.open("a.jpg")
ret= im.convert(mode="RGB")
ret = ret.point(lambda x:sqrt(x)*sqrt(255))
ret.save("b.jpg")
filter 方法可以返回原始對象的子集.
例如,我們想提取分組內(nèi)的和大于 3 的所有分組的元素
filter 的參數(shù)必須是一個函數(shù),函數(shù)參數(shù)是每個分組,并且返回 True 或 False
例如,提取元素個數(shù)大于 2 的分組
另外,我們也可以過濾掉不滿足條件的組,而是返回一個類似索引對象。在這個對象中,沒有通過的分組的元素被 NaN 填充
對于具有多列的 DataFrames ,過濾器應明確指定一列作為過濾條件
在進行聚合或轉(zhuǎn)換時,你可能想對每個分組調(diào)用一個實例方法,例如
但是,如果需要傳遞額外的參數(shù)時,它會變得很冗長。我們可以直接使用分派到組對象上的方法
實際上這生成了一個函數(shù)包裝器,在調(diào)用時,它接受所有傳遞的參數(shù),并在每個分組上進行調(diào)用。
然后,這個結(jié)果可以和 agg 和 transform 結(jié)合在一起使用
在上面的例子中,我們按照年份分組,然后對每個分組中使用 fillna 補缺失值
nlargest 和 nsmallest 可以在 Series 類型的 groupby 上使用
對分組數(shù)據(jù)的某些操作可能并不適合聚合或轉(zhuǎn)換?;蛘哒f,你可能只是想讓 GroupBy 來推斷如何合并結(jié)果
我們可以使用 apply 函數(shù),例如
改變返回結(jié)果的維度
在 Series 上使用 apply 類似
對于之前的示例數(shù)據(jù)
假設,我們想按 A 分組并計算組內(nèi)的標準差,但是 B 列的數(shù)據(jù)我們并不關心。
如果我們的函數(shù)不能應用于某些列,則會隱式的刪除這些列,所以
直接計算標準差并不會報錯
可以使用分類變量進行分組,分組的順序會按照分類變量的順序
可以使用 pd.Grouper 控制分組,對于如下數(shù)據(jù)
可以按照一定的頻率對特定列進行分組,就像重抽樣一樣
可以分別對列或索引進行分組
類似于 Series 和 DataFrame ,可以使用 head 和 tail 獲取分組前后幾行
在 Series 或 DataFrame 中可以使用 nth() 來獲取第 n 個元素,也可以用于獲取每個分組的某一行
如果你要選擇非空項,可以使用關鍵字參數(shù) dropna ,如果是 DataFrame ,需要指定為 any 或 all (類似于 DataFrame.dropna(how='any|all') )
與其他方法一樣,使用 as_index=False 分組名將不會作為索引
你也可以傳入一個整數(shù)列表,一次性選取多行
使用 cumcount 方法,可以查看每行在分組中出現(xiàn)的順序
可以使用 ngroup() 查看分組的順序,該順序與 cumcount 的順序相反。
注意 :該順序與迭代時的分組順序一樣,并不是第一次觀測到的順序
Lambda函數(shù)、Map函數(shù)、Filter函數(shù)、Zip函數(shù)、Reduce函數(shù)。
Lambda函數(shù)是Python中功能最強大的函數(shù)之一,它有時也被稱之為匿名函數(shù).。Map是程序員用來簡化程序的Python內(nèi)置函數(shù),此函數(shù)可以在不使用任何循環(huán)的情況下對所有指定的元素進行迭代。Filter是Python中的另一個內(nèi)置函數(shù),當需要區(qū)分其他類型的數(shù)據(jù)時,這個函數(shù)非常有用。Filter函數(shù)經(jīng)常用于根據(jù)特定過濾條件來提取數(shù)據(jù)。
Python(英國發(fā)音:/paθn/美國發(fā)音:/paθn/)是一種廣泛使用的解釋型、高級和通用的編程語言。Python支持多種編程范型,包括函數(shù)式、指令式、結(jié)構(gòu)化、面向?qū)ο蠛头瓷涫骄幊?。它擁有動態(tài)類型系統(tǒng)和垃圾回收功能,能夠自動管理內(nèi)存使用,并且其本身擁有一個巨大而廣泛的標準庫。
Python解釋器內(nèi)置了許多函數(shù),這意味著我們無需定義,始終可以它們。下面按照函數(shù)的字母順序,討論一些常用的內(nèi)建函數(shù)。
eval()
eval()函數(shù)解析傳給它的表達式,并在程序中運行Python表達式(代碼)。舉個例子:
x?=?1
eval("x?+?1")??#?注意:"x?+?1"是字符串
2
eval("4??9")
True
eval("'py'?*?3")
'pypypy'
eval("10?**?2")
100
eval()函數(shù)不僅僅能運行簡單表達式,還能調(diào)用函數(shù),使用方法等等:
eval("abs(-11)")????????#?計算-11的絕對值
11
eval('"hello".upper()')???#?把字符串'hello'全變成大寫字母
'HELLO'
import?os
eval('os.getcwd()')???????#?獲取當前的工作目錄
'/home/thepythonguru'
但是需要注意的是eval()僅適用于表達式,嘗試傳遞語句會導致語法錯誤:
eval('a?=?1')????????????????????#?賦值語句
Traceback?(most?recent?call?last):
File?"",?line?1,?in
File?"",?line?1
a?=?1
^
SyntaxError:?invalid?syntax
eval('import?re')?????????????#?導入語句
Traceback?(most?recent?call?last):
File?"",?line?1,?in
File?"",?line?1
import?re
^
SyntaxError:?invalid?syntax
此外,使用eval()語句應該十分小心,永遠不要將不受信任的源直接傳遞給eval()。 因為惡意用戶很容易對您的系統(tǒng)造成破壞。 例如:
eval(input())??#?eval()將執(zhí)行用戶輸入的代碼
用戶輸入以下代碼就能從系統(tǒng)中刪除所有文件:
os.system("RM?-RF?/")
#?上面輸入相當于執(zhí)行:
eval('os.system("RM?-RF?/")')
filter()
"filter"的意思是“過濾”,filter()函數(shù)需要兩個參數(shù):一個函數(shù)對象和一個可迭代對象。函數(shù)對象需要返回一個布爾值,并為可迭代的每個元素調(diào)用。 filter()函數(shù)僅返回那些通過函數(shù)對象返回值為true的元素。解釋有一些抽象,看一個例子:
a?=?[1,?2,?3,?4,?5,?6]
filter(lambda?x?:?x?%?2?==?0,?a)????????#?過濾出所有偶數(shù),結(jié)果返回一個filter對象
filter?object?at?0x1036dc048
list(filter(lambda?x?:?x?%?2?==?0,?a))??#?可以使用list()函數(shù)使fileter對象變成列表,方便查看結(jié)果
[2,?4,?6]
下面是另外一個例子:
dict_a?=?[{'name':?'python',?'points':?10},?{'name':?'java',?'points':?8}]
filter(lambda?x?:?x['name']?==?'python',?dict_a)??#?過濾出列表中鍵'name'為值'python'的字典
filter?object?at?0x1036de128
tuple(filter(lambda?x?:?x['name']?==?'python',?dict_a))??#?使用tuple()函數(shù)使結(jié)果變成字典
({'name':?'python',?'points':?10},)
float()
float()的參數(shù)是一個數(shù)字或者字符串,它返回一個浮點數(shù)。如果參數(shù)是字符串,則字符串中應該包含一個數(shù)字,并可以在數(shù)字前加入一個 '-' 符號,代表負數(shù)。參數(shù)也可以是表示NaN(非數(shù)字)或正無窮大的字符串。如果沒有任何參數(shù)的話,將返回0.0。
float('+1.23')?????????#?1.23
1.23
float('???-12345\n')???#?-12345
-12345.0
float('1e-003')????????#?0.001
0.001
float('+1E6')??????????#?10的6次冪
1000000.0
float('-Infinity')?????#?無窮小
-inf
float('-inf')?+?100?????#?負無窮小加100仍等于負無窮小
-inf
float('inf')???????????#?無窮大
inf
float('NaN')???????????#?NaN,代表非數(shù)字
nan
關于Python的基礎問題可以看下這個網(wǎng)頁的視頻教程,網(wǎng)頁鏈接,希望我的回答能幫到你。