青魔法Python(持續更新)


青魔法Python-聖誕快樂

魏泯html

童心未泯就是,又是一個飛雪連天日,我團個雪球踢着走。python

*跳轉到文章結尾* mysql

目錄

青魔法Python-聖誕快樂

python源於聖誕節,他的創造者是Guido van Rossum(賢者-龜叔)。sql

  • 操做系統:Windows10, Linux-Ubuntu
┌────────────────────────────────────────────────────────┐
    │Command Prompt - python                           _ □ x │
    ├────────────────────────────────────────────────────────┤
    │>>> print("Here not a world.")                          │
    │Here not a world.                                       │
    │>>> _                                                   │
    │                                                        │
    │                                                        │
    │                                    by: Asterism2012    |
    └────────────────────────────────────────────────────────┘

安裝Python

在進行Python的開發以前,首先要保證你的電腦上已經安裝了Python,但不要求必定是最新版本的。mongodb

  • Python解釋器是一個輕量級小尺寸軟件,能夠在Python語言主網站下載(大約20~35M).
  • Windows下直接進行傻瓜式安裝
  • Mac下能夠參照這篇文章:點擊連接打開
  • Ubuntu系統下一般自帶python

集成開發環境

  • IDLE(自帶的集成開發環境):在開始菜單中搜索便可。(小規模)
  • Notepad++:第三方開源記事本加強工具,反正我不用。(小規模)
  • sublime:輕量級,全能型集成開發工具。(大小規模)
  • Pycharm:這個是全宇宙最強的PythonIDE.(中大規模)

*返回目錄再看看*shell

Pycharm的快捷操做參考

  • Ctrl+W 選中詞組,再次按下則選中句子
  • Shift+Enter 將光標直接另起一行
  • Ctrl+Shift+上/下鍵 將選中行上移或下移一行
  • Ctrl+Y 刪除光標所在行
  • Ctrl+Shift+Z 反撤銷
  • Alt+F12 呼出terminal(終端),就是底下那個小黑框(目錄默認位置爲當前項目內根目錄下)
  • Ctrl+Alt+S 直接彈出設置窗口(setting)
  • Ctrl+Shift+U 把所選詞組變成大寫
  • Alt+左鍵或者右(方向鍵) 切換文檔(子窗口)
  • Ctrl+F4 關閉當前文檔(子窗口)
  • 快速搜索 Ctrl+W & Ctrl+F
  • Ctrl+左鍵或者右鍵(方向鍵)跨越空格進行光標移動

在Pycharm中配置爲咱們的虛擬環境
前後點擊:file---settings---Project-----project Interpreter用的時間長了天然就會了。

計算機基礎知識與Python編程知識

(參考自《Python程序設計(第二版)》嵩天)

計算機本質:

  • 根據指令操做數據的設備。
  • 功能性和可編程性。
  • 電子計算機、光計算機、超導計算機、量子計算機、生物計算機,這些都是不一樣材質的計算機。

摩爾定律:

  • 英特爾創始人之一的 戈登·摩爾提出
  • 單位面積集成電路上可容納的晶體管數量,大約每兩年翻一倍。
  • 若是可以裏用技術視角和專業精神去審視那些當代重要的預測法則,將使這些技術人才可以「藉助規律預測將來」,更好地迎接每個技術震撼帶來的時代變革。

計算機的時代性總結

  • 第一階段:「計算機系統結構階段」,由1946年開始,持續了35年,直到1981年。
    • 1972年,計算需求催生了高效執行的C語言,經過指優化底層內存使用。
    • 1981年,隨着IBM PC爲表明的我的計算機推出,計算機走向了大衆視野。
  • 第二階段:「計算機網絡和視窗階段」。由1982年開始,直到2007年。持續了25年。
    • 面向全球子網鏈接的TCP/IP網絡協議爲標誌,互聯網時代到來。
    • 計算機圍繞網絡技術、視窗技術、多媒體技術發展,我的計算機和服務器爲主要平臺,提供視窗應用和網絡服務。
    • 因爲網絡將不一樣類型系統互聯,催生了具有跨平臺功能的語言JAVA。
    • 視窗應用開發需求催生了VC、VB等視窗編程語言。
    • 2007年,美國iphone智能手機推出,計算機技術進入了面向移動網絡應用的新階段。
  • 第三階段:「複雜信息系統階段」,這個階段由2008年發展至今。
    • Andriod開源移動操做系統發佈爲起點,一大批新的概念和技術同時提出而且顯著推進了計算技術的更新換代。
    • 包括移動互聯網、多核衆核、雲計算、大數據、可穿戴計算、物聯網、互聯網加等等。
    • 反映了平臺與應用的多樣性,也帶來了更復雜的安全問題。全部的技術與系統都在不斷完善的過程當中提供更安全可靠、用戶體驗更好的功能服務。
    • 人類會逐漸認識到計算機複雜性會達到人類能掌控的邊界。
    • 面對複雜的功能性和緊迫的迭代週期,計算機須要更高抽象級別的語言來表達可編程性。(2008年Python3版本,已經成爲了這個時代的主流編程語言。)
  • 第四階段:約2035年左右,步入「人工智能階段」:
    • 隨着深度學習、開源硬件、智能機器人、在線搜索引擎、量子計算等計算的逐步發展,將來某個時期會出現人工只能主導的計算的技術階段。
    • 計算機或許已經沒有了獨立的載體,它整合一切可用天然資源,接管人類全部非創造性工做。計算機技術將會進入一個未知的新階段。
    • 計算機功能性和可編程性的發展存在相互促進的關係,計算機長在藉助人類智慧不斷「進化」。
  • 問題:
    • 計算機的定義是什麼?它有哪兩個顯著特色?
    • 請調研並闡述很多於三個計算機領域中相似摩爾定律的預測法則或評估法則。
    • 請列出並闡述很多於五個近十年出現的計算機技術名詞。

通用編程語言與專用編程語言

  • 機器語言>彙編語言>高級語言
  • 儘管科學家作出過不少努力,仍然沒法再可預見的將來設計出能徹底理解人類語言的計算機。
  • 通常來講,通用編程語言比專用編程語言生命力更強。應用範圍狹窄的則相反。
  • Python、C/C++、C#、Go、Java是通用編程語言;

解釋與編譯:靜態語言與動態語言

