本節內容html
轉載: http://www.cnblogs.com/alex3714/articles/5765046.htmlpython
1、列表生成式,迭代器&生成器算法
孩子,我如今有個需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表裏的每一個值加1,你怎麼實現?app
>>> a = [i+1 for i in range(10)] >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
經過列表生成式,咱們能夠直接建立一個列表。可是,受到內存限制,列表容量確定是有限的。並且,建立一個包含100萬個元素的列表,不只佔用很大的存儲空間,若是咱們僅僅須要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。ide
因此,若是列表元素能夠按照某種算法推算出來,那咱們是否能夠在循環的過程當中不斷推算出後續的元素呢?這樣就沒必要建立完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。函數
要建立一個generator,有不少種方法。第一種方法很簡單,只要把一個列表生成式的[]
改爲()
,就建立了一個generator:單元測試
>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x1022ef630>
咱們已經知道,能夠直接做用於for
循環的數據類型有如下幾種:測試
一類是集合數據類型,如list
、tuple
、dict
、set
、str
等;ui
一類是generator
,包括生成器和帶yield
的generator function。編碼
這些能夠直接做用於for
循環的對象統稱爲可迭代對象:Iterable
。
可使用isinstance()
判斷一個對象是不是Iterable
對象.
裝飾器(語法糖)的原則及構成:
三大原則:
一、不能修改被裝飾函數的源代碼。
二、不能修改被裝飾函數的調用方式。
三、不能改變被裝飾函數的執行結果。
裝飾器對被裝飾函數是透明的。
如何理解裝飾器
一、函數即「變量」
二、高階函數
a:把一個函數名做爲實參傳遞給另一個函數
b:返回值中包含函數名
三、嵌套函數
在一個函數體內聲明另外一個函數稱爲函數的嵌套
總結:三層函數
#_*_coding:utf-8_*_ user_status = False #用戶登陸了就把這個改爲True def login(auth_type): #把要執行的模塊從這裏傳進來 def auth(func): def inner(*args,**kwargs):#再定義一層函數 if auth_type == "qq": _username = "alex" #僞裝這是DB裏存的用戶信息 _password = "abc!23" #僞裝這是DB裏存的用戶信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: return func(*args,**kwargs) # 看這裏看這裏,只要驗證經過了,就調用相應功能 else: print("only support qq ") return inner #用戶調用login時,只會返回inner的內存地址,下次再調用時加上()纔會執行inner函數 return auth def home(): print("---首頁----") @login('qq') def america(): #login() #執行前加上驗證 print("----歐美專區----") def japan(): print("----日韓專區----") @login('weibo') def henan(style): ''' :param style: 喜歡看什麼類型的,就傳進來 :return: ''' #login() #執行前加上驗證 print("----河南專區----") home() # america = login(america) #你在這裏至關於把america這個函數替換了 #henan = login(henan) # #那用戶調用時依然寫 america() # henan("3p")
參考 http://www.cnblogs.com/alex3714/articles/5161349.html
"設計項目目錄結構",就和"代碼編碼風格"同樣,屬於我的風格問題。對於這種風格上的規範,一直都存在兩種態度:
我是比較偏向於後者的,由於我是前一類同窗思想行爲下的直接受害者。我曾經維護過一個很是很差讀的項目,其實現的邏輯並不複雜,可是卻耗費了我很是長的時間去理解它想表達的意思。今後我我的對於提升項目可讀性、可維護性的要求就很高了。"項目目錄結構"其實也是屬於"可讀性和可維護性"的範疇,咱們設計一個層次清晰的目錄結構,就是爲了達到如下兩點:
因此,我認爲,保持一個層次清晰的目錄結構是有必要的。更況且組織一個良好的工程目錄,實際上是一件很簡單的事兒。
關於如何組織一個較好的Python工程目錄結構,已經有一些獲得了共識的目錄結構。在Stackoverflow的這個問題上,能看到你們對Python目錄結構的討論。
這裏面說的已經很好了,我也不打算從新造輪子列舉各類不一樣的方式,這裏面我說一下個人理解和體會。
假設你的項目名爲foo, 我比較建議的最方便快捷目錄結構這樣就足夠了:
Foo/ |-- bin/ | |-- foo | |-- foo/ | |-- tests/ | | |-- __init__.py | | |-- test_main.py | | | |-- __init__.py | |-- main.py | |-- docs/ | |-- conf.py | |-- abc.rst | |-- setup.py |-- requirements.txt |-- README
簡要解釋一下:
bin/
: 存放項目的一些可執行文件,固然你能夠起名script/
之類的也行。foo/
: 存放項目的全部源代碼。(1) 源代碼中的全部模塊、包都應該放在此目錄。不要置於頂層目錄。(2) 其子目錄tests/
存放單元測試代碼; (3) 程序的入口最好命名爲main.py
。docs/
: 存放一些文檔。setup.py
: 安裝、部署、打包的腳本。requirements.txt
: 存放軟件依賴的外部Python包列表。README
: 項目說明文件。