楔子
在講新知識之前,我們先來復習復習函式的基礎知識,
問:函式怎么呼叫?
函式名()
如果你們這么說,,,那你們就對了!好了記住這個事兒別給忘記了,咱們繼續談下一話題,,,
來你們在自己的環境里列印一下自己的名字,
你們是怎么打的呀?
是不是print('xxx'),好了,現在你們結合我剛剛說的函式的呼叫方法,你有沒有什么發現?
我們就猜,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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/194770.html
標籤:Python
上一篇:2-第一個Django程式
下一篇:Python_遞回函式
