Python基础day4 函数对象、生成器 、装饰器、迭代器、闭包函数
一、函數(shù)對(duì)象
正確理解 Python函數(shù),能夠幫助我們更好地理解 Python 裝飾器、匿名函數(shù)(lambda)、函數(shù)式編程等高階技術(shù)。
函數(shù)(Function)作為程序語(yǔ)言中不可或缺的一部分,太稀松平常了。但函數(shù)作為第一類對(duì)象(First-Class Object)卻是 Python 函數(shù)的一大特性。那到底什么是第一類對(duì)象(First-Class Object)呢?
在 Python 中萬(wàn)物皆為對(duì)象,函數(shù)作為第一類對(duì)象有如下特性:
#函數(shù)身為一個(gè)對(duì)象,擁有對(duì)象模型的三個(gè)通用屬性:id(內(nèi)存地址)、類型、和值 def foo(text):return len(text)print(type(foo)) #函數(shù)類型 print(id(foo))#函數(shù)id 內(nèi)存地址 print(foo)#函數(shù)值?
- 可以作為變量賦值
#!/usr/bin/env python # -*- coding:utf-8 -*- def foo():print('from foo')foo() func=foo #引用,賦值 print(foo) print(func) func()
輸出:
from foo
內(nèi)存地址一樣說(shuō)明func引用的是foo函數(shù)地址,也就是foo將地址賦值給func變量
<function foo at 0x0000000002063E18>
<function foo at 0x0000000002063E18>
- 可以作為容器類型(集合)的元素
- 作為參數(shù)傳遞給其他函數(shù)
show(foo)
- 可以作函數(shù)的返回值
- 函數(shù)嵌套
def f1():#第一步進(jìn)入f1函數(shù)
def f2():#第二部f1函數(shù)體中有f2函數(shù)聲明
print('from f2')
def f3():#第四部f2函數(shù)體中有f3函數(shù)聲明
print('from f3')
f3()#第五部f2函數(shù)體中運(yùn)行f3函數(shù)
f2()#第三部f1函數(shù)體重運(yùn)行f2內(nèi)容
f1()
?
二、命名空間與作用域
1.命名空間定義
命名空間是名字和對(duì)象的映射,就像是字典,key是變量名,value是變量的值
#定義名字的方法 import time name='egon' #定義變量 def func(): #定義函數(shù)passclass Foo:#定義類pass2.命名空間的分類
- 內(nèi)置名稱空間: 隨著python解釋器的啟動(dòng)而產(chǎn)生,包括異常類型、內(nèi)建函數(shù)和特殊方法,可以代碼中任意地方調(diào)用
- 全局名稱空間:文件的執(zhí)行會(huì)產(chǎn)生全局名稱空間,指的是文件級(jí)別定義的名字都會(huì)放入該空間
- 局部名稱空間:調(diào)用函數(shù)時(shí)會(huì)產(chǎn)生局部名稱空間,只在函數(shù)調(diào)用時(shí)臨時(shí)綁定,調(diào)用結(jié)束解綁定
?
x=10000 #全局 def func():x=1 #局部def f1():pass?
3.作用域
?
- 1. 全局作用域:內(nèi)置名稱空間,全局名層空間
- 2. 局部作用:局部名稱空間
x=1#全局 def func():x=2#x作用域優(yōu)先從局部中查找print(x)sum=123123print(sum) func() 查看全局作用域內(nèi)的名字:gloabls()
查看局局作用域內(nèi)的名字:locals()
全局作用域的名字:
全局作用域:全局有效,在任何位置都能被訪問到,除非del刪掉,否則會(huì)一直存活到文件執(zhí)行完畢
?
局部作用域的名字:局部有效,只能在函數(shù)里(局部范圍調(diào)用),只在函數(shù)調(diào)用時(shí)才有效,調(diào)用結(jié)束就失效
? x=1000def func(y):
x=2
print(locals())#查詢func函數(shù)使用的局部{'x': 2, 'y': 1}
print(globals())#查看使用的全局
func(1)
三、閉包函數(shù)
1.定義在內(nèi)部函數(shù),包含對(duì)外部作用域非全局作用域的引用,該內(nèi)部函數(shù)就成為閉包函數(shù)
?
def f1():x = 1#x全局不可見def f2():print(x)#調(diào)用外部作用域xreturn f2#將內(nèi)部函數(shù)返回f=f1()#得到f2 f()# f2()?
2.閉包函數(shù)應(yīng)用:惰性計(jì)算
from urllib.request import urlopen#爬床老方法 def index(url):def get():return urlopen(url).read()return get #oldboy= get()函數(shù) 存放在內(nèi)存中還未執(zhí)行 oldboy=index('http://crm.oldboyedu.com') #調(diào)用后才執(zhí)行,什么時(shí)候用什么時(shí)候執(zhí)行 print(oldboy().decode('utf-8')) 閉包函數(shù)相對(duì)與普通函數(shù)會(huì)多出一個(gè)__closure__的屬性,里面定義了一個(gè)元組用于存放所有的cell對(duì)象,每個(gè)cell對(duì)象一一保存了這個(gè)閉包中所有的外部變量
# print(oldboy.__closure__[0].cell_contents) res=urlopen('http://crm.oldboyedu.com').read()print(res.decode('utf-8'))
四、裝飾器
1.什么是裝飾器
裝飾別人的工具,修飾添加功能,工具指的是函數(shù),裝飾器本身可以使任何可調(diào)用對(duì)象,被裝飾的對(duì)象也可以使任何可調(diào)用對(duì)象。
2.為什么要用裝飾器
- 開放封閉原則:對(duì)修改時(shí)封閉的,對(duì)擴(kuò)招是開放的
- 裝飾器就是為了在不修改被裝飾對(duì)象的源代碼以及調(diào)用方式的前提下,為其添加新功能
?
裝飾器的功能是將被裝飾的函數(shù)當(dāng)作參數(shù)傳遞給與裝飾器對(duì)應(yīng)的函數(shù)(名稱相同的函數(shù)),并返回包裝后的被裝飾的函數(shù)”
直接看示意圖,其中 a 為與裝飾器 @a 對(duì)應(yīng)的函數(shù), b 為裝飾器修飾的函數(shù),裝飾器@a的作用是:
簡(jiǎn)而言之:@a 就是將 b 傳遞給 a(),并返回新的 b = a(b)
1.無(wú)返回值的修飾器
import time def timmer(func):def wrapper(*args,**kwargs):start_time=time.time()#運(yùn)行函數(shù)前紀(jì)錄開始時(shí)間func(*args,**kwargs)#裝飾器執(zhí)行函數(shù)(*args,**kwargs)可接受任意長(zhǎng)度任意類型stop_time=time.time()#裝飾器函體運(yùn)行完成后紀(jì)錄結(jié)束時(shí)間print('run time is %s' %(stop_time-start_time))#結(jié)束時(shí)間減去開始時(shí)間就是裝飾器修飾的函數(shù)運(yùn)行時(shí)間return wrapper#返回裝飾器函數(shù)給timmer@timmer# index = timmer(index) def index():#time.sleep(3)print('welcome to index') if __name__ == '__main__':index()#相當(dāng)于執(zhí)行 index = timeer(index)f=timmer(index)
print(f)
f() #wrapper()---->index()
index=timmer(index) #index==wrapper
index() #wrapper()----->
2.有返回值的
?
def timmer(func):def wapper(*args,**kwargs):start_time = time.time()sum = func(*args,**kwargs)end_time = time.time()# print("用時(shí)%s"%(end_time-start_time))return sum,(end_time-start_time)#將index函數(shù)的計(jì)算結(jié)果sum以及 用時(shí)返回return wapper @timmer def index(x,y=4):time.sleep(1)return x+y if __name__ == '__main__':p = index(3)print(p)?
3.模擬用戶登錄驗(yàn)證是否有session
#全局變量紀(jì)錄登陸狀態(tài) login_user ={"user":None,"status":False} def auth(func):def wrapper(*args,**kwargs):if login_user["user"] and login_user["status"]:#判斷用戶狀態(tài)user = none是falseres = func(*args,**kwargs)return reselse:#否則輸入用戶名密碼驗(yàn)證name = input('user:')password = input("password:")if name == "hanjialong" and password == "123456":#如果驗(yàn)證通過后在執(zhí)行l(wèi)ogin_user["user"] = "hanjialong"login_user["status"] = Trueprint("'\033[45mlogin successful\033[0m'")res = func(*args,**kwargs)return resreturn wrapper @auth def index():print("歡迎登陸") @auth def home(name):print("%s welconme to home page"%name)if __name__ == '__main__':index()home("韓佳龍")4.裝飾器疊加執(zhí)行順序
?
def timmer(func):def wapper(*args,**kwargs):start_time = time.time()res = func(*args,**kwargs)end_time = time.time()print("用時(shí)%s"%(end_time-start_time))return resreturn wapper#全局變量紀(jì)錄登陸狀態(tài) login_user ={"user":None,"status":False} def auth(func):def wrapper(*args,**kwargs):if login_user["user"] and login_user["status"]:#判斷用戶狀態(tài)user = none是falseres = func(*args,**kwargs)return reselse:#否則輸入用戶名密碼驗(yàn)證name = input('user:')password = input("password:")if name == "hanjialong" and password == "123456":#如果驗(yàn)證通過后在執(zhí)行l(wèi)ogin_user["user"] = "hanjialong"login_user["status"] = Trueprint("'\033[45mlogin successful\033[0m'")res = func(*args,**kwargs)return resreturn wrapper @auth @timmer def index():print("歡迎登陸") @auth @timmer def home(name):print("%s welconme to home page"%name)if __name__ == '__main__':index()home("韓佳龍")?
5.有參裝飾器
?
user_login = {"user":None,"status":False} def aut(dirver="file"):3#帶參數(shù)的裝飾器比不帶參數(shù)的多一層 裝飾器最多就三層函數(shù)def aut1(fuch):def wrapper(*args,**kwargs):if dirver = "file":if user_login["user"] and user_login["status"]:res = fuch(*args,**kwargs)return reselse:name = input("user:")pwd= input("passworld:")if name = "hanjialong" and pwd = "123456":res = fuch(*args,**kwargs)return reselse:print('\033[45mlogin err\033[0m')elif dirver = 'mysql':if user_login["user"] and user_login["status"]:res = fuch(*args,**kwargs)return reselse:name = input("user:")pwd= input("passworld:")if name = "hanjialong" and pwd = "123456":res = fuch(*args,**kwargs)return reselif dirver = 'ldap':if user_login["user"] and user_login["status"]:res = fuch(*args,**kwargs)return reselse:name = input("user:")pwd= input("passworld:")if name = "hanjialong" and pwd = "123456":res = fuch(*args,**kwargs)return reselse:print("未知認(rèn)證")return wrapper@auth('file') #@auth2====>index=auth2(index)===>index=auth_wrapper @timmer #index=timmer(auth_wrapper) #index=timmer_wrapper def index():time.sleep(3)print('welcome to index page') @auth(driver='mysql') def home(name):print('%s welcome to home page' %name) index() #timmer_wrapper() # home('egon') #wrapper('egon'?五、迭代器
1.什么是迭代器
重復(fù)執(zhí)行并且迭代結(jié)果作為下一次迭代的初始值,這個(gè)重復(fù)的過程稱為迭代每次重復(fù),并且每次迭代的結(jié)果是下一次迭代的初始值
?
#案例1 while True: #只滿足重復(fù),因而不是迭代print('====>')#案例2#以下才是迭代 l = [1, 2, 3] count = 0 while count < len(l): # 只滿足重復(fù),因而不是迭代print('====>', l[count])count += 1 l = (1, 2, 3)
count = 0
while count < len(l): # 只滿足重復(fù),因而不是迭代
print('====>', l[count])
count += 1
s='hello'
count = 0
while count < len(s):
print('====>', s[count])
count += 1
?
2.為什么要使用迭代器
對(duì)于沒有索引的數(shù)據(jù)類型,必須提供一種不依賴索引的迭代方式
可迭代的對(duì)象:內(nèi)置__iter__方法的,都是可迭代的對(duì)象
迭代器:執(zhí)行__iter__方法,得到的結(jié)果就是迭代器,迭代器對(duì)象有__next__方法
?
?
#有_iter_()方法的都是課迭代對(duì)象 # [1,2].__iter__() # 'hello'.__iter__() # (1,2).__iter__() # # {'a':1,'b':2}.__iter__() # {1,2,3}.__iter__()# i=[1,2,3].__iter__()
#
# print(i)
#
# print(i.__next__())
# print(i.__next__())
# print(i.__next__())
# print(i.__next__()) #拋出異常:StopIteration
#使用迭代遍歷字典 dic={'a':1,'b':2,'c':3}
i=dic.__iter__()
while True:
try:
key=i.__next__()
print(dic[key])
except StopIteration:
break
?
3.如何判斷一個(gè)對(duì)象是可迭代的對(duì)象,還是迭代器對(duì)象
?
#有iter是可迭代對(duì)象 # 'abc'.__iter__() 字符串 # ().__iter__() 元祖tuple # [].__iter__() 列表list # {'a':1}.__iter__() 字典dict # {1,2}.__iter__() 集合set # f=open('a.txt','w') 文件file # f.__iter__()?
- 可迭代對(duì)象:只有__iter__方法,執(zhí)行該方法得到的迭代器對(duì)象
from collections import Iterable,Iterator print(isinstance('abc',Iterable)) print(isinstance([],Iterable)) print(isinstance((),Iterable)) print(isinstance({'a':1},Iterable)) print(isinstance({1,2},Iterable)) f = open('a.txt','w') print(isinstance(f,Iterable)) 結(jié)果: True True True True True True
- 迭代器對(duì)象:對(duì)象有__next__,對(duì)象有__iter__,對(duì)于迭代器對(duì)象來(lái)說(shuō),執(zhí)行__iter__方法,得到的結(jié)果仍然是它本身
1.迭代對(duì)象
# 只有文件是迭代器對(duì)象 from collections import Iterable,Iterator print(isinstance('abc',Iterator)) print(isinstance([],Iterator)) print(isinstance((),Iterator)) print(isinstance({'a':1},Iterator)) print(isinstance({1,2},Iterator)) f = open('a.txt','w') print(isinstance(f,Iterator)) 結(jié)果: False False False False False True2.迭代器
?
# 對(duì)象有__iter__,對(duì)于迭代器對(duì)象來(lái)說(shuō),執(zhí)行__iter__方法,得到的結(jié)果仍然是它本身 f = open("a.txt","r") t=f.__iter__() print(t) print(f) print(f is t)#f 結(jié)果和t結(jié)果比較是True # 可迭代對(duì)象list,可以看出就是一個(gè)迭代器 l = [] i = l.__iter__() print(i) print(i.__iter__()) print(l)dic={'name':'egon','age':18,'height':'180'} # print(dic.items())# for k,v in dic.items(): # print(k,v)#通過迭代器方式 dic={'name':'egon','age':18,'height':'180'} i = dic.__iter__() while True:try:c = next(i)#d得到字典的所以key# print(c)print(dic[c])except StopIteration:break #for循環(huán)本身就是迭代器的實(shí)現(xiàn) dic={'name':'egon','age':18,'height':'180'} for i in dic:print(dic[i])l=['a','b',3,9,10] for i in l:print(i)with open('a.txt','r',encoding='utf-8') as f:for line in f:print(line)?
3.迭代器的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):
l=[10000,2,3,4,5] i=iter(l) print(next(i)) 2.就迭迭代器本身來(lái)說(shuō),更節(jié)省內(nèi)存
- 缺點(diǎn):
1. 無(wú)法獲取迭代器對(duì)象的長(zhǎng)度
2. 不如序列類型取值靈活,是一次性的,只能往后取值,不能往前退
六、生產(chǎn)器函數(shù)
只要函數(shù)體包含yield關(guān)鍵字,該函數(shù)就是生成器函數(shù),生成器就是迭代器
1.生成器寫法
普通函數(shù)結(jié)果只能有一個(gè) def foo():return 1return 2return 3return 4res1=foo() print(res1)res2=foo() print(res2) 結(jié)果: 1 1#生成器就是迭代器 def foo():print('first')yield 1print('second')yield 2print('third')yield 3print('fourth')yield 4print('fifth') # print(next(g)) #觸發(fā)迭代器g的執(zhí)行,進(jìn)而觸發(fā)函數(shù)的執(zhí)行 g=foo() for i in g: print(i) 結(jié)果: first 1 second 2 third 3 fourth 4 fifth2.生成器應(yīng)用
def counter(n):print('start...')i=0while i < n:yield ii+=1print('end...')counter(5) g=counter(5) # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) for i in g:print(i)總結(jié)
a. 相當(dāng)于為函數(shù)封裝好__iter__和__next__
b. return只能返回一次值,函數(shù)就終止了,而yield能返回多次值,每次返回都會(huì)將函數(shù)暫停,下一次next會(huì)從上一次暫停的位置繼續(xù)執(zhí)行
?
#模擬#tail -f a.txt | grep 'python'import time def tail(filepath):"""tail功能:param filepath: 文件路徑:return: 相當(dāng)于return文件最后一行,后等待文件輸入"""with open(filepath,encoding='utf-8') as f:"""seek(offset,whence=0)offset:開始的偏移量,也就是代表需要移動(dòng)偏移的字節(jié)數(shù)whence:給offset參數(shù)一個(gè)定義,表示要從哪個(gè)位置開始偏移;0代表從文件開頭開始算起,1代表從當(dāng)前位置開始算起,2代表從文件末尾算起。默認(rèn)為0"""f.seek(0,2)while True:line=f.readline().strip()if line:yield lineelse:time.sleep(0.2)# t=tail('a.txt') # # for line in t: # print(line)def grep(pattern,lines):for line in lines:if pattern in line:#如果內(nèi)容中有patern字符yield line#返回line字符并等待下次輸入# for i in g: # print(i) if __name__ == '__main__':t = tail('a.txt')#返回內(nèi)存地址g = grep('python',t)for i in g:print(i)?
七、內(nèi)置函數(shù)
| abs() | divmod() | input() | open() | staticmethod() |
| all() | enumerate() | int() | ord() | str() |
| any() | eval() | isinstance() | pow() | sum() |
| basestring() | execfile() | issubclass() | print() | super() |
| bin() | file() | iter() | property() | tuple() |
| bool() | filter() | len() | range() | type() |
| bytearray() | float() | list() | raw_input() | unichr() |
| callable() | format() | locals() | reduce() | unicode() |
| chr() | frozenset() | long() | reload() | vars() |
| classmethod() | getattr() | map() | repr() | xrange() |
| cmp() | globals() | max() | reversed() | zip() |
| compile() | hasattr() | memoryview() | round() | __import__() |
| complex() | hash() | min() | set() | apply() |
| delattr() | help() | next() | setattr() | buffer() |
| dict() | hex() | object() | slice() | coerce() |
| dir() | id() | oct() | sorted() | intern() |
- abs 返回一個(gè)數(shù)字的絕對(duì)值
結(jié)果: 1000
- all?如果iterable的所有元素不為0、''、False或者iterable為空,all(iterable)返回True,否則返回False
注意:空元組、空列表返回值為True,這里要特別注意
print(all(['a', 'b', 'c', 'd'])) #列表list,元素都不為空或0 print(all(['a', 'b', '', 'd'])) #列表list,存在一個(gè)為空的元素 print(all([0,1,2,3])) #列表list,存在一個(gè)為0的元素 print(all(('a', 'b', 'c', 'd'))) #元組tuple,元素都不為空或0 print(all(('a', 'b', '', 'd'))) #元組tuple,存在一個(gè)為空的元素 print(all((0,1,2,3))) #元組tuple,存在一個(gè)為0的元素 print(all([])) # 空列表 print(all(())) # 空元組結(jié)果: True False False True False False True True
- any()
如果所有元素中有一個(gè)值非0、''或非False,那么結(jié)果就為True,當(dāng)iterable所有的值都是0、''或False時(shí),那么結(jié)果為False
print(any(['a', 'b', 'c', 'd'])) #列表list,元素都不為空或0 print(any(['a', 'b', '', 'd'])) #列表list,存在一個(gè)為空的元素 print(any([0,1,2,3])) #列表list,存在一個(gè)為0的元素 print(any(('a', 'b', 'c', 'd'))) #元組tuple,元素都不為空或0 print(any(('a', 'b', '', 'd'))) #元組tuple,存在一個(gè)為空的元素 print(any((0,1,2,3))) #元組tuple,存在一個(gè)為0的元素 print(any([])) # 空列表 print(any(())) # 空元組結(jié)果 True True True True True True False False
- ?ascii()
調(diào)用對(duì)象的__repr__()方法,獲得該方法的返回值
print(ascii([1,2,3,1,22,123])) #[1, 2, 3, 1, 22, 123]
- bin() ?
將十進(jìn)制數(shù)分別轉(zhuǎn)換為2進(jìn)制
print(bin(10)) #0b1010- bool()
測(cè)試一個(gè)對(duì)象是True還是False
print(bool([])) #False- bytes()
將一個(gè)字符串轉(zhuǎn)換成字節(jié)類型
s="apple" v=bytes(s,encoding="utf-8") print(v) #b'apple'- callable(object)
callable()函數(shù)用于測(cè)試對(duì)象是否可調(diào)用,如果可以則返回1(真);否則返回0(假)。可調(diào)用對(duì)象包括函數(shù)、方法、代碼對(duì)象、類和已經(jīng)定義了 調(diào)用 方法的類實(shí)例。
a = '123' print(callable(a)) #False
- chr(i)
chr()函數(shù)返回ASCII碼對(duì)應(yīng)的字符串。
print(chr(65)) #A?
- complex(real[,imaginary])
complex()函數(shù)可把字符串或數(shù)字轉(zhuǎn)換為復(fù)數(shù)。
print(complex(2,1)) #(2+1j)?
- delattr()
刪除對(duì)象的屬性
?
- dict()
創(chuàng)建數(shù)據(jù)字典
?
print(dict()) #{}?
- dir()
不帶參數(shù)時(shí)返回當(dāng)前范圍內(nèi)的變量,方法和定義的類型列表,帶參數(shù)時(shí)返回參數(shù)的屬性,方法列表
?
print(dir()) ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'time']?
- divmod(x,y)
divmod(x,y)函數(shù)完成除法運(yùn)算,返回商和余數(shù)。
print(divmod(10,3)) #(3, 1)?
- enumerate()
返回一個(gè)可以枚舉的對(duì)象,該對(duì)象的next()方法將返回一個(gè)元組
s = ["a","b","c"] for i ,v in enumerate(s,1):print(i,v) 1 a 2 b 3 c??
- eval()
將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果
s = "1 + 3 +5" print(eval(s)) #9?
- exec()
執(zhí)行字符串或complie方法編譯過的字符串,沒有返回值
?
- float(x)
float()函數(shù)把一個(gè)數(shù)字或字符串轉(zhuǎn)換成浮點(diǎn)數(shù)。
?
print(float("12")) #12.0?
- format()
格式化輸出字符串
print("i am {0},age{1}".format("tom",18)) i am tom,age18?
- frozenset()
創(chuàng)建一個(gè)不可修改的集合
? ? ? ?set和frozenset最本質(zhì)的區(qū)別是前者是可變的,后者是不可變的。當(dāng)集合對(duì)象會(huì)被改變時(shí)(例如刪除,添加元素),只能使用set,
? ? ? ?一般來(lái)說(shuō)使用fronzet的地方都可以使用set。
? ? ? ?參數(shù)iterable:可迭代對(duì)象。
?
?
- globals()
返回一個(gè)描述當(dāng)前全局變量的字典
a = "apple" print(globals()) {'__package__': None, '__file__': '/Users/hexin/PycharmProjects/py3/day4/2.py', '__name__': '__main__', 'a': 'apple', 'time': <module 'time' (built-in)>, '__cached__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10bd73c88>, '__builtins__': <module 'builtins' (built-in)>, '__spec__': None, '__doc__': None}?
- ?hash()
哈希值hash(object)注意:可哈希的即不可變數(shù)據(jù)類型,不可哈希即可變數(shù)據(jù)類型
如果對(duì)象object為哈希表類型,返回對(duì)象object的哈希值。哈希值為整數(shù),在字典查找中,哈希值用于快遞比價(jià)字典的鍵。
兩個(gè)數(shù)值如果相等,則哈希值也相等。
?
- help()
返回對(duì)象的幫助文檔
調(diào)用內(nèi)建的幫助系統(tǒng),如果不包含參數(shù),交互式幫助系統(tǒng)將在控制臺(tái)啟動(dòng)。如果參數(shù)為字串,則可以是模塊,類,方法等名稱,并且?guī)椭?yè)面將會(huì)在控制臺(tái)打印。參數(shù)也可以為任意對(duì)象
?
- hex(x)
hex()函數(shù)可把整數(shù)轉(zhuǎn)換成十六進(jìn)制數(shù)。
print(hex(12)) #0xc?
- id()
返回對(duì)象的內(nèi)存地址
a = "apple" print(id(a)) #4562197840?
- input()
獲取用戶輸入內(nèi)容
?
- int(x[,base])
int()函數(shù)把數(shù)字和字符串轉(zhuǎn)換成一個(gè)整數(shù),base為可選的基數(shù)。
?
- iter()
返回一個(gè)iterator對(duì)象。
?
- len()函數(shù)返回字符串和序列的長(zhǎng)度。
?
- list(x)
list()函數(shù)可將序列對(duì)象轉(zhuǎn)換成列表。
print(list("hello world")) ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']?
- ?locals()
打印當(dāng)前可用的局部變量的字典
?
- max(x[,y,z...])
max()函數(shù)返回給定參數(shù)的最大值,參數(shù)可以為序列。
print(max(1,2,3,4)) #4?
- min(x[,y,z...])
min()函數(shù)返回給定參數(shù)的最小值,參數(shù)可以為序列。
print(min(1,2,3,4)) #1?
- next()
返回一個(gè)可迭代數(shù)據(jù)結(jié)構(gòu)(如列表)中的下一項(xiàng)
?
- object()
獲取一個(gè)新的,無(wú)特性(geatureless)對(duì)象。Object是所有類的基類。它提供的方法將在所有的類型實(shí)例中共享。
?
- oct(x)
oct()函數(shù)可把給出的整數(shù)轉(zhuǎn)換成八進(jìn)制數(shù)。
print(oct(12)) #0o14?
- ord(x)
ord()函數(shù)返回一個(gè)字符串參數(shù)的ASCII碼或Unicode值。
print(ord("a")) #97?
- open()
打開文件open(filename [, mode [, bufsize]])
打開一個(gè)文件,返回一個(gè)file對(duì)象。 如果文件無(wú)法打開,將處罰IOError異常
?
- pow(x,y[,z])
pow()函數(shù)返回以x為底,y為指數(shù)的冪。如果給出z值,該函數(shù)就計(jì)算x的y次冪值被z取模的值。
print(pow(2,5)) #32 print(pow(2,5,3)) #2?
- range([lower,]stop[,step])
range()函數(shù)可按參數(shù)生成連續(xù)的有序整數(shù)列表。
print(range(1,10,2)) #range(1, 10, 2)?
- repr()
將任意值轉(zhuǎn)換為字符串,供計(jì)時(shí)器讀取的形式
?
- reversed()
反轉(zhuǎn),逆序?qū)ο?/p>
?
- round(x[,n])
round()函數(shù)返回浮點(diǎn)數(shù)x的四舍五入值,如給出n值,則代表舍入到小數(shù)點(diǎn)后的位數(shù)。
print(round(5.9)) #6?
- set()
將對(duì)象轉(zhuǎn)換成集合
?
- slice()
切片功能
s = ["a","b""c","d"] print(slice(1,3,s)) slice(1, 3, ['a', 'bc', 'd'])?
- sorted()
排序
列表排序,按數(shù)軸方向排,高階函數(shù),以絕對(duì)值大小排序,字符串排序,按照ASCII的大小排序,如果需要排序的是一個(gè)元組,則需要使用參數(shù)key,也就是關(guān)鍵字。反向排序,reserve=True
?
- str(obj)
str()函數(shù)把對(duì)象轉(zhuǎn)換成可打印字符串。
print(str(4)) #4?
- sum()
求和
?
- tuple(x)
tuple()函數(shù)把序列對(duì)象轉(zhuǎn)換成tuple。
print(tuple("hello world")) ('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd')?
?
- type(obj)
type()函數(shù)可返回對(duì)象的數(shù)據(jù)類型。
print(type('123')) print(type(1)) <class 'str'> <class 'int'>?
- vars()
本函數(shù)是實(shí)現(xiàn)返回對(duì)象object的屬性和屬性值的字典對(duì)象。如果默認(rèn)不輸入?yún)?shù),就打印當(dāng)前調(diào)用位置的屬性和屬性值,相當(dāng)于locals()的功能。如果有參數(shù)輸入,就只打印這個(gè)參數(shù)相應(yīng)的屬性和屬性值。
print(vars())#{'__name__': '__main__', '__spec__': None, '__package__': None, '__builtins__': <module 'builtins' (built-in)>, 'time': <module 'time' (built-in)>, '__cached__': None, '__doc__': None, '__file__': '/Users/hexin/PycharmProjects/py3/day4/2.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10e5f3c88>} print(vars(time))- ?zip()
將對(duì)象逐一配對(duì)
s='helloo' l=[1,2,3,4,5]z=zip(s,l) print(z) for i in z:print(i)結(jié)果 <zip object at 0x1051d1608> ('h', 1) ('e', 2) ('l', 3) ('l', 4) ('o', 5) ?
轉(zhuǎn)載于:https://www.cnblogs.com/hanjialong/p/6895698.html
總結(jié)
以上是生活随笔為你收集整理的Python基础day4 函数对象、生成器 、装饰器、迭代器、闭包函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Robots at Warehouse(
- 下一篇: bootstrap table教程--使