python之路——内置函数和匿名函数
楔子
在講新知識之前,我們先來復習復習函數(shù)的基礎知識。
問:函數(shù)怎么調用?
函數(shù)名()
如果你們這么說。。。那你們就對了!好了記住這個事兒別給忘記了,咱們繼續(xù)談下一話題。。。
來你們在自己的環(huán)境里打印一下自己的名字。
你們是怎么打的呀?
是不是print('xxx'),好了,現(xiàn)在你們結合我剛剛說的函數(shù)的調用方法,你有沒有什么發(fā)現(xiàn)?
我們就猜,print有沒有可能是一個函數(shù)?
但是沒有人實現(xiàn)它啊。。。它怎么就能用了呢?
早在我們“初識函數(shù)”的時候是不是就是用len()引出的?
那現(xiàn)在我們也知道len()也是一個函數(shù),也沒人實現(xiàn),它好像就自己能用了。。。
之前老師給你講你可以這樣用你就用了,那你有沒有想過像這樣直接拿來就能用的函數(shù)到底有多少?
返回頂部內(nèi)置函數(shù)
接下來,我們就一起來看看python里的內(nèi)置函數(shù)。截止到python版本3.6.2,現(xiàn)在python一共為我們提供了68個內(nèi)置函數(shù)。它們就是python提供給你直接可以拿來使用的所有函數(shù)。這些函數(shù)有些我們已經(jīng)用過了,有些我們還沒用到過,還有一些是被封印了,必須等我們學了新知識才能解開封印的。那今天我們就一起來認識一下python的內(nèi)置函數(shù)。這么多函數(shù),我們該從何學起呢?
| 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() | ? |
上面就是內(nèi)置函數(shù)的表,68個函數(shù)都在這兒了。這個表的順序是按照首字母的排列順序來的,你會發(fā)現(xiàn)都混亂的堆在一起。比如,oct和bin和hex都是做進制換算的,但是卻被寫在了三個地方。。。這樣非常不利于大家歸納和學習。那我把這些函數(shù)分成了6大類。你看下面這張圖,你猜咱們今天會學哪幾大類呀??
我猜你們都猜對了。我們今天就要學習用粉紅色標注出來的這四大塊——56個方法。還有12個方法欠著怎么辦呢?我們講完面向對象這剩下的12個會在兩周之內(nèi)陸續(xù)還給你們的,我保證(認真臉)。那這樣,我們今天就主要關注我們要學習的這56個方法。
那要學的一共4塊,咱們從哪兒開始學起呢?
作用域相關
基于字典的形式獲取局部變量和全局變量
globals()——獲取全局變量的字典
locals()——獲取執(zhí)行本方法所在命名空間內(nèi)的局部變量的字典
其他
字符串類型代碼的執(zhí)行
http://www.cnblogs.com/Eva-J/articles/7266087.html
?
輸入輸出相關:
input() 輸入
s = input("請輸入內(nèi)容 : ") #輸入的內(nèi)容賦值給s變量 print(s) #輸入什么打印什么。數(shù)據(jù)類型是str input的用法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: 立即把內(nèi)容輸出到流文件,不作緩存""" print源碼剖析 f = open('tmp_file','w') print(123,456,sep=',',file = f,flush=True) file關鍵字的說明 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 可以把光標移動到行首但不換行 打印進度條?
數(shù)據(jù)類型相關:
type(o)?返回變量o的數(shù)據(jù)類型
?
內(nèi)存相關:
id(o) o是參數(shù),返回一個變量的內(nèi)存地址
hash(o) o是參數(shù),返回一個可hash變量的哈希值,不可hash的變量被hash之后會報錯。
t = (1,2,3) l = [1,2,3] print(hash(t)) #可hash print(hash(l)) #會報錯''' 結果: TypeError: unhashable type: 'list' ''' hash實例hash函數(shù)會根據(jù)一個內(nèi)部的算法對當前可hash變量進行處理,返回一個int數(shù)字。
*每一次執(zhí)行程序,內(nèi)容相同的變量hash值在這一次執(zhí)行過程中不會發(fā)生改變。
?
文件操作相關
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('.')) __import__?
幫助方法
在控制臺執(zhí)行help()進入幫助模式。可以隨意輸入變量或者變量的類型。輸入q退出
或者直接執(zhí)行help(o),o是參數(shù),查看和變量o有關的操作。。。
?
和調用相關
callable(o),o是參數(shù),看這個變量是不是可調用。
如果o是一個函數(shù)名,就會返回True
def func():pass print(callable(func)) #參數(shù)是函數(shù)名,可調用,返回True print(callable(123)) #參數(shù)是數(shù)字,不可調用,返回False callable實例?
查看參數(shù)所屬類型的所有內(nèi)置方法
dir() 默認查看全局空間內(nèi)的屬性,也接受一個參數(shù),查看這個參數(shù)內(nèi)的方法或變量
print(dir(list)) #查看列表的內(nèi)置方法 print(dir(int)) #查看整數(shù)的內(nèi)置方法 查看某變量/數(shù)據(jù)類型的內(nèi)置方法?
和數(shù)字相關
?
數(shù)字——數(shù)據(jù)類型相關:bool,int,float,complex
數(shù)字——進制轉換相關:bin,oct,hex
數(shù)字——數(shù)學運算:abs,divmod,min,max,sum,round,pow
?
和數(shù)據(jù)結構相關
序列——列表和元組相關的: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)) bytearray ret = memoryview(bytes('你好',encoding='utf-8')) print(len(ret)) print(bytes(ret[:3]).decode('utf-8')) print(bytes(ret[3:]).decode('utf-8')) memoryview?
序列:reversed,slice
l = (1,2,23,213,5612,342,43) print(l) print(list(reversed(l))) reversed l = (1,2,23,213,5612,342,43) sli = slice(1,5,2) print(l[sli]) slice?
數(shù)據(jù)集合——字典和集合:dict,set,frozenset
數(shù)據(jù)集合:len,sorted,enumerate,all,any,zip,filter,map
filter和map:https://www.cnblogs.com/jiadi321/p/9804518.html
sorted方法:http://www.cnblogs.com/Eva-J/articles/7265992.html
?
返回頂部匿名函數(shù)
匿名函數(shù):為了解決那些功能很簡單的需求而設計的一句話函數(shù)
#這段代碼 def calc(n):return n**n print(calc(10))#換成匿名函數(shù) calc = lambda n:n**n print(calc(10))上面是我們對calc這個匿名函數(shù)的分析,下面給出了一個關于匿名函數(shù)格式的說明
函數(shù)名 = lambda 參數(shù) :返回值#參數(shù)可以有多個,用逗號隔開 #匿名函數(shù)不管邏輯多復雜,只能寫一行,且邏輯執(zhí)行結束后的內(nèi)容就是返回值 #返回值和正常的函數(shù)一樣可以是任意數(shù)據(jù)類型我們可以看出,匿名函數(shù)并不是真的不能有名字。
匿名函數(shù)的調用和正常的調用也沒有什么分別。 就是 函數(shù)名(參數(shù)) 就可以了~~~
練一練:
請把以下函數(shù)變成匿名函數(shù) def add(x,y):return x+y?
上面是匿名函數(shù)的函數(shù)用法。除此之外,匿名函數(shù)也不是浪得虛名,它真的可以匿名。在和其他功能函數(shù)合作的時候
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面試題練一練
現(xiàn)有兩個元組(('a'),('b')),(('c'),('d')),請使用python中匿名函數(shù)生成列表[{'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)]) coding 1.下面程序的輸出結果是: d = lambda p:p*2 t = lambda p:p*3 x = 2 x = d(x) x = t(x) x = d(x) print x2.現(xiàn)有兩元組(('a'),('b')),(('c'),('d')),請使用python中匿名函數(shù)生成列表[{'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的定義來產(chǎn)生期望的結果。 練習?
返回頂部本章小結
說學習內(nèi)置函數(shù),不如說整理自己的知識體系。其實整理這些內(nèi)置函數(shù)的過程也是在整理自己的知識體系。
我們講課的時候會歸類:常用或者不常用,主要還是根據(jù)場景而言。
一個優(yōu)秀的程序員就應該是在該用這個方法的時候信手拈來,把每一個內(nèi)置的函數(shù)都用的恰到好處。
要想做到這一點,至少要先了解,才能在需要的時候想起,進而將它用在該用的地方。
但是在這里,我還是以自己的一點經(jīng)驗之談,把幾個平時工作中相對更常用的方法推薦一下,請務必重點掌握:
其他:input,print,type,hash,open,import,dir
str類型代碼執(zhí)行:eval,exec
數(shù)字:bool,int,float,abs,divmod,min,max,sum,round,pow
序列——列表和元組相關的:list和tuple
序列——字符串相關的:str,bytes,repr
序列:reversed,slice
數(shù)據(jù)集合——字典和集合:dict,set,frozenset
數(shù)據(jù)集合:len,sorted,enumerate,zip,filter,map
參考文檔:
https://docs.python.org/3/library/functions.html#object
轉載于:https://www.cnblogs.com/jiadi321/p/9804563.html
總結
以上是生活随笔為你收集整理的python之路——内置函数和匿名函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac安装RocketMQ和可视化控制台
- 下一篇: 【Python 学习_第2周_程序代码】