dict下如何取值_年薪百萬之路--第十七天 裝飾器(下)和迭代器

0c66a01fb5313ca508428c7bcf723b97.png

一 有參裝飾器

>帶有參數的函數裝飾器

為被裝飾對象添加認證功能的裝飾器,實現的基本形式如下

def deco(func):def wrapper(*args,**kwargs):編寫基于文件的認證,認證通過則執行res=func(*args,**kwargs),并返回resreturn wrapper

如果想提供多種不同的認證方式以供選擇,單從wrapper函數的實現角度改寫如下

def auth(func,db_type):def wrapper(*args, **kwargs):name=input('your name>>>: ').strip()pwd=input('your password>>>: ').strip()if db_type == 'file':print('基于文件的驗證')if name == 'egon' and pwd == '123':res = func(*args, **kwargs)return reselse:print('user or password error')elif db_type == 'mysql':print('基于mysql的驗證')elif db_type == 'ldap':print('基于ldap的驗證')else:print('不支持該db_type')return wrapper

函數wrapper需要一個driver參數,而函數deco與wrapper的參數都有其特定的功能,不能用來接受其他類別的參數,可以在deco的外部再包一層函數auth,用來專門接受額外的參數,這樣便保證了在auth函數內無論多少層都可以引用到

def auth(db_type):def deco(func):def wrapper(*args, **kwargs):name = input('your name>>>: ').strip()pwd = input('your password>>>: ').strip()if db_type == 'file':print('基于文件的驗證')if name == 'egon' and pwd == '123':res = func(*args, **kwargs)  # index(1,2)return reselse:print('user or password error')elif db_type == 'mysql':print('基于mysql的驗證')elif db_type == 'ldap':print('基于ldap的驗證')else:print('不支持該db_type')return wrapperreturn deco

想要保留原函數的文檔和函數名屬性,需要修正裝飾器

def timer(func):def wrapper(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs)stop_time=time.time()print('run time is %s' %(stop_time-start_time))return reswrapper.__doc__=func.__doc__wrapper.__name__=func.__name__return wrapper

上述方式來實現保留原函數屬性過于麻煩,functools模塊下提供一個裝飾器wraps專門用來

from functools import wrapsdef timer(func):@wraps(func)def wrapper(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs)stop_time=time.time()print('run time is %s' %(stop_time-start_time))return resreturn wrapper

>帶有參數的類裝飾器

#參數1 : 給修飾的類添加成員屬性和方法
#參數2 : 給類中的run方法變成屬性class Kuozhan():ad = "我是屬性"def char(self):print("我是方法")def __init__(self,num):self.num = numdef __call__(self,cls):print(cls)if self.num == 1:return self.kuozhan1(cls)elif self.num == 2:return self.kuozhan2(cls)#參數1的情況:添加成員屬性和方法def kuozhan1(self,cls):def newfunc():cls.ad = Kuozhan.adcls.money = Kuozhan.moneyreturn cls()return newfunc#參數2的情況:把方法變成屬性def kuozhan2(self,cls):def newfunc():if "run" in cls.__dict__:cls.run = cls.run()return cls()return newfunc
#
@Kuozhan(1)
class MyClass():def run():return "運動"
obj = MyClass()
print(obj.ad)
obj.money()#
@Kuozhan(2)
class MyClass():def run():return "運動"
obj = MyClass()
print(obj.run)

>property

可以把方法變成屬性 : 可以動態的控制屬性的獲取,設置,刪除相關操作

@property 獲取屬性

@方法名.setter 設置屬性

@方法名.deleter 刪除屬性

class MyClass():def __init__(self,name):self.name = name@propertydef username(self):return self.name@username.setterdef username(self,val):self.name = valpass@username.delsterdef username(self):def self.namepass
obj = MyClass("小紅")
獲取指的時候自動觸發@property 裝飾器下的方法
res = obj.username
print(res)#設置值的時候自動觸發@username.setter裝飾器下的方法
obj.username = "小白"
print(obj.username)
class Myclass():def __init__(self,name):self.name = name #獲取數據def get_username(self):return self.name#設置數據def set_username(self,val):self.name = val#刪除數據def del_username(self):del self.name#參數的順序:獲取,設置,刪除username = property(get_username, set_username, del_username)obj = MyClass("小白")
#獲取值的時候,執行get_username下的相關操作
print(obj.username)
#設置值的時候,執行set_username下的相關操作
print(obj.username)
#刪除值的時候,執行del_username下的相關操作
del obj.username
print(obj.username)