Python是一種計算機編程語言。計算機編程語言和咱們平常使用的天然語言有所不一樣,最大的區別就是,天然語言在不一樣的語境下有不一樣的理解,而計算機要根據編程語言執行任務,就必須保證編程語言寫出的程序決不能有歧義,因此,任何一種編程語言都有本身的一套語法,編譯器或者解釋器就是負責把符合語法的程序代碼轉換成CPU可以執行的機器碼,而後執行。——廖雪峯

  • 靜態語言和動態語言各有優缺
  • 解釋:是將源代碼轉換成目標代碼的同時逐條執行目標代碼的過程,速度相較慢。在乎解釋速度,解釋速度和運行速度是相互做用的。
  • 編譯:將源代碼轉換成目標代碼的過程,能夠當即或稍後運行目標代碼。不在乎編譯速度,而在於運行速度。交互運行與文件運行。
  • 編譯只用執行一次,而解釋每次都須要源代碼執行。區別至關於翻譯資料與同聲傳譯。
  • 編譯的好處:
    • 同等代碼,代碼執行更快
    • 已生成了的目標代碼不依賴編譯器,在同類型操做系統上使用靈活。
    • 表明性語言:C語言,Java語言
  • 解釋的好處:
    • 解釋執行須要保留源代碼,程序糾錯和維護十分方便。
    • 只要存在編譯器,源代碼的移植性很好,能夠在任何操做系統上運行。
    • 表明性語言:Javascript,PHP,Python

學習編程的目的

編程的目的是:「使用計算機解決問題」。

  • 編程訓練思惟,增進認識
  • 帶來樂趣,提升效率
  • 帶來就業機會,程序員是信息時代最重要的崗位之一。
  • 計算思惟:是區別於以數學爲表明的邏輯思惟,和物理爲表明的證明思惟的第三種思惟方式。體現了一種抽象交互方式,形式化方法執行的思惟模式。
  • Python是一個開源語言,其解釋器也是開源的,在Python主網站(www.python.org)能夠自由下載。
  • 「Python2已是遺產,Python3纔是如今和將來。」
  • 問題:
    • CPU能夠直接理解什麼樣的程序設計語言?
    • 闡述解釋和執行的區別與優缺點。
    • 列出三個學習編程的理由。

Python的特色

  • 粘性擴展:經過語法擴展接口,能夠整合多種編程語言。
  • 強制縮進:顯著提升了程序的可讀性。
while True:    #在Python中,使用縮進來表示層級關係,這是很酷的一個功能
    print("I miss you.")
  • 庫類豐富:是真的豐富。
  • 跨平臺:動態語言都是跨平臺的。
  • 語法簡介:幾乎是最簡潔的
  • 應用普遍:這個是真的普遍。
  • 編碼支持中文:默認以UTF-8的形式編碼

著名的IPO編程方式

  • IPO就是(Input-Process-Output):這幾乎是統一的基本程序編寫方法。更是描述計算問題的方式。
  • 輸入:
    1. 文件輸入
    2. 網絡輸入
    3. 控制檯輸入
    4. 交互界面輸入
    5. 隨即數據輸入
    6. 內部參數輸入
  • 輸出:
    1. 控制檯輸出
    2. 圖形輸出
    3. 文件輸出
    4. 網絡輸出
    5. 操做系統內部變量輸出
  • 處理:(Process):它是程序的靈魂部分,計算問題的處理方法統稱爲「算法」
  • 無輸入輸出的程序:輔助測試CPU系統性能

代碼註釋的學問

