內(nèi)置函數(shù)就是Python給你提供的,拿來直接用的函數(shù),比如print.,input等。
在平遙等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),平遙網(wǎng)站建設(shè)費(fèi)用合理。
截止到python版本3.6.2 ,python一共提供了68個(gè)內(nèi)置函數(shù),具體如下
本文將這68個(gè)內(nèi)置函數(shù)綜合整理為12大類,正在學(xué)習(xí)Python基礎(chǔ)的讀者一定不要錯(cuò)過,建議收藏學(xué)習(xí)!
(1)列表和元組
(2)相關(guān)內(nèi)置函數(shù)
(3)字符串
frozenset 創(chuàng)建一個(gè)凍結(jié)的集合,凍結(jié)的集合不能進(jìn)行添加和刪除操作。
語法:sorted(Iterable, key=函數(shù)(排序規(guī)則), reverse=False)
語法:fiter(function. Iterable)
function: 用來篩選的函數(shù). 在?lter中會(huì)自動(dòng)的把iterable中的元素傳遞給function. 然后根據(jù)function返回的True或者False來判斷是否保留留此項(xiàng)數(shù)據(jù) , Iterable: 可迭代對(duì)象
搜索公眾號(hào)頂級(jí)架構(gòu)師后臺(tái)回復(fù)“面試”,送你一份驚喜禮包。
語法 : map(function, iterable)
可以對(duì)可迭代對(duì)象中的每一個(gè)元素進(jìn)行映射. 分別去執(zhí)行 function
hash : 獲取到對(duì)象的哈希值(int, str, bool, tuple). hash算法:(1) 目的是唯一性 (2) dict 查找效率非常高, hash表.用空間換的時(shí)間 比較耗費(fèi)內(nèi)存
8個(gè)超好用內(nèi)置函數(shù)set(),eval(),sorted(),reversed(),map(),reduce(),filter(),enumerate()
python中有許多內(nèi)置函數(shù),不像print那么廣為人知,但它們卻異常的強(qiáng)大,用好了可以大大提高代碼效率。
這次來梳理下8個(gè)好用的python內(nèi)置函數(shù)
1、set()
當(dāng)需要對(duì)一個(gè)列表進(jìn)行去重操作的時(shí)候,set()函數(shù)就派上用場(chǎng)了。
用于創(chuàng)建一個(gè)集合,集合里的元素是無序且不重復(fù)的。集合對(duì)象創(chuàng)建后,還能使用并集、交集、差集功能。
2、eval()之前有人問如何用python寫一個(gè)四則運(yùn)算器,輸入字符串公式,直接產(chǎn)生結(jié)果。用eval()來做就很簡單:eval(str_expression)作用是將字符串轉(zhuǎn)換成表達(dá)式,并且執(zhí)行。
3、sorted()在處理數(shù)據(jù)過程中,我們經(jīng)常會(huì)用到排序操作,比如將列表、字典、元組里面的元素正/倒排序。這時(shí)候就需要用到sorted() ,它可以對(duì)任何可迭代對(duì)象進(jìn)行排序,并返回列表。對(duì)列表升序操作:
對(duì)元組倒序操作:
使用參數(shù):key,根據(jù)自定義規(guī)則,按字符串長度來排序:
根據(jù)自定義規(guī)則,對(duì)元組構(gòu)成的列表進(jìn)行排序:
4、reversed()如果需要對(duì)序列的元素進(jìn)行反轉(zhuǎn)操作,reversed()函數(shù)能幫到你。reversed()接受一個(gè)序列,將序列里的元素反轉(zhuǎn),并最終返回迭代器。
5、map()做文本處理的時(shí)候,假如要對(duì)序列里的每個(gè)單詞進(jìn)行大寫轉(zhuǎn)化操作。這個(gè)時(shí)候就可以使用map()函數(shù)。
map()會(huì)根據(jù)提供的函數(shù),對(duì)指定的序列做映射,最終返回迭代器。也就是說map()函數(shù)會(huì)把序列里的每一個(gè)元素用指定的方法加工一遍,最終返回給你加工好的序列。舉個(gè)例子,對(duì)列表里的每個(gè)數(shù)字作平方處理:
6、reduce()前面說到對(duì)列表里的每個(gè)數(shù)字作平方處理,用map()函數(shù)。那我想將列表里的每個(gè)元素相乘,該怎么做呢?這時(shí)候用到reduce()函數(shù)。
reduce()會(huì)對(duì)參數(shù)序列中元素進(jìn)行累積。第一、第二個(gè)元素先進(jìn)行函數(shù)操作,生成的結(jié)果再和第三個(gè)元素進(jìn)行函數(shù)操作,以此類推,最終生成所有元素累積運(yùn)算的結(jié)果。再舉個(gè)例子,將字母連接成字符串。
你可能已經(jīng)注意到,reduce()函數(shù)在python3里已經(jīng)不再是內(nèi)置函數(shù),而是遷移到了functools模塊中。這里把reduce()函數(shù)拎出來講,是因?yàn)樗匾恕?/p>
7、filter()一些數(shù)字組成的列表,要把其中偶數(shù)去掉,該怎么做呢?
filter()函數(shù)輕松完成了任務(wù),它用于過濾序列,過濾掉不符合條件的元素,返回一個(gè)迭代器對(duì)象。filter()函數(shù)和map()、reduce()函數(shù)類似,都是將序列里的每個(gè)元素映射到函數(shù),最終返回結(jié)果。我們?cè)僭囋?,如何從許多單詞里挑出包含字母w的單詞。
8、enumerate()這樣一個(gè)場(chǎng)景,同時(shí)打印出序列里每一個(gè)元素和它對(duì)應(yīng)的順序號(hào),我們用enumerate()函數(shù)做做看。
enumerate翻譯過來是枚舉、列舉的意思,所以說enumerate()函數(shù)用于對(duì)序列里的元素進(jìn)行順序標(biāo)注,返回(元素、索引)組成的迭代器。再舉個(gè)例子說明,對(duì)字符串進(jìn)行標(biāo)注,返回每個(gè)字母和其索引。
1、函數(shù)定義時(shí)
?。褂脝蝹€(gè) * 會(huì)將所有的參數(shù),放入一個(gè)元組(tuple)供函數(shù)使用。
-使用兩個(gè) ** 將所有的關(guān)鍵字參數(shù)(鍵-值對(duì)形式),放入一個(gè)字典(dict)供函數(shù)使用。
2.函數(shù)調(diào)用時(shí)
?。趌ist,tuple,set前加一個(gè)星號(hào)會(huì)把容器中的所有元素解包(unpack)變成位置參數(shù)。
?。赿ict前加一個(gè)星號(hào)會(huì)把字典的鍵變成位置參數(shù)。
?。赿ict前加兩個(gè)星號(hào)會(huì)把字典的鍵值對(duì)變成關(guān)鍵字參數(shù)。
1、* 的具體使用。位置參數(shù)和可變參數(shù)的靈活使用
1.1 在函數(shù)定義時(shí)候,將所有的位置參數(shù)放入一個(gè)元祖中
1.2 在函數(shù)調(diào)用時(shí)使用*,將list、tuple、set,解包成位置參數(shù)。
2、**的具體使用。關(guān)鍵字參數(shù)和可變參數(shù)的具體使用。
2.1 在函數(shù)定義時(shí)
3、 和 * 在函數(shù)中一起使用
注意,在*arg之后,函數(shù)只接收關(guān)鍵字參數(shù)
1、定義函數(shù)
函數(shù)是可重用的程序。本書中已經(jīng)使用了許多內(nèi)建函數(shù),如len()函數(shù)和range()函數(shù),但是還沒自定義過函數(shù)。定義函數(shù)的語法格式如下:
def 函數(shù)名(參數(shù)):
函數(shù)體
定義函數(shù)的規(guī)則如下:
①關(guān)鍵字def用來定義一個(gè)函數(shù),它是define的縮寫。
②函數(shù)名是函數(shù)的唯一標(biāo)識(shí),函數(shù)名的命名規(guī)則遵循標(biāo)識(shí)符的命名規(guī)則。
③函數(shù)名后面一定要緊跟著一個(gè)括號(hào),括號(hào)內(nèi)的參數(shù)是可選的,括號(hào)后面要有冒號(hào)。
④函數(shù)體(statement)為一個(gè)或一組Python語句,注意要有縮進(jìn)。
⑤函數(shù)體的第一行可以有文檔字符串,用于描述函數(shù)的功能,用三引號(hào)括起來。
按照定義規(guī)則,可以定義第一個(gè)函數(shù)了:
def?hello_world():
...?????print('Hello,world!')???#?注意函數(shù)體要有縮進(jìn)
...
hello_world()
Hello,world!
這個(gè)函數(shù)不帶任何參數(shù),它的功能是打印出“Hello,world!”。最后一行代碼hello_world()是調(diào)用函數(shù),即讓Python執(zhí)行函數(shù)的代碼。
2、全局變量和局部變量
全局變量是定義在所有函數(shù)外的變量。例如,定義一個(gè)全局變量a,分別在函數(shù)test1()和test2()使用變量a:
a?=?100???#?全局變量
def?test1():
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
test2()
100
定義了全局變量a之后,在函數(shù)test1()和test2()內(nèi)都可以使用變量a,由此可知,全局變量的作用范圍是全局。
局部變量是在函數(shù)內(nèi)定義的變量,除了用關(guān)鍵字global修飾的變量以外。例如,在函數(shù)test1()內(nèi)定義一個(gè)局部變量a,分別在函數(shù)外和另一個(gè)函數(shù)test2()內(nèi)使用變量a:
def?test1():
...?????a?=?100???#?局部變量
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
print(a)
Traceback?(most?recent?call?last):
File?"stdin",?line?1,?in?module
NameError:?name?'a'?is?not?defined
test2()
Traceback?(most?recent?call?last):
File?"stdin",?line?1,?in?module
File?"stdin",?line?2,?in?test2
NameError:?name?'a'?is?not?defined
Python解釋器提示出錯(cuò)了。由于局部變量a定義在函數(shù)test1()內(nèi),因此,在函數(shù)test1()內(nèi)可以使用變量a,但是在函數(shù)外或者另一個(gè)函數(shù)test2()內(nèi)使用變量a,都會(huì)報(bào)錯(cuò),由此可見,局部變量的作用范圍是定義它的函數(shù)內(nèi)部。
一般情況下,在函數(shù)內(nèi)聲明的變量都是局部變量,但是采用關(guān)鍵字global修飾的變量卻是全局變量:
def?test1():
...?????global?a???#?全局變量
...?????a?=?100
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
print(a)
100
test2()
100
這個(gè)程序與上個(gè)程序相比,只是在函數(shù)test1()中多了一行代碼“global a”,程序便可以正確運(yùn)行了。在函數(shù)test1()中,采用關(guān)鍵字global修飾了變量a之后,變量a就變成了全局變量,不僅可以在該函數(shù)內(nèi)使用,還可以在函數(shù)外或者其他函數(shù)內(nèi)使用。
如果在某個(gè)函數(shù)內(nèi)局部變量與全局變量同名,那么在該函數(shù)中局部變量會(huì)覆蓋全局變量:
a?=?100???#?全局變量
def?test1():
...?????a?=?200???#?同名局部變量
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
200
test2()
100
由于在函數(shù)test1()中定義了一個(gè)與全局變量同名的局部變量a,因此,在函數(shù)test1()中全局變量a的值被局部變量覆蓋了,但是在函數(shù)test2()中全局變量a的值沒有被覆蓋。
綜上所述,在Python中,全局變量保存的數(shù)據(jù)供整個(gè)腳本文件使用;而局部變量只用于臨時(shí)保存數(shù)據(jù),變量僅供局部代碼塊使用。
內(nèi)置函數(shù),在python幫助文檔中:Build-in Functions
在Python提示符下,輸入下面語句,就會(huì)顯示Python提供的內(nèi)置函數(shù)列表
dir('__builtins__')
abs(_) 內(nèi)置函數(shù),絕對(duì)值或復(fù)數(shù)的模。
chr() 以單字節(jié)整數(shù)為參數(shù),返回一個(gè)單字符的字符串,其內(nèi)容是與之對(duì)于的ASCII字符。如chr(69)返回'E'。
cmp() 比較字符串,cmp('Xiao','Jian')返回1
星空是無數(shù)人夢(mèng)寐以求想了解的一個(gè)領(lǐng)域,遠(yuǎn)古的人們通過肉眼觀察星空,并制定了太陰歷,指導(dǎo)農(nóng)業(yè)發(fā)展。隨著現(xiàn)代科技發(fā)展,有了更先進(jìn)的設(shè)備進(jìn)行星空的探索。本實(shí)驗(yàn)獲取了美國國家航空航天局(NASA)官網(wǎng)發(fā)布的地外行星數(shù)據(jù),研究及可視化了地外行星各參數(shù)、尋找到了一顆類地行星并研究了天體參數(shù)的相關(guān)關(guān)系。
輸入并執(zhí)行魔法命令 %matplotlib inline, 設(shè)置全局字號(hào),去除圖例邊框,去除右側(cè)和頂部坐標(biāo)軸。
本數(shù)據(jù)集來自 NASA,行星發(fā)現(xiàn)是 NASA 的重要工作之一,本數(shù)據(jù)集搜集了 NASA 官網(wǎng)發(fā)布的 4296 顆行星的數(shù)據(jù),本數(shù)據(jù)集字段包括:
導(dǎo)入數(shù)據(jù)并查看前 5 行。
截至 2020 年 10 月 22 日 全球共發(fā)現(xiàn) 4296 顆行星,按年聚合并繪制年度行星發(fā)現(xiàn)數(shù),并在左上角繪制 NASA 的官方 LOGO 。
從運(yùn)行結(jié)果可以看出,2005 年以前全球行星發(fā)現(xiàn)數(shù)是非常少的,經(jīng)計(jì)算總計(jì) 173 顆,2014 和 2016 是行星發(fā)現(xiàn)成果最多的年份,2016 年度發(fā)現(xiàn)行星 1505 顆。
對(duì)不同機(jī)構(gòu)/項(xiàng)目/計(jì)劃進(jìn)行聚合并降序排列,繪制發(fā)現(xiàn)行星數(shù)目的前 20 。
2009 年至 2013 年,開普勒太空望遠(yuǎn)鏡成為有史以來最成功的系外行星發(fā)現(xiàn)者。在一片天空中至少找到了 1030 顆系外行星以及超過 4600 顆疑似行星。當(dāng)機(jī)械故障剝奪了該探測(cè)器對(duì)于恒星的精確定位功能后,地球上的工程師們于 2014 年對(duì)其進(jìn)行了徹底改造,并以 K2 計(jì)劃命名,后者將在更短的時(shí)間內(nèi)搜尋宇宙的另一片區(qū)域。
對(duì)發(fā)現(xiàn)行星的方式進(jìn)行聚合并降序排列,繪制各種方法發(fā)現(xiàn)行星的比例,由于排名靠后的幾種方式發(fā)現(xiàn)行星數(shù)較少,因此不顯示其標(biāo)簽。
行星在宇宙中并不會(huì)發(fā)光,因此無法直接觀察,行星發(fā)現(xiàn)的方式多為間接方式。從輸出結(jié)果可以看出,發(fā)現(xiàn)行星主要有以下 3 種方式,其原理如下:
針對(duì)不同的行星質(zhì)量,繪制比其質(zhì)量大(或者?。┑男行潜壤?,由于行星質(zhì)量量綱分布跨度較大,因此采用對(duì)數(shù)坐標(biāo)。
從輸出結(jié)果可以看出,在已發(fā)現(xiàn)的行星中,96.25% 行星的質(zhì)量大于地球。(圖中橫坐標(biāo)小于 e 的紅色面積非常?。?/p>
通過 sns.distplot 接口繪制全部行星的質(zhì)量分布圖。
從輸出結(jié)果可以看出,所有行星質(zhì)量分布呈雙峰分布,第一個(gè)峰在 1.8 左右(此處用了對(duì)數(shù)單位,表示大約 6 個(gè)地球質(zhì)量),第二個(gè)峰在 6.2 左右(大概 493 個(gè)地球質(zhì)量)。
針對(duì)不同發(fā)現(xiàn)方式發(fā)現(xiàn)的行星,繪制各行星的公轉(zhuǎn)周期和質(zhì)量的關(guān)系。
從輸出結(jié)果可以看出:徑向速度(Radial Velocity)方法發(fā)現(xiàn)的行星在公轉(zhuǎn)周期和質(zhì)量上分布更寬,而凌日(Transit)似乎只能發(fā)現(xiàn)公轉(zhuǎn)周期相對(duì)較短的行星,這是因?yàn)閮煞N方法的原理差異造成的。對(duì)于公轉(zhuǎn)周期很長的行星,其運(yùn)行到恒星和觀察者之間的時(shí)間也較長,因此凌日發(fā)現(xiàn)此類行星會(huì)相對(duì)較少。而徑向速度與其說是在發(fā)現(xiàn)行星,不如說是在觀察恒星,由于恒星自身發(fā)光,因此其觀察機(jī)會(huì)更多,發(fā)現(xiàn)各類行星的可能性更大。
針對(duì)不同發(fā)現(xiàn)方式發(fā)現(xiàn)的行星,繪制各行星的距離和質(zhì)量的關(guān)系。
從輸出結(jié)果可以看出,凌日和徑向速度對(duì)距離較為敏感,遠(yuǎn)距離的行星大多是通過凌日發(fā)現(xiàn)的,而近距離的行星大多數(shù)通過徑向速度發(fā)現(xiàn)的。原因是:近距離的行星其引力對(duì)恒星造成的擺動(dòng)更為明顯,因此更容易觀察;當(dāng)距離較遠(yuǎn)時(shí),引力作用變?nèi)?,擺動(dòng)效應(yīng)減弱,因此很難借助此方法觀察到行星。同時(shí),可以觀察到當(dāng)行星質(zhì)量更大時(shí),其距離分布相對(duì)較寬,這是因?yàn)殡m然相對(duì)恒星的距離變長了,但是由于行星質(zhì)量的增加,相對(duì)引力也同步增加,恒星擺動(dòng)效應(yīng)會(huì)變得明顯。
將所有行星的質(zhì)量和半徑對(duì)數(shù)化處理,繪制其分布并擬合其分布。
由于:
因此,從原理上質(zhì)量對(duì)數(shù)與半徑對(duì)數(shù)應(yīng)該是線性關(guān)系,且斜率為定值 3 ,截距的大小與密度相關(guān)。
從輸出結(jié)果可以看出:行星質(zhì)量和行星半徑在對(duì)數(shù)變換下,具有較好的線性關(guān)系。輸出 fix_xy 數(shù)值可知,其關(guān)系可以擬合出如下公式:
擬合出曲線對(duì)應(yīng)的行星平均密度為:
同樣的方式繪制恒星質(zhì)量與半徑的關(guān)系。
從輸出結(jié)果可以看出,恒星與行星的規(guī)律不同,其質(zhì)量與半徑在對(duì)數(shù)下呈二次曲線關(guān)系,其關(guān)系符合以下公式:
同樣的方式研究恒星表面重力加速度與半徑的關(guān)系。
從輸出結(jié)果可以看出,恒星表面對(duì)數(shù)重力加速度與其對(duì)數(shù)半徑呈現(xiàn)較好的線性關(guān)系:
以上我們分別探索了各變量的分布和部分變量的相關(guān)關(guān)系,當(dāng)數(shù)據(jù)較多時(shí),可以通過 pd.plotting.scatter_matrix 接口,直接繪制各變量的分布和任意兩個(gè)變量的散點(diǎn)圖分布,對(duì)于數(shù)據(jù)的初步探索,該接口可以讓我們迅速對(duì)數(shù)據(jù)全貌有較為清晰的認(rèn)識(shí)。
通過行星的半徑和質(zhì)量,恒星的半徑和質(zhì)量,以及行星的公轉(zhuǎn)周期等指標(biāo)與地球的相似性,尋找諸多行星中最類似地球的行星。
從輸出結(jié)果可以看出,在 0.6 附近的位置出現(xiàn)了一個(gè)最大的圓圈,那就是我們找到的類地行星 Kepler - 452 b ,讓我們了解一下這顆行星:
數(shù)據(jù)顯示,Kepler - 452 b 行星公轉(zhuǎn)周期為 384.84 天,半徑為 1.63 地球半徑,質(zhì)量為 3.29 地球質(zhì)量;它的恒星為 Kepler - 452 半徑為太陽的 1.11 倍,質(zhì)量為 1.04 倍,恒星方面數(shù)據(jù)與太陽相似度極高。
以下內(nèi)容來自百度百科。 開普勒452b(Kepler 452b) ,是美國國家航空航天局(NASA)發(fā)現(xiàn)的外行星, 直徑是地球的 1.6 倍,地球相似指數(shù)( ESI )為 0.83,距離地球1400光年,位于為天鵝座。
2015 年 7 月 24 日 0:00,美國國家航空航天局 NASA 舉辦媒體電話會(huì)議宣稱,他們?cè)谔禊Z座發(fā)現(xiàn)了一顆與地球相似指數(shù)達(dá)到 0.98 的類地行星開普勒 - 452 b。這個(gè)類地行星距離地球 1400 光年,繞著一顆與太陽非常相似的恒星運(yùn)行。開普勒 452 b 到恒星的距離,跟地球到太陽的距離相同。NASA 稱,由于缺乏關(guān)鍵數(shù)據(jù),現(xiàn)在不能說 Kepler - 452 b 究竟是不是“另外一個(gè)地球”,只能說它是“迄今最接近另外一個(gè)地球”的系外行星。
在銀河系經(jīng)緯度坐標(biāo)下繪制所有行星,并標(biāo)記地球和 Kepler - 452 b 行星的位置。
類地行星,是人類寄希望移民的第二故鄉(xiāng),但即使最近的 Kepler-452 b ,也與地球相聚 1400 光年。
以下通過行星的公轉(zhuǎn)周期和質(zhì)量兩個(gè)特征將所有行星聚為兩類,即通過訓(xùn)練獲得兩個(gè)簇心。
定義函數(shù)-計(jì)算距離
聚類距離采用歐式距離:
定義函數(shù)-訓(xùn)練簇心
訓(xùn)練簇心的原理是:根據(jù)上一次的簇心計(jì)算所有點(diǎn)與所有簇心的距離,任一點(diǎn)的分類以其距離最近的簇心確定。依此原理計(jì)算出所有點(diǎn)的分類后,對(duì)每個(gè)分類計(jì)算新的簇心。
定義函數(shù)預(yù)測(cè)分類
根據(jù)訓(xùn)練得到的簇心,預(yù)測(cè)輸入新的數(shù)據(jù)特征的分類。
開始訓(xùn)練
隨機(jī)生成一個(gè)簇心,并訓(xùn)練 15 次。
繪制聚類結(jié)果
以最后一次訓(xùn)練得到的簇心為基礎(chǔ),進(jìn)行行星的分類,并以等高面的形式繪制各類的邊界。
從運(yùn)行結(jié)果可以看出,所有行星被分成了兩類。并通過上三角和下三角標(biāo)注了每個(gè)類別的簇心位置。
聚類前
以下輸出了聚類前原始數(shù)據(jù)繪制的圖像。