二 迭代器

1、什么是迭代器
迭代器指的是迭代取值的工具,迭代是一個重復的過程,每次重復
都是基于上一次的結果而繼續的,單純的重復并不是迭代
2、為何要有迭代器
迭代器是用來迭代取值的工具,而涉及到把多個值循環取出來的類型
有:列表、字符串、元組、字典、集合、打開文件

l=['egon','liu','alex']i=0while i < len(l):print(l[i])i+=1

上述迭代取值的方式只適用于有索引的數據類型:列表、字符串、元組
為了解決基于索引迭代器取值的局限性
python必須提供一種能夠不依賴于索引的取值方式,這就是迭代器
3、如何用迭代器

1、可迭代的對象

從語法形式上講,內置有__iter__方法的對象都是可迭代對象,字符串、列表、元組、字典、集合、打開的文件都是可迭代對象

2、調用可迭代對象下的__iter__方法會將其轉換成迭代器對象

3、可迭代對象與迭代器對象詳解
可迭代對象("可以轉換成迭代器的對象"):內置有__iter__方法對象
可迭代對象.__iter__(): 得到迭代器對象
迭代器對象:內置有__next__方法并且內置有__iter__方法的對象
迭代器對象.__next__():得到迭代器的下一個值
迭代器對象.__iter__():得到迭代器的本身

4、可迭代對象:字符串、列表、元組、字典、集合、文件對象
迭代器對象:文件對象

5、for循環的工作原理:for循環可以稱之為叫迭代器循環,in后可以跟任意可迭代對象

1、d.__iter__()得到一個迭代器對象
2、迭代器對象.__next__()拿到一個返回值,然后將該返回值賦值給k
3、循環往復步驟2,直到拋出StopIteration異常for循環會捕捉異常然后結束循環

6、迭代器優缺點總結
6.1 優點:
I、為序列和非序列類型提供了一種統一的迭代取值方式。
II、惰性計算:迭代器對象表示的是一個數據流,可以只在需要時才去調用next來計算出一個值,就迭代器本身來說,同一時刻在內存中只有一個值,因而可以存放無限大的數據流,而對于其他容器類型,如列表,需要把所有的元素都存放于內存中,受內存大小的限制,可以存放的值的個數是有限的。
6.2 缺點:
I、除非取盡,否則無法獲取迭代器的長度
II、只能取下一個值,不能回到開始,更像是‘一次性的’,迭代器產生后的唯一目標就是重復執行next方法直到值取盡,否則就會停留在某個位置,等待下一次調用next;若是要再次迭代同個對象,你只能重新調用iter方法去創建一個新的迭代器對象,如果有兩個或者多個循環使用同一個迭代器,必然只會有一個循環能取到值。

三 生成器

如何得到自定義的迭代器:
在函數內一旦存在yield關鍵字,調用函數并不會執行函數體代碼
會返回一個生成器對象,生成器即自定義的迭代器

def func():print('第一次')yield 1print('第二次')yield 2print('第三次')yield 3print('第四次')觸發函數體代碼的運行,然后遇到yield停下來,將yield后的值
當做本次調用的結果返回
res1=g.__next__()
print(res1)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533420.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

英雄聯盟掉線怎么不顯示重新連接服務器,Win7旗艦版系統玩英雄聯盟掉線總是顯示正在嘗試重新連接如何解決...

英雄聯盟這款游戲想必大家都非常熟悉吧&#xff0c;然而在玩的過程中總是會碰到一些情況&#xff0c;比如有不少win7旗艦版系統用戶在玩英雄聯盟的時候&#xff0c;遇到掉線了&#xff0c;總是顯示正在嘗試重新連接&#xff0c;該怎么辦呢&#xff0c;本文就給大家講解一下Win7…

cobaltstrike擴展_Malwarebytes:使用可變C2下發Cobalt Strike的APT攻擊

6月中旬&#xff0c;Malwarebytes Labs的研究人員發現了一個偽裝成簡歷的惡意Word文檔&#xff0c;該文檔使用模板注入來刪除.Net Loader。研究人員認為這是與APT攻擊有關的多階段攻擊的第一部分。在最后階段&#xff0c;威脅行動者使用了Cobalt Strike’s Malleable C2功能來下…