代碼註釋在每個高級語言中都存在,用於用咱們人的語言來爲咱們寫的代碼進行標註,提升咱們代碼的可讀性,從而提升咱們協同工做的效率,以及下降咱們的維護代碼的時間成本。

  • 單行註釋 (#號):
# 我是一段註釋,我寫的代碼意思是這樣的
  • 多行註釋 (''' ''' 三引號):
'''我是多行註釋,我是能夠換行顯示的,
你看,我換行了'''

值得一提的是:多行註釋不能放在在列表、集合、字典中:

dic1 = {                   │ lis1 = [              │set1 = {             
    '''Student dict'''     │    '''New List'''     │    '''New set'''        
    'name':'Tom',          │    1,                 │    1,  
    'age':'18'     # No    │    2           # No   │    2,      # No
}                          │]                      │}

上面這種寫法都是錯誤的。在容器類型的數據類型中,三引號囊括起來的內容會被視爲字符串。
可是單行註釋是被容許的:

set1 = [
    # New set
    1,2
]

像這樣寫是能夠的,能夠本身打印這些變量嘗試一下。

別名

  • 給導入的標準包起名

    from lxml import etree as e

定義空字典、空集合、空列表

>>>dic1 = dict()
>>>set1 = set()
>>>lis1 = list()

查看一下類型

>>> type(dic1)
<class 'dict'>
>>> type(lis1)
<class 'list'>
>>> type(set1)
<class 'set'>

返回目錄

Python的內存管理

  • Python中沒有真正意義上的賦值,也沒有指針概念,可是引用計數倒是相似指針的概念,系統會自行判斷。
  • 可是當a = 1;b = 1時,1這個數據所在的內存地址的引用計數爲2,名爲a,b。但咱們del b時,1這個數據的引用計數爲1,名爲a。

    容器數據類型

  • 列表與元祖:元祖比列表更快

編碼

  • 美國標準信息交換碼 ASCII
  • UTF-8 "萬國碼" GB2312 "中文編碼"
  • 看看廖雪峯老師講的,很是的透徹易懂。(https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000)

格式化輸出format

  • 對字符串的辦法,等待更新中
  • 圖靈測試是人工智能(AI)領域中的重要概念,用於評判機器是否具備人的智能。

Python列表的拆解

  • join函數將列表元素鏈接,拆解爲字符串
list = ["M","i","s","s"]

Python 面向對象編程-函數

函數名的本質

函數名其實就是指向一個函數對象的引用,徹底能夠把函數名賦給一個變量,至關於給這個函數起了一個「別名」:

  • max() 函數

max函數max()能夠接收任意多個參數,並返回最大的那個:

>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3

Python 面向對象編程-類

  • 正在更新中

Python local()函數用法

  • 不做爲返回值時候,會自動收集當前做用於內全部局部變量,保存爲一個字典。做爲返回值時,將函數做用域內全部局部變量以字典形式返回,注意不是鍵值對。
  • 它的兄弟是globals(),法力無限,收集全局變量。

可變字符串與有序字典

  • 正在更新中

Python range() 函數用法

  • 在python2中,range函數被視爲一個列表類型的對象(整數列表)。它會直接輸出一個列表,經過更改參數來更改列表的值。
  • 它擁有三個參數,依次分別是start(開始),stop(結束),step(步長)

range(start,stop,step)

  • 參數說明:

start:計數從start開始,默認爲0.

stop:計數到stop結束,但不包括stop。

step:計數跨度,默認爲1。

  • 指定一個參數

    range(8)
    [0, 1, 2, 3, 4, 5, 6, 7]

  • 指定兩個參數

    range(1,15)
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

  • 指定三個參數

    range(1,100,20)
    [1, 21, 41, 61, 81]

  • 支持負參數(愈來愈小)

    range(-10,-20,-1)
    [-10, -11, -12, -13, -14, -15, -16, -17, -18, -19]

  • 倒序

    range(100,19,-5)
    [100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20]

  • 指定參數0

    range(0)
    []

  • 不指定參數

    range()
    Traceback (most recent call last):
    File " ", line 1, in
    TypeError: range expected at least 1 arguments, got 0

在python3中

  • range()被視爲一個range類型(範圍)的對象,使用type()函數則會看到

    type(range(0))
    <class 'range'>

  • 使用help()函數則會看到

    Help on class range in module builtins:

    class range(object)
    | range(stop) -> range object
    | range(start, stop[, step]) -> range object
  • 在Python3中進行操做,不會返回列表,而是範圍對象的內容。

    range(0)
    range(0, 0)
    range(-10,-20,-1)
    range(-10, -20, -1)
    range(1)
    range(0, 1)
    range(10,100,20)
    range(10, 100, 20)

字符串

這一塊等待更新

字符串處理:正則表達式

  • 正則表達式是處理字符串很是強大的工具,擁有本身的語法結構
  • 一種過濾邏輯,對字符串操做的一種邏輯公式,在「萬軍叢中」找到你想要的那個」對的人「。
  • 並不是Python獨有,由re模塊實現
  • 以括號來表示表達式或者來分組
  • 回頭把表格更新出來,字符串

    match函數:

  • re.match()
    嘗試從字符串的起始位置匹配一個模式,若是不是起始位置匹配成功的話,match()就返回Nonere.match(正則表達式)

    search()函數:

  • re.search()
    掃描整個字符串、返回第一個匹配到的內容

    findall()函數

  • re.findall()
    掃描整個字符串,以列表形式返回全部匹配目標(分組),能夠理解爲一個大的group()

    sub()函數

  • re.sub() 也能夠稱做sub方法 : 用於替換字符串中的指定內容

# 普通替換
>>>result = re.sub("d+","Hi",'123 world')
>>>result
Hi world
'''進階替換(插入)
包含源字符串自己的內容  規定原生(字符串)的r與Back slash slash(「\」)轉義來保證字符串的正確性'''
>>>result = re.sub("(\d+)",r"\1 123","456")
>>>result
456 123
  • group()函數:

result.group(x)  #獲取正則表達式中第x個括號中的字符串內容
  • span函數:

  • result.span():
  • 貪婪匹配

  • 匹配儘量多的字符,貪婪模式不是很好控制,因此儘量地使用貪婪模
>>>result = re.match('.*(\d+)',"a123")
>>>result.group(1)
a12
  • 非貪婪匹配

>>>result = re.match('.*(\d+)',"a123")
>>>result.group(1)
a
  • 匹配儘量少的字符
  • 匹配模式

  • re.S 匹配包括換行符在內的全部字符
  • 相關概念有常規匹配、泛匹配、匹配目標、貪婪匹配、非貪婪匹配等
  • 轉義

  • 轉義符號 「」 : 正則表達式識別不了大多數的特殊符號,因此咱們須要把Back slash(反斜槓)來將它轉義。
re.match('Hello \$world.','Hello $world.')
  • 正則的空白字符\s

    數學模塊

  • 正在更新中

    生成式與生成器

    深刻理解Python生成器(Generator)

  • 在Python中,這種一邊循環一邊計算的機制,稱爲生成器(Generator)
  • 生成器的語法和列表生成式的語法很是類似,幾乎讓我低估它
  • 值得一提的是,它與列表生成式有極大的不一樣——它具備不少內建方法
  • 建立方法的說明:

經過生成式生成

經過函數生成

  • 經過生成式生成

    generator = (i for i in range(10))

python2.x中

  • 使用類型檢查、直接打印、以及幫助幫助信息
  • python2.7與python3.5的版本沒有區別

    類型檢查type()

    type(generator)
    <class 'generator'>

直接打印

>>> generator
<generator object <genexpr> at 0x000002962143B938>

幫助信息

Help on generator object:
 
<genexpr> = class generator(object)
'''
譯文:生成器的幫助信息:
'''

列表生成式

  • 也能夠叫作列表推導式,幫咱們快速生成包含一堆數據的列表
>>>datelis = ["10月{}日".format for i in range(1,32)]
>>>datelis
['10月1日', '10月2日', '10月3日', '10月4日', '10月5日', '10月6日', '10月7日', '10月8日', '10月9日', '10月10日', '10月11日', '10月12日', '10月13日', '10月14日', '10月15日', '10月16日', '10月17日', '10月18日', '10月19日', '10月20日', '10月21日', '10月22日', '10月23日', '10月24日', '10月25日', '10月26日', '10月27日', '10月28日', '10月29日', '10月30日', '10月31日']

字典生成式

  • 也能夠叫作字典推導式,幫咱們快速生成包含一堆數據的字典
>>>dicgene = {i:i for i in range(20)} # 最常規字典推導式
>>>dicgene
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19}
>>>dicgene2 = {index:i for i in enumerate(datelis)} # 常規的 用字典排序列表
>>>dicgene2
{0: '10月1日', 1: '10月2日', 2: '10月3日', 3: '10月4日', 4: '10月5日', 5: '10月6日', 6: '10月7日', 7: '10月8日', 8: '10月9日', 9: '10月10日', 10: '10月11日', 11: '10月12日', 12: '10月13日', 13: '10月14日', 14: '10月15日', 15: '10月16日', 16: '10月17日', 17: '10月18日', 18: '10月19日', 19: '10月20日', 20: '10月21日', 21: '10月22日', 22: '10月23日', 23: '10月24日', 24: '10月25日', 25: '10月26日', 26: '10月27日', 27: '10月28日', 28: '10月29日', 29: '10月30日', 30: '10月31日'}

Python 時間模塊 datetime 與 time

  • Python版本:python3.6

time

下文的一部分time表明的是datetime類型的對象

  • 獲取當前時間戳:time.time()
>>>now = time.time()
1540374057.6383073
  • 將時間戳轉化爲time類型元組:time.localtime()
>>>time.localtime(time.time())
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=24, tm_hour=17, tm_min=42, tm_sec=44, tm_wday=2, tm_yday=297, tm_isdst=0)
  • 格式化時間元祖爲想要的字符串格式
>>>time.strftime("%Y%m%d %H:%M:%S",time.localtime(time.time()))
'20181024 18:00:21'

datetime

