Python—內置函數和匿名函數

楔子html

在講新知識以前,咱們先來複習複習函數的基礎知識。python

問:函數怎麼調用?程序員

函數名()面試

若是大家這麼說。。。那大家就對了!好了記住這個事兒別給忘記了,我們繼續談下一話題。。。算法

來大家在本身的環境裏打印一下本身的名字。緩存

大家是怎麼打的呀?數據結構

是否是print('xxx'),好了,如今大家結合我剛剛說的函數的調用方法,你有沒有什麼發現?ide

咱們就猜,print有沒有多是一個函數?函數

可是沒有人實現它啊。。。它怎麼就能用了呢?學習

早在咱們「初識函數」的時候是否是就是用len()引出的?

那如今咱們也知道len()也是一個函數,也沒人實現,它好像就本身能用了。。。

以前老師給你講你能夠這樣用你就用了,那你有沒有想過像這樣直接拿來就能用的函數到底有多少?

內置函數

接下來,咱們就一塊兒來看看python裏的內置函數。截止到python版本3.6.2,如今python一共爲咱們提供了68個內置函數。它們就是python提供給你直接能夠拿來使用的全部函數。這些函數有些咱們已經用過了,有些咱們還沒用到過,還有一些是被封印了,必須等咱們學了新知識才能解開封印的。那今天咱們就一塊兒來認識一下python的內置函數。這麼多函數,咱們該從何學起呢?

    Built-in Functions    
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()  
delattr() hash() memoryview() set()  

上面就是內置函數的表,68個函數都在這兒了。這個表的順序是按照首字母的排列順序來的,你會發現都混亂的堆在一塊兒。好比,oct和bin和hex都是作進制換算的,可是卻被寫在了三個地方。。。這樣很是不利於你們概括和學習。那我把這些函數分紅了6大類。你看下面這張圖,你猜我們今天會學哪幾大類呀? 

我猜大家都猜對了。咱們今天就要學習用粉紅色標註出來的這四大塊——56個方法。還有12個方法欠着怎麼辦呢?咱們講完面向對象這剩下的12個會在兩週以內陸續還給大家的,我保證(認真臉)。那這樣,咱們今天就主要關注咱們要學習的這56個方法。

那要學的一共4塊,我們從哪兒開始學起呢?

做用域相關

基於字典的形式獲取局部變量和全局變量

globals()——獲取全局變量的字典

locals()——獲取執行本方法所在命名空間內的局部變量的字典

其餘

字符串類型代碼的執行

http://www.cnblogs.com/Eva-J/articles/7266087.html

輸入輸出相關:

input() 輸入

s = input("請輸入內容 : ") #輸入的內容賦值給s變量 print(s) #輸入什麼打印什麼。數據類型是str

print() 輸出

# print源碼
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print """ print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) file: 默認是輸出到屏幕,若是設置爲文件句柄,輸出到文件 sep: 打印多個值之間的分隔符,默認爲空格 end: 每一次打印的結尾,默認爲換行符 flush: 當即把內容輸出到流文件,不做緩存 """
# file關鍵字的說明
f = open('tmp_file','w') print(123,456,sep=',',file = f,flush=True)
# 打印進度條
import time for i in range(0,101,2): time.sleep(0.1) char_num = i//2 #打印多少個'*' per_str = '\r%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num) print(per_str,end='', flush=True) #小越越 : \r 能夠把光標移動到行首但不換行

數據類型相關

type(o) 返回變量o的數據類型

內存相關:

id(o) o是參數,返回一個變量的內存地址

hash(o) o是參數,返回一個可hash變量的哈希值,不可hash的變量被hash以後會報錯。

t = (1,2,3)
l = [1,2,3] print(hash(t)) #可hash print(hash(l)) #會報錯 ''' 結果: TypeError: unhashable type: 'list' '''

hash函數會根據一個內部的算法對當前可hash變量進行處理,返回一個int數字。

*每一次執行程序,內容相同的變量hash值在這一次執行過程當中不會發生改變。

 

文件操做相關

open()  打開一個文件,返回一個文件操做符(文件句柄)

操做文件的模式有r,w,a,r+,w+,a+ 共6種,每一種方式均可以用二進制的形式操做(rb,wb,ab,rb+,wb+,ab+)

能夠用encoding指定編碼.

 

模塊操做相關

__import__導入一個模塊  

import time
os = __import__('os') print(os.path.abspath('.'))

幫助方法

在控制檯執行help()進入幫助模式。能夠隨意輸入變量或者變量的類型。輸入q退出

或者直接執行help(o),o是參數,查看和變量o有關的操做。。。

和調用相關

callable(o),o是參數,看這個變量是否是可調用。

若是o是一個函數名,就會返回True

def func():pass print(callable(func)) #參數是函數名,可調用,返回True print(callable(123)) #參數是數字,不可調用,返回False