c mvc ajax 返回下拉框,SpringMVC之ajax+select下拉框交互常用方式

Insert title here//ajaxselect三種常用交互方式window.οnlοadfunction(){test();}function test(){alert("執行");var start 0;var size100;var headNo "111111";$.ajax({type : "post",url : "/ssm_pms/admin_group/list", //此…

浙江大學計算機保研條件_【如何將保研成功率提至100%】來自取得浙大等五所頂尖院校保研資格學長的干貨分享(聯系導師章節已更)...

一、前言寫在開頭&#xff1a;白駒過隙&#xff0c;距離2020年9月28日保研系統確認擬錄取已經過去了四個半月了&#xff0c;期間多次有想要寫下從了解&#xff0c;到準備&#xff0c;到參與&#xff0c;到錄取的整個保研過程&#xff0c;同時分享一些自己踩過的雷&#xff0c;總…

怎么把BAK文件放入服務器中,BAK格式的備份文件如何導入審計軟件

首先&#xff1a;電腦上得安裝有SQL數據庫&#xff0c;并開啟&#xff1b;一般來說&#xff0c;只有以SQLSEVER數據庫存儲的都可以用數據庫軟件&#xff0c;對備份文進行取數&#xff1b;1)在審計系統里面導入bak&#xff0c;必須滿足前提條件&#xff1a;自己電腦上安裝有sqls…

貝殼如何docker安裝openwrt_OpenWrt 中 使用 Docker 安裝可道云出錯。

Nginx 和 PHP 鏡像&#xff1a;[email protected]:~# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEphp 7.2-fpm 2f2db309f0ae 2 weeks ago 365MBnginx latest 274c632b9f13 2 weeks ago 125MB容器代碼docker run --name myphp-fpm -v /opt/nginx/www:/www -d php:7.2-fp…

手機顯示無法接通服務器是怎么回事,手機無法接通是什么原因及如何解決【圖文】...

手機&#xff0c;已經成為我們日常生活中必不可缺少的電子產品&#xff0c;不論男女老少一般都配備有一部手機&#xff0c;有些人甚至配備了兩部、三部手機。手機的主要功能是通訊功能&#xff0c;給別人撥打電話或者接聽別人撥打的電話。有時候我們在撥打別人電話的時候可能會…

spark算子大全glom_(七)Spark Streaming 算子梳理 — repartition算子

目錄天小天&#xff1a;&#xff08;一&#xff09;Spark Streaming 算子梳理 — 簡單介紹streaming運行邏輯天小天&#xff1a;&#xff08;二&#xff09;Spark Streaming 算子梳理 — flatMap和mapPartitions天小天&#xff1a;&#xff08;三&#xff09;Spark Streaming 算…

爐石傳說服務器維護有補償嗎,爐石傳說維護公告全文及具體補償方案 爐石數據回檔怎么補償?...

爐石傳說超長維護事件的最終解決方法是回檔到1月14日&#xff0c;并且會有一定的補償&#xff0c;下面是官方公告各位親愛的爐石玩家&#xff0c;首先向大家抱以最誠摯的歉意&#xff0c;同時也感謝大家在游戲維護的這段時間的耐心等待以及關注。上周六下午(北京時間1月14日15:…

550什么意思_布草知識 | 都是羽絨,為什么價格大不同?

為什么羽絨的價格有些便宜有些這么貴呢&#xff1f;讓小編來告訴你&#xff01;市面上羽絨制品這么多&#xff0c;從幾百到上萬都有&#xff0c;中間的區別到底在哪里呢&#xff1f;接下來&#xff0c;我們就來說說&#xff0c;它們到底貴在哪里~01暖不暖&#xff0c;看蓬松度羽…

可調整大小的div_氣液增壓缸運行速度的調整以及壓力的調節方式

點擊藍字 關注我們增壓缸的行程及噸位絕對了設備整體速度&#xff0c;以下的調整只是在原基礎上起到微調的作用。(1)氣液增壓缸時間調整&#xff1a;增壓缸四個步驟動作是依靠時間繼電器來控制的&#xff0c;可根據不同的產品的需求&#xff0c;通過時間繼電器來調整每個步驟的…