下文的一部分datetime 表明的是datetime類型的對象

  • 獲取當前時間:datetime.now()

    from datetime import datetime
    now = datetime.now()
    print(now)
    2018-10-23 14:36:14.238998

  • 獲取datetime對象的

    datetime.strftime()函數 格式化時間

  • 用於格式化datetime類型的對象,返回一個str類型的對象

格式符 說明
%a 星期的英文單詞的縮寫:如星期一, 則返回 Mon
%A 星期的英文單詞的全拼:如星期一,返回 Monday
%b 月份的英文單詞的縮寫:如一月, 則返回 Jan
%B 月份的引文單詞的縮寫:如一月, 則返回 January
%c 返回datetime的字符串表示,如03/08/15 23:01:26
%d 返回的是當前時間是當前月的第幾天
%f 微秒的表示: 範圍: [0,999999]
%H 以24小時製表示當前小時
%I 以12小時製表示當前小時
%j 返回 當天是當年的第幾天 範圍[001,366]
%m 返回月份 範圍[0,12]
%M 返回分鐘數 範圍 [0,59]
%p 返回是上午仍是下午–AM or PM
%S 返回秒數 範圍 [0,61]。。。手冊說明的
%U 返回當週是當年的第幾周 以週日爲第一天
%W 返回當週是當年的第幾周 以週一爲第一天
%w 當天在當週的天數,範圍爲[0, 6],6表示星期天
%x 日期的字符串表示 :03/08/15
%X 時間的字符串表示 :23:22:08
%y 兩個數字表示的年份 15
%Y 四個數字表示的年份 2015
%z 與utc時間的間隔 (若是是本地時間,返回空字符串)
%Z 時區名稱(若是是本地時間,返回空字符串)
%% %號自己
---------------------
做者:ShomyLiu
來源:CSDN
原文:https://blog.csdn.net/shomy_liu/article/details/44141483
版權聲明:本文爲博主原創文章,轉載請附上博文連接!

  • 使用strftime獲取當前時間的日期部分:%x

    from datetime import datetime
    now = datetime.now()
    date = now.strftime("%x")
    '10/23/18'

  • 獲取單獨的 年 月 日 部分:datetime.year(),datetime.month(),datetime.day()

    now.year
    2018
    now.month
    10
    now.day
    23

  • strftime()能夠自定義格式化標準

    now.strftime("%x %X")
    '10/23/18 14:52:20'

datetime.strptime()函數 的簡單使用

trptime是python datetime庫中的函數,用於將一個日期字符串轉成datetime日期格式便於後期處理,使用格式爲datetime.strptime(date_string, format);格式化(format)使用的參數與上面所講的strftime()所用的格式化參數是同樣的,可是它要與字符串位置一一對應才行。

datetime計算時間差:timedelta()獲取過去的時間

timedelta()是datetime()這個超類內置的方法,用於計算過去的時間,返回一個datetime.timedelta()類型的變量。

  • 它的經常使用可選參數(無大小順序):
  1. days(天)
  2. weeks(周)
  3. minutes(分鐘)
  4. seconds(秒)
  5. hours(小時) PS:除此以外,還有微秒等不經常使用的參數,若是有更多的學習興趣或須要,能夠直接去源碼中翻看
  • 導入datetime模塊
import datetime
  • 獲取過去的時間(好比昨天)
>>> loseTime = datetime.timedelta(days=-1)
>>> loseTime
datetime.timedelta(-1)   
# 也能夠是一週前,你們觸類旁通吧
# >>>loseTime = datetime.timedelta(weeks=-1)
  • 獲取今天、此刻的時間(當前時間)
>>> nowTime = datetime.datetime.now()
>>> nowTime
datetime.datetime(2018, 10, 25, 18, 53, 23, 108495)
  • 接下來就能夠直接用 loseTime 與 nowTime 進行計算時間差了
>>> that_time = nowTime+loseTime
>>> that_time
datetime.datetime(2018, 10, 24, 18, 53, 23, 108495)     # 時間變化了!看到沒?

空值None

  • 空值是Python裏一個特殊的值,用None表示。None不能理解爲0,由於0是有意義的,而None是一個特殊的空值。

常量

所謂常量就是不能變的變量,好比經常使用的數學常數π就是一個常量。在Python中,一般用所有大寫的變量名錶示常量:

PI = 3.14159265359

但事實上PI仍然是一個變量,Python根本沒有任何機制保證PI不會被改變,因此,用所有大寫的變量名錶示常量只是一個習慣上的用法,若是你必定要改變變量PI的值,也沒人能攔住你。(----來自:廖雪峯的官方網站 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431658624177ea4f8fcb06bc4d0e8aab2fd7aa65dd95000)

Python help()函數

Python 不定長參數

*args和與**kwargs

  • 在再談兩者區別前,先要說明的是,語法的區別是* 和** 這兩個符號影響,而*args和**kwargs只是約定的非強制性的。也就是說,arg和kwargs這兩個名字並非必須叫這個名字的,而*號是必須有的。
  1. *args 和**kwargs能夠單獨使用
  2. *args和**kwargs能夠一塊兒使用
  3. 一塊兒使用時,*args必須在**kwargs前面
  4. *會把list或者tuple分解爲一個個參數傳遞給函數
  5. **會把dict轉成關鍵字參數
  6. 函數定義和函數調用,能夠同時出現* 或者**
  7. 出如今函數調用時,必定要注意參數匹配的位置問題
  8. *args是不帶keyd容器及字符串,**kwargs是帶‘key’的容器。
  9. *args匹配多個元素,kwargs匹配鍵值對。
  • *args不定長參數案例

    def func(*args):
    print(args)
    print(type(args))
    func(1,2,'a')
    # output:
    (1, 2, 'a')
    <class 'tuple'>

  • **kwargs不定長參數案例

    def func(**kwargs):
    print(kwargs)
    print(type(kwargs))
    func(a=1,b=2)
    # output:
    {'a': 1, 'b': 2}
    <class 'dict'>

  • 空的案例
  • 拆包

    大多數時候,只有一個容器被調用的時候,才能健康地使用*號進行拆包
  1. 單*號拆包

    list1 = [1,2,3]
    print(*list1)

  2. 雙*號拆包

    dict1 = {'a':1,'b':2}
    def func(a,b):
    print(a,b)
    func(**dict1)

深刻淺出Python isinstance()類型檢查函數