查看參數所屬類型的全部內置方法

dir() 默認查看全局空間內的屬性,也接受一個參數,查看這個參數內的方法或變量

print(dir(list))  #查看列表的內置方法 print(dir(int)) #查看整數的內置方法

和數字相關

數字——數據類型相關:bool,int,float,complex

數字——進制轉換相關:bin,oct,hex

數字——數學運算:abs,divmod,min,max,sum,round,pow

和數據結構相關

序列——列表和元組相關的:list和tuple

序列——字符串相關的:str,format,bytes,bytearry,memoryview,ord,chr,ascii,repr

ret = bytearray('alex',encoding='utf-8') print(id(ret)) print(ret[0]) ret[0] = 65 print(ret) print(id(ret))
ret = memoryview(bytes('你好',encoding='utf-8')) print(len(ret)) print(bytes(ret[:3]).decode('utf-8')) print(bytes(ret[3:]).decode('utf-8'))

序列:reversed,slice

l = (1,2,23,213,5612,342,43)
print(l) print(list(reversed(l)))
l = (1,2,23,213,5612,342,43)
sli = slice(1,5,2) print(l[sli])

數據集合——字典和集合:dict,set,frozenset

數據集合:len,sorted,enumerate,all,any,zip,filter,map

filter和map:http://www.cnblogs.com/Eva-J/articles/7266192.html

sorted方法:http://www.cnblogs.com/Eva-J/articles/7265992.html

匿名函數

匿名函數:爲了解決那些功能很簡單的需求而設計的一句話函數

#這段代碼 def calc(n): return n**n print(calc(10)) #換成匿名函數 calc = lambda n:n**n print(calc(10))

上面是咱們對calc這個匿名函數的分析,下面給出了一個關於匿名函數格式的說明

函數名 = lambda 參數 :返回值 #參數能夠有多個,用逗號隔開 #匿名函數無論邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值 #返回值和正常的函數同樣能夠是任意數據類型

咱們能夠看出,匿名函數並非真的不能有名字。

匿名函數的調用和正常的調用也沒有什麼分別。 就是 函數名(參數) 就能夠了~~~

練一練:

請把如下函數變成匿名函數
def add(x,y): return x+y

 

上面是匿名函數的函數用法。除此以外,匿名函數也不是浪得虛名,它真的能夠匿名。在和其餘功能函數合做的時候

l=[3,2,100,999,213,1111,31121,333]
print(max(l)) dic={'k1':10,'k2':100,'k3':30} print(max(dic)) print(dic[max(dic,key=lambda k:dic[k])])
res = map(lambda x:x**2,[1,5,7,4,8]) for i in res: print(i) 輸出 1 25 49 16 64
res = filter(lambda x:x>10,[5,8,11,9,15]) for i in res: print(i) 輸出 11 15

面試題練一練

現有兩個元組(('a'),('b')),(('c'),('d')),請使用python中匿名函數生成列表[{'a':'c'},{'b':'d'}]

#答案一
test = lambda t1,t2 :[{i:j} for i,j in zip(t1,t2)]
print(test(t1,t2))
#答案二
print(list(map(lambda t:{t[0]:t[1]},zip(t1,t2))))
#還能夠這樣寫
print([{i:j} for i,j in zip(t1,t2)])
答案
1.下面程序的輸出結果是:
d = lambda p:p*2
t = lambda p:p*3
x = 2
x = d(x)
x = t(x)
x = d(x)
print x

2.現有兩元組(('a'),('b')),(('c'),('d')),請使用python中匿名函數生成列表[{'a':'c'},{'b':'d'}]

3.如下代碼的輸出是什麼?請給出答案並解釋。
def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
請修改multipliers的定義來產生指望的結果。
練習

本章小結

說學習內置函數,不如說整理本身的知識體系。其實整理這些內置函數的過程也是在整理本身的知識體系。

咱們講課的時候會歸類:經常使用或者不經常使用,主要仍是根據場景而言。

一個優秀的程序員就應該是在該用這個方法的時候信手拈來,把每個內置的函數都用的恰到好處。

要想作到這一點,至少要先了解,才能在須要的時候想起,進而將它用在該用的地方。

可是在這裏,我仍是以本身的一點經驗之談,把幾個平時工做中相對更經常使用的方法推薦一下,請務必重點掌握:

其餘:input,print,type,hash,open,import,dir

str類型代碼執行:eval,exec

數字:bool,int,float,abs,divmod,min,max,sum,round,pow

序列——列表和元組相關的:list和tuple

序列——字符串相關的:str,bytes,repr

序列:reversed,slice

數據集合——字典和集合:dict,set,frozenset

數據集合:len,sorted,enumerate,zip,filter,map

參考文檔:

  https://docs.python.org/3/library/functions.html#object

相關文章
相關標籤/搜索