pytest測試實戰 電子書_電子書丨Selenium 3+Python 3自動化測試項目實戰:從菜鳥到高手...

▊《Selenium 3Python 3自動化測試項目實戰&#xff1a;從菜鳥到高手》田春成 著電子書售價&#xff1a;39.5元2019年9月出版Selenium是目前非常流行的一種自動化測試工具。本書基于Python 3語言講述了新的Selenium 3的基本理論與操作&#xff0c;涉及各種高級應用&#xff0c;…

phpcms移動端和pc端_移動端調試大法

文章&#xff1a;樊秀寶(北京中心—小易F8技術小組)排版&#xff1a;suny在日常項目中的開發中&#xff0c;接觸移動端開發的小伙伴們免不了要和移動端調試打交道。本文總結了常用的移動端調試方法&#xff0c;歡迎大家學習和補充。01谷歌瀏覽器谷歌瀏覽器是我們前端開發中必不…

redis 中一個字段 修改map_CTO 指名點姓讓我帶頭沖鋒,熬了一個通宵,終于把Redis中7千萬個Key刪完了...

由于有一條業務線不理想&#xff0c;高層決定下架業務。對于我們技術團隊而言&#xff0c;其對應的所有服務器資源和其他相關資源都要釋放。釋放了 8 臺應用服務器&#xff1b;1 臺 ES 服務器&#xff1b;刪除分布式定時任務中心相關的業務任務&#xff1b;備份并刪除 MySQL 數…

太陽花圖片_長壽花扔水里,光長葉不開花?趕緊加點營養液

養個花可不簡單&#xff0c;春天一到還得操心換盆、換土&#xff0c;如果你像偷懶的話&#xff0c;還不如養些能水培的花&#xff0c;給它一杯水就夠了&#xff0c;實在太省心啦&#xff01;銅錢草銅錢草實在太好養了&#xff0c;摘一枝放在水杯里就能活&#xff0c;還挺有意境…

hystrix 全局熔斷_跟我學Spring Cloud(Finchley版)14Feign使用Hystrix

Feign默認已經整合了Hystrix&#xff0c;本節詳細探討Feign使用Hystrix的具體細節。服務降級1 加配置&#xff0c;默認Feign是不啟用Hystrix的&#xff0c;需要添加如下配置啟用Hystrix&#xff0c;這樣所有的Feign Client都會受到Hystrix保護&#xff01;feign:hystrix:enable…

ubuntu 改屏幕分辨率命令_Ubuntu被曝嚴重漏洞!!!

GitHub安全研究員Kevin Backhouse發現的一個Ubuntu系統大漏洞。無需系統密碼&#xff0c;就能添加新的sudo用戶、獲取root權限&#xff0c;事后還能刪除不留痕跡。這種攻擊方法非常簡單&#xff0c;Backhouse在官方博客中寫道&#xff1a;“使用終端中的一些簡單命令&#xff0…

swag您的裝置不支持_一件充滿意境的中國風水墨粒子、電子屏風交互裝置

不久前有人留言怎么用粒子做水墨&#xff0c;今天投石科技給大家分享個水墨粒子裝置作品案例&#xff0c;大家可以發揮自己的想象去做中國風的一些東西&#xff0c;希望能對大家有些幫助吧。《墨跡》這是一個數字山水畫的交互裝置&#xff0c;它通過攝像頭捕捉手部運動進行互動…

弱電工程集成商_弱電工程樓宇自控系統基礎知識培訓資料

前言&#xff1a;弱電行業里面樓宇自控系統是非常難的一個子系統&#xff0c;涉及到很多其他專業&#xff0c;樓宇自控系統的設計一般為廠家設計&#xff0c;但是也有系統集成商來設計的&#xff0c;樓宇自控系統主要學習它的控制原理&#xff0c;學習完以后學習DDC箱子的繪制&…

刪除單元格_VBA(實驗1)用VBA 刪除某列空單元格的3種方法:刪除法,轉移到其他列方法,數組方法...

1 要解決的問題&#xff1a;刪除某列中的空單元格/空行暫時只實現了刪除一列中的空行&#xff0c;并沒有實現多行的判斷空行和刪除方法。----之后再做更復雜的1.1 需求分析用VBA刪除如下內容&#xff0c;解決思路都不同刪除1列的空行&#xff08;本文要做的&#xff09;刪除整個…