它用於進行檢查某一個變量的類型,但他是type()函數的高階版本。它擁有更強大的功能,同時也擁有更多的發揮空間。

  • 檢測單個變量是否爲某個類型

    dic1 = {'a':'z'}
    isinstance(dic1,dict) # 這一行是判斷dic1變量是否爲字典類型
    True
    isinstance(dic1,tuple) # 這一行是判斷dic1變量是否爲元祖類型
    False

  • 檢測單個變量是否在所指定的類型範圍內

    '''判斷dic1是不是:
    整型、浮點型、字符串、列表、集合、字典、元祖類型中的一種
    '''

    isinstance(dic1,(int,float,str,list,set,dict,tuple))
    True
    '''判斷dic1是不是:
    整型、浮點型、字符串、列表、集合、元祖類型中的一種
    '''
    isinstance(dic1,(int,float,str,list,set,tuple))
    False

  • 檢測多個變量是否在指定的類型範圍內

    dic1 = {'a':'z'}
    dic2 = {'c':'w'}
    isinstance((dic1,dic2),(int,float,str,list,set,dict,tuple))
    True
    isinstance((dic1,dic2),(int,float,str,list,set,tuple))
    False

  • 最經常使用的七種數據類型
    • 整型、浮點型、字符串、列表、集合、字典、元祖
    • int,float,str,list,set,dict,tuple
  • 最後值得一提的是,此函數在Python2.x版本和Python3.x版本中,沒有版本差別。

Python strip()方法

  • Python strip() 方法用於移除字符串頭尾指定的字符(默認爲空格或換行符)或字符序列。

    Python os模塊

  • 判斷文件夾是否存在,不存在則建立

d = '新建文件夾'
if not os.path.exists(d):
    os.mkdir(d)
  • 額外知識點: 以字符串形式表示當前文件的絕對路徑 __file__
print(__file__)     # 不要以命令的形式執行它,告訴你,執行不了!...剛纔不是我

默認是斜槓

  • 查看所在的目錄 os.path.dirname()
pth = os.path.dirname('C:/Users/DELL/Desktop/test.py')
print(pth)

Console:
C:/Users/DELL/Desktop
 
os.path.dirname 是比較動搖的,它傳入的路徑字符串裏用的是反斜槓,它打印出來就是反斜槓。可是若是傳入的路徑字符裏用的是斜槓,它打印出來的就是斜槓。

  • 查看絕對路徑 os.path.abspath()
os.path.abspath()

os.path.abspath 是很是堅決的(絕對路徑,絕對懂嗎?很是絕對)它不論你傳入的是路徑字符串勵用的是反斜槓仍是斜槓,他打印出來都是反斜槓~~~~ 額剛纔不是我。算了太晚了 該睡了。

  • 路徑拼接 os.path.join()
os.path.join("C:/User/DELL/Desktop", "test.py")

Python深刻迭代器iterator與裝飾器

  • iter對象是可迭代對象

Python關鍵字 yield

  • 正在更新中

Python文件操做

shelve模塊,標準庫模塊

  • shelve存儲數據就按照字典的方式存儲數據
import shelve

f = shelve.open("shelve_test")
f['info'] = "alex"
f["age"] = [1,34,5,6,33,44]
f["name"] = {"name":"alex","add":"sz"}
f.close()

f = shelve.open("shelve_test")
print(f.get("info"))
print(f.get("age"))
print(f.get("name"))
print(f['info'])
print(f.values())
print(f.items())
print(f.keys())
  • shelve也能夠用with的方式打開
import shelve
with shelve.open("test_shelve.db") as f:
    f["k1"] = {
        "name":"zhangguojun1",
        "age":12,
        "address":"shenzhen1"
    }
    f["k4"] = ["張國軍1","張國軍2","張國軍3"]
    print(f["k1"]["name"])
    print(f["k4"][0])

Python中的三目運算結構,位運算

  • 正在更新中

    Python的字典方法

  • 字典.get("鍵",異常值)
  • dict.items() 以列表返回可便利的(鍵、值)元祖數據,還是一個字典對象

    for v,j in dict.items:
    print(v,j)

Python 高階函數map() 與 zip()

  • 正在更新中

Python多線程

  • 線程是進程的最小單元
  • 進程是一個真正的程序

隨機數模塊 random

  • random.choice() 後面參數跟一個列表,每次會隨機選擇列表中的一個元素做爲返回值
list1 = [1,2,3]
randint = random.choice(list1)
  • 指定一個範圍,隨機抽取一個數:random.randrange()
>>>import random
>>>a = random.randrange(1,999)
>>>a
85

Python的繼承與多態

今天先把Python三大特性之一的「封裝」特性放在一邊。聊一聊繼承與多態,簡單的來講,繼承與多態是體如今面向對象編程中的類編程上。

  • 繼承:子類與父類的關係一般這樣體現:
class Animals(object):      # object 是 Animals的父類
    def run(self,name="Animals"):
        print("%s are running.")
class Cats(Animals):        # Animals是Cats的父類
    def run(self,name="Cats"):
        print("%s are running.")
cats = Cats()   # 實例化Animals 的子類 Cats
cats.run()      # run方法體現繼承,console: Cats are running.
  • 多態:什麼是多態?咱們建立一個類的時候其實已是建立了一種數據類型:
# 這體現了cats的數據類型是Animals
list0727 = []
print(isinstance(list0727,list))    # console:True
print(isinstance(cats,Cats))    # console:True
print(isinstance(cats,Animals))     # console:True
  • 對於一個變量,咱們只須要知道它是Animal類型,無需確切地知道它的子類型,就能夠放心地調用run()方法
def run_twice(animals):     # 這裏的形參名稱是本身定義的,能夠改爲別的名稱,可是這裏只是爲了方便咱們記憶。
    animals.run()   
run_twice(Cats())     # console: Cats is running.    
'''接下來能夠體現 動態語言 的 鴨子類型:
它並不要求嚴格的繼承體系,一個對象只要「看起來像鴨子,走起路來像鴨子」,那它就能夠被看作是鴨子。
'''
class People(objects):
    def run(self):
        print("People are running.")
run_twice(People())
'''在靜態語言中(例如),若是要傳入animals類型的參數,則傳入的對象必須是animals類型 或者是它的子類,不然,將沒法調用run()方法。
可是,對於Python這樣的動態語言來叔,則不須要傳入Animal類型。咱們只須要保證傳入的對象有一個run()方法就夠了。
'''

這一小節來自於「廖雪峯的官方網站」 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431865288798deef438d865e4c2985acff7e9fad15e3000

經典算法

  • 水仙花數
  • 99乘法表
  • 判斷閏年
  • 正在更新中
  • 百錢白雞
  • 二分查找
  • 選擇排序
  • 冒泡排序
  • 正在更新中

深淺複製

  • 正在更新中

MySqlDB數據庫交互

  • Python版本:Python3.5
  • pymysql 是一個第三方包 pip install pymysql
  • 創建數據庫鏈接,並獲取對象

    db = pymysql.connect(user='root',password='mysql',db='233',charset='utf8')
  • 創建遊標

    cursor = db.cursor()
  • 編寫sql語句

    # 如下六個變量都是初始化過的
    sql = 'insert into ding(title,author,new_chapter,w_num,u_time,status)value("{}","{}","{}","{}","{}","{}")'.format(title,author,new_chapter,w_num,u_time,status)
  • 使用遊標執行語句

    cursor.excute(sql)
  • 提交事務

    db.commit()

    MongoDB數據庫交互

  • Python版本:python3.5
  • 確保pymsql的安裝 pip install
  • 創建鏈接而且獲取到鏈接對象

    myconn = pymongo.MongoClient("localhost",27017)
  • 生成數據庫

    mydb = myconn["LagouWeb"]
  • 生成集合

    mycoll = mydb["zhaopin"]
  • 將文檔(必須是字典類型的數據)存入集合

    info = {key:value}
    mycoll.insert(info)

字符串方法

  • split() 切割
str.split(" ",3) 表示以空格來切,字符串,將其切成列表,只切前三個(第二個參數是可選的,就是能夠不填寫)
  • startswith() 與 endswith() 判斷字符串開頭 與 判斷字符串結尾
str.startswith(" ") 表示檢查字符串是不是以指定子字符串開頭,若是是則返回 True,不然返回 False。若是參數 beg 和 end 指定值,則在指定範圍內檢查。(str.startswith(str, beg=0,end=len(string))

虛擬環境的使用

操做系統:windows10

爲何使用虛擬環境?搭建獨立python運行環境。防止相同包的不一樣版本之間相互衝突和覆蓋。

virtualenv的使用:

virtualenv是是python的虛擬環境管理器

  1. 建立文件總署,而且移動進去
md virtual_now(會在當前目錄建立一個名爲‘virtual_now’的子文件夾)
cd virtual_now
  1. 使用python安裝virtualenv
pip install virtualenv(pip是python的包管理工具)
  1. 使用virtualenv命令建立虛擬環境
virtualenv --no-site-packages newenv
(像建立文件夾同樣建立了一個環境目錄‘newenv’)
#關於--no-site-pakeages參數#:它不會複製已存在的第三方包

使用指定Python解釋器的方式建立環境:

virtualenv -p c:\python27\python.exe venv
  1. 在命令行下進入Scripts的目錄下,進入虛擬環境。進入Scripts後輸入activate回車便可。
cd Scripts
activate(激活環境)
  1. 而後就能夠安裝咱們所須要的包,好比Django1.11.1
pip install django==1.11.1
  1. 查看python版本:注意,這種虛擬環境是使用咱們的默認解釋器建立的,個人默認解釋器是python3.5。
python

7.退出虛擬環境

deactivate

virtualenvwrapper 的使用:

virtualenvwrapper能夠簡化virtualenv包的操做

  1. 安裝virtualenvwrapper-win(它是windows下的虛擬環境管理器)
pip install virtualenvwrapper-win
  1. 查看安裝的全部虛擬環境
C:\workon
Pass a name to activate one of the following virtualenvs:
==============================================================================
  1. 建立虛擬環境管理目錄(虛擬環境都會進入這個目錄中):

    設置系統環境變量(WIN10的話直接新建就能夠),後面添加本身想要的虛擬環境目錄位置。

┌────────────────────────────────────────────────────────┐
│ Edit system variables                            _ □ x │
├────────────────────────────────────────────────────────┤
│                   ┌──────────────────────────────────┐ │
│ Variable Name(N)  │  WORKON_HOME                     │ │
│                   └──────────────────────────────────┘ │
│                   ┌──────────────────────────────────┐ │
│ Variable Value(V) │  E:\virtual_now                  │ │
│                   └──────────────────────────────────┘ │
│                             ┌────────┐  ┌────────┐     │
│                             │   OK   │  │ Cancel │     │
│                             └────────┘  └────────┘     │
└────────────────────────────────────────────────────────┘  by: Asterism
  1. 建立環境(以Python3版本的Django2爲例,名稱自定義)
C:\mkvirtualenv Py3_django2

以指定python3環境的方式創建虛擬環境

C:\mkvirtualenv -p python3 venv
  1. 使用虛擬環境(進入虛擬環境
C:\workon Py3_django2
  1. 列出全部環境,與workon不一樣的是,它會顯示環境所在的系統路徑
C:\lsvirtualenv
  • 退出虛擬環境(註銷虛擬環境)
C:\deactivate
  • 移動到當前環境的site-packages目錄
C:\cdsitepackages
  • 列出當前環境中site-packages內容
C:\lssitepackages
  • 清除環境內全部第三方包
C:\wipeenv
  • 刪除指定環境
C:\rmvirtualenv Py3_django2
  • cpvirtualenv 複製環境
C:\cpvirtualenv Py3_django2
  • setvirtualenvproject 綁定現存的項目和環境
C:\> setvirtualenvproject Py3_django2

部分參考
做者:lliuz
來源:CSDN
原文:https://blog.csdn.net/melpancake/article/details/54578711
版權聲明:本文爲博主原創文章,轉載請附上博文連接!

  • virtualenvwrapper --help 的翻譯
virtualenvwrapper-win is a port of Dough Hellman’s virtualenvwrapper to Windows
 batch scripts.
    (virtualenvwrapper-win是Dough Hellman開發的 windows操做系統的
批處理腳本。)
 Commands available:
    (可用命令:)
   add2virtualenv: add directory to the import path

   cdproject: change directory to the active project

   cdsitepackages: change to the site-packages directory

   cdvirtualenv: change to the $VIRTUAL_ENV directory

   lssitepackages: list contents of the site-packages directory

   lsvirtualenv: list virtualenvs

   mkproject: create a new project directory and its associated virtualenv

   mkvirtualenv: Create a new virtualenv in $WORKON_HOME

   rmvirtualenv: Remove a virtualenv

   setprojectdir: associate a project directory with a virtualenv
   toggleglobalsitepackages: turn access to global site-packages on/off

   virtualenvwrapper: show this help message

   whereis: return full path to executable on path.

   workon: list or change working virtualenvs

虛擬環境的使用

操做系統:Linux

  • 目錄:/home/.virtualenvs 能夠移動進去進行修改數據
  • 安裝虛擬環境:
sudo pip install virtualenv (安裝)
sudo pip install virtualenvwrapper (打包安裝)
  • 建立虛擬環境:
(python2) mkvirtualenv [環境名]
(python3) mkvirtualenv -p python3 [環境名]
  • 查詢和使用虛擬環境:
workon  (查詢)
workon [虛擬環境名] (使用)
deactivate (退出虛擬環境)
rmvirtualenv (刪除虛擬環境)
  • 查詢環境變量路徑
which python
where python

pip包的使用:

  • 安裝指定包
pip install 包名
pip install 包名==版本號
  • 刪除擴展包(卸載擴展包)
pip uninstall 擴展報名
  • 使用pip包管理器查看擴展包(第三方)
pip freeze
pip freeze >
  • 展現全部包:pip list(包括標準包)
pip list
  • 導出全部包內容,包從新定向到文檔 freeze >
pip freeze > requirements.txt
  • 安裝指定文檔中的依賴包
pip install -r requirements.txt
  • 能夠直接使用鏡像源(地址),加-i指定地址
    不少時候,pip默認指向的國外源不穩定,因此咱們可使用國內源進行安裝不少擴展包

國內源:
阿里雲 http://mirrors.aliyun.com/pypi/simple/
中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/

pip install -i http://pypi.douban.com/simple 模塊名

若是出現不信任的報錯,則須要在命令後加上:

pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 模塊名
  • 更新pip版本
    python -m pip install --upgrade pip

#!/usr/bin/env python與#!/usr/bin/python的區別(/bin/可執行文件)

腳本語言的第一行,++目的就是指出++,你想要你的這個++文件中的代碼用什麼可執行程序去運行++它,#!/usr/bin/python是告訴操做系統執行這個腳本的時候,調用/usr/bin下的python解釋器
#!/usr/bin/env python這種用法是爲了++防止操做系統用戶沒有將python裝在默認的/usr/bin路徑++裏。當系統看到這一行的時候,首先會到env設置裏查找python的安裝路徑,再調用對應路徑下的解釋器程序完成操做。
(#!/usr/bin/python至關於寫死了python路徑;
#!/usr/bin/env python會去環境設置尋找python目錄:推薦這種寫法。)

尊重版權:轉載自博客園 https://www.cnblogs.com/walk1314/p/7076853.html (Mr_Walker),如需轉載請註明出處,尊重他人的勞動成果,也尊重你本身。

Lambda 匿名函數

  • 一個語法:在Python中,lambda的語法是惟一的。其形式以下:

    lambda argument_list: expression
    # lambda是Python預留的關鍵字,argument_list和expression由用戶自定義
  • 這裏的argument_list是參數列表。它的結構與Python中函數(function)的參數列表是同樣的。具體來講,argument_list能夠有很是多的形式。例如
    • a, b
    • a=1, b=2
    • *args
    • **kwargs
    • a, b=1, *args

    • ......
  • 這裏的expression是一個關於參數的表達式。表達式中出現的參數須要在argument_list中有定義,而且表達式只能是單行的。如下都是合法的表達式:expression:不能包含分支或循環(但容許條件表達式),也不能包含return(或yield)函數。若是爲元組,則應用圓括號將其包含起來。
    • 1
    • None
    • a + b
    • sum(a)
    • 1 if a >10 else 0
      ......
  • 三個特性lambda函數有以下特性:
    • lambda函數是匿名的:所謂匿名函數,通俗地說就是沒有名字的函數。lambda函數沒有名字。
    • lambda函數有輸入和輸出:輸入是傳入到參數列表argument_list的值,輸出是根據表達式expression計算獲得的值。
    • lambda函數通常功能簡單:單行expression決定了lambda函數不可能完成複雜的邏輯,只能完成很是簡單的功能。因爲其實現的功能一目瞭然,甚至不須要專門的名字來講明。
  • 四個用法
  1. Lambda本質上的用法只有一個,那就是定義一個Lamda函數,可是在實踐使用的過程當中還能夠分爲幾種擴展用法:
  2. 用來屏蔽函數或標準庫函數:
time.sleep=lambda x:None
'''後續代碼中調用time庫的sleep函數將不會執行原有的功能。例如,執行time.sleep(3)時,程序不會休眠3秒鐘,而是什麼都不作。括號中的x表明這個標準庫函數的本來形參。'''
  1. 閉包:將lambda函數做爲其餘函數的返回值,返回給調用者。
return lambda x,y:x+y
'''。這時,lambda函數其實是定義在某個函數內部的函數,稱之爲嵌套函數,或者內部函數。對應的,將包含嵌套函數的函數稱之爲外部函數。內部函數可以訪問外部函數的局部變量,這個特性是閉包(Closure)編程的基礎,在這裏咱們不展開。'''
  1. 將lambda函數做爲參數傳遞給其餘函數,最基本的就是Print()函數。部分Python內置函數接收函數做爲參數。典型的此類內置函數有這些。
filter(lambda x: x % 3 == 0, [1, 2, 3])
 
sorted函數。此時lambda函數用於指定對列表中全部元素進行排序的準則。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素與5距離從小到大進行排序,其結果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
 
map函數。此時lambda函數用於指定對列表中每個元素的共同操做。例如map(lambda x: x+1, [1, 2,3])將列表[1, 2, 3]中的元素分別加1,其結果[2, 3, 4]。
 
reduce函數。此時lambda函數用於指定列表中兩兩相鄰元素的結合條件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素從左往右兩兩以逗號分隔的字符的形式依次結合起來,其結果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。
  • 一個爭議

    > 事實上,關於lambda在Python社區是存在爭議的。Python程序員對於到底要不要使用lambda意見不一致。

    做者:獨孤球是
    來源:CSDN
    原文:https://blog.csdn.net/zjuxsl/article/details/79437563?utm_source=copy
    版權聲明:本文爲博主原創文章,轉載請附上博文連接!
  • 我本身寫的一個 求平方的匿名函數
>>>pf = lambda x:x**2
>>>pf(1)
1
>>>pf(2)
4
  • 求幾個數之和的匿名函數

    f = lambda *args:sum(args)
    f(1,2,3,4)
    10

    內置函數

  • filter()

    函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
    該接收兩個參數,第一個爲函數,第二個爲序列,序列的每一個元素做爲參數傳遞給函數進行判,而後返回 True 或 False,最後將返回 True 的元素放到新列表中。

  • filter(function, iterable)

    def is_odd(n):
    return n % 2 == 1
    newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    print(newlist)
  • print()

    print()函數接收不少參數,咱們須要主要學習的是sep,end,file這個三個參數;能夠在源碼中看到,他們的默認值是:sep=' ', end='\n', file=None
    sep是改變多個輸出內容的分隔符,end是改變輸出末尾的換行,file則是輸出到一個文件

    • file參數
    # file參數指向的應該是一個文件對象
    with open("new.txt","a+") as f:
        print("Print over.",file=f)
    # 這樣能夠將輸出內容打印到一個文件中去
  • enumrate()

    遍歷索引:當遍歷一個可迭代對象時候,使用此函數能夠提供遍歷索引。

    for index,name in all_name:
    ... print(index,name)
    1 tom
    2 lily
    3 alice
    ...

python os模塊

在python編程時操做文件與目錄、以及使用shell命令,就須要os模塊的支持。os模塊包含廣泛的操做系統功能,與具體的平臺無關。

培養我的代碼風格

  • 顯式釋放本身申請的內存資源是一個卓越的習慣。使用del命令來顯式刪除對象。
    • del 對象

生成六位驗證碼

sms_code = "%06d" % random.randint    # 生成驗證碼

django創建redis數據庫鏈接

  • views視圖
from django_redis import get_redis_connection
redis_conn = get_redis_connection
  • dev(setting.py)配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "session": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    # 圖片驗證碼的redis
    "verify_codes": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }

}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

使用redis管道

# 使用redis的pipeline管道一次執行多個命令
pl = redis_conn.pipeline()
# 保存短信驗證碼
redis_conn.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPRIES, sms_code)

# 保存當前的時間,只是作個記錄而已,60s過時
redis_conn.setex('sms_interval', constants.SMS_CODE_REDIS_INTERVAL, datetime.now())
# 讓管道執行命令
pl.execute()

數學變量在這裏

  • 平均數 mea
  • 個位數 unit
  • 十位數 ten
  • 百位數 hund
  • 千位數 thou
  • 個數 num
  • 分母 den
  • 分子 nume0

itsdangerous簽名模塊

itsdangerous(它是危險的),顧名思義。如下是來自官方網站的介紹。

  • 安裝
(Py_Django2.0.6) C:\Users\DELL\Desktop\meiduo-email>pip install itsdangerous
  • Signer方法
>>> from itsdangerous import Signer     # 導入Signer方法
>>> s = Signer('secret-key')    # 實例化一個以‘secret-key’爲密鑰的<class 'itsdangerous.signer.Signer'>對象
>>> s.sign('my string')     # 使用這個對象含有的密鑰 使用字符串生成簽名
b'my string.wh6tMHxLgJqB6oY1uT73iMlyrOA'    # 這一步是可逆的
>>> s.unsign('my string.wh6tMHxLgJqB6oY1uT73iMlyrOA')       # 對這個簽名進行轉碼
b'my string'
  • TimedJSONWebSignatureSerializer模塊

它繼承了JSONWebSignatureSerializer類。

首先咱們來看生成令牌和解碼令牌的代碼:
from itsdangerous import TimedJSONWebSignatureSerializer
    s = TimedJSONWebSignatureSerializer(app.config['SECRET_KEY'], expires_in=3600)
    token = s.dumps({'confirm': 23})
    data = s.loads(token)
--------------------- 
做者:她叫徐曉jie 
來源:CSDN 
原文:https://blog.csdn.net/sinat_34927324/article/details/78378911 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!

咱們老師的老大使用這個模塊生成了token,而且對它進行了解密。

def generate_email_verify_url(self):
    serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=24*60*60)       # 生成token
    data = {'user_id': self.id, 'email': self.email}
    token = serializer.dumps(data).decode()
    verify_url = 'http://127.0.0.1:8080/success_verify_email.html?token=' + token
    return verify_url

解密。

@staticmethod  # 類能夠直接調用
    def check_email_verify_token(token):
        """
        檢查驗證郵件的token
        """
        serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=300)
        try:
            data = serializer.loads(token)      # 對token進行解碼
        except BadData:
            return None
        else:
            email = data.get('email')
            user_id = data.get('user_id')
            User.objects.filter(id=user_id, email=email).update(email_active=True)
            return True

Pythonic 與 Python之禪

  • Pythonic

    英[paɪ'θɒnɪk] 美[paɪ'θɒnɪk]
    adj. 神諭的,預言的,大蟒似的;
    Pythoner們常說,寫代碼要寫得Pythonic一些,那麼什麼是Pythonic呢?Pythonic實際上是一種編碼風格。瞧瞧這翻譯,夠酷炫的。神諭的,什麼是神諭?那是神說的話,神說話,一貫簡單簡短又充滿哲理。這就是咱們寫Python程序要達成的目標,Python代碼應該寫的簡短又精彩。

  • Python之禪

  • Python之禪是Python的一個彩蛋,在Python交互式解釋器中輸入import this就會顯示Tim Peters的The Zen of python
  • 原文

    >>> import this
    The Zen of Python, by Tim Peters
    Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.
    In the face of ambiguity, refuse the temptation to guess.
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.
    Now is better than never.
    Although never is often better than *right* now.
    If the implementation is hard to explain, it's a bad idea.
    If the implementation is easy to explain, it may be a good idea.
    Namespaces are one honking great idea -- let's do more of those!

  • 翻譯

Python之禪 by Tim Peters
 
優美勝於醜陋(Python 以編寫優美的代碼爲目標)
明瞭勝於晦澀(優美的代碼應當是明瞭的,命名規範,風格類似)
簡潔勝於複雜(優美的代碼應當是簡潔的,不要有複雜的內部實現)
複雜勝於凌亂(若是複雜不可避免,那代碼間也不能有難懂的關係,要保持接口簡潔)
扁平勝於嵌套(優美的代碼應當是扁平的,不能有太多的嵌套)
間隔勝於緊湊(優美的代碼有適當的間隔,不要奢望一行代碼解決問題)
可讀性很重要(優美的代碼是可讀的)
即使假借特例的實用性之名,也不可違背這些規則(這些規則至高無上)
不要包容全部錯誤,除非你肯定須要這樣作(精準地捕獲異常,不寫 except:pass 風格的代碼)
當存在多種可能,不要嘗試去猜想
而是儘可能找一種,最好是惟一一種明顯的解決方案(若是不肯定,就用窮舉法)
雖然這並不容易,由於你不是 Python 之父(這裏的 Dutch 是指 Guido )
作也許好過不作,但不假思索就動手還不如不作(動手以前要細思量)
若是你沒法向人描述你的方案,那確定不是一個好方案;反之亦然(方案測評標準)
命名空間是一種絕妙的理念,咱們應當多加利用(倡導與號召)
 
出自:意氣相許的許
連接:https://www.jianshu.com/p/0e1f38c2c122
來源:簡書
簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

知道創宇·任務四象限

第一象限:緊急重要·趕忙搞定
第二象限:重要,不緊急·保持關注
第三象限:緊急不重要·學會拒絕
第四象限:不緊急,不重要·靠自律
——來自知道創宇技能表

推薦書單:

《python程序設計(第二版)》
《笨方法學Python》

*返回目錄再看看*

相關文章
相關標籤/搜索