python學習筆記,打算用五章介紹完python基礎語法及基本用法。
開發環境: python3.7? ? 推薦:? ? https://github.com/jackfrued/Python-100-Days? ? ? ?python基礎語法學習不錯。
編碼規范:
PEP 8風格指南
PEP是Python Enhancement Proposal的縮寫,通常翻譯為“Python增強提案”。每個PEP都是一份為Python社區提供的指導Python往更好的方向發展的技術文檔,其中的第8號增強提案(PEP 8)是針對Python語言編訂的代碼風格指南。盡管我們可以在保證語法沒有問題的前提下隨意書寫Python代碼,但是在實際開發中,采用一致的風格書寫出可讀性強的代碼是每個專業的程序員應該做到的事情,也是每個公司的編程規范中會提出的要求,這些在多人協作開發一個項目(團隊開發)的時候顯得尤為重要。我們可以從Python官方網站的PEP 8鏈接中找到該文檔,下面我們對該文檔的關鍵部分做一個簡單的總結。
空格的使用
- 使用空格來表示縮進而不要用制表符(Tab)。這一點對習慣了其他編程語言的人來說簡直覺得不可理喻,因為絕大多數的程序員都會用Tab來表示縮進,但是要知道Python并沒有像C/C++或Java那樣的用花括號來構造一個代碼塊的語法,在Python中分支和循環結構都使用縮進來表示哪些代碼屬于同一個級別,鑒于此Python代碼對縮進以及縮進寬度的依賴比其他很多語言都強得多。在不同的編輯器中,Tab的寬度可能是2、4或8個字符,甚至是其他更離譜的值,用Tab來表示縮進對Python代碼來說可能是一場災難。
- 和語法相關的每一層縮進都用4個空格來表示。
- 每行的字符數不要超過79個字符,如果表達式因太長而占據了多行,除了首行之外的其余各行都應該在正常的縮進寬度上再加上4個空格。
- 函數和類的定義,代碼前后都要用兩個空行進行分隔。
- 在同一個類中,各個方法之間應該用一個空行進行分隔。
- 二元運算符的左右兩側應該保留一個空格,而且只要一個空格就好。
標識符命名
PEP 8倡導用不同的命名風格來命名Python中不同的標識符,以便在閱讀代碼時能夠通過標識符的名稱來確定該標識符在Python中扮演了怎樣的角色(在這一點上,Python自己的內置模塊以及某些第三方模塊都做得并不是很好)。
- 變量、函數和屬性應該使用小寫字母來拼寫,如果有多個單詞就使用下劃線進行連接。
- 類中受保護的實例屬性,應該以一個下劃線開頭。
- 類中私有的實例屬性,應該以兩個下劃線開頭。
- 類和異常的命名,應該每個單詞首字母大寫。
- 模塊級別的常量,應該采用全大寫字母,如果有多個單詞就用下劃線進行連接。
-
類的實例方法,應該把第一個參數命名為
self
以表示對象自身。 -
類的類方法,應該把第一個參數命名為
cls
以表示該類自身。
表達式和語句
在Python之禪(可以使用
import this
查看)中有這么一句名言:“There should be one-- and preferably only one --obvious way to do it.”,翻譯成中文是“做一件事應該有而且最好只有一種確切的做法”,這句話傳達的思想在PEP 8中也是無處不在的。
-
采用內聯形式的否定詞,而不要把否定詞放在整個表達式的前面。例如
if a is not b
就比if not a is b
更容易讓人理解。 -
不要用檢查長度的方式來判斷字符串、列表等是否為
None
或者沒有元素,應該用if not x
這樣的寫法來檢查它。 -
就算
if
分支、for
循環、except
異常捕獲等中只有一行代碼,也不要將代碼和if
、for
、except
等寫在一起,分開寫才會讓代碼更清晰。 -
import
語句總是放在文件開頭的地方。 -
引入模塊的時候,
from math import sqrt
比import math
更好。 -
如果有多個
import
語句,應該將其分為三部分,從上到下分別是Python標準模塊、第三方模塊和自定義模塊,每個部分內部應該按照模塊名稱的字母表順序來排列。
?
python的關鍵字
import keyword print (keyword.kwlist) print (len(keyword.kwlist))
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
35
?python內置函數? ? ?BIF:(built-in functions)內置函數
?
# !/usr/bin/env python3.7 # -*- coding:utf-8 -*- # Author: Lancer 2019-09-02 10:07:21 import math # abs() 函數返回數字的絕對值 print (abs(-8 )) # divmod() 函數把除數和余數運算結果結合起來,返回一個包含商和余數的元組(a // b, a % b) print (divmod(9, 2 )) # input() 函數接受一個標準輸入數據,返回為 string 類型 # a = input("input:") # print(a) # open() 函數用于打開一個文件,創建一個 file 對象,相關的方法才可以調用它進行讀寫 # staticmethod() 返回函數的靜態方法。 # all() 函數用于判斷給定的可迭代參數 iterable 中的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。 # enumerate() 函數用于將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中 seasons = [ ' Spring ' , ' Summer ' , ' Fall ' , ' Winter ' ] print (list(enumerate(seasons)) ) # int() 函數用于將一個字符串或數字轉換為整型。 print ( int( ' 0xa ' ,16 ) ) # ord() 函數是 chr() 函數(對于8位的ASCII字符串)或 unichr() 函數(對于Unicode對象)的配對函數,它以一個字符(長度為1的字符串)作為參數,返回對應的 ASCII 數值,或者 Unicode 數值, # 如果所給的 Unicode 字符超出了你的 Python 定義范圍,則會引發一個 TypeError 的異常 print (ord( ' c ' )) # str() 函數將對象轉化為適于人閱讀的形式 dict_test = { ' runoob ' : ' runoob.com ' , ' google ' : ' google.com ' } print (str(dict_test)) # any() 函數用于判斷給定的可迭代參數 iterable 是否全部為 False,則返回 False,如果有一個為 True,則返回 True print (any([ ' a ' , ' b ' , ' c ' , ' d ' ])) # eval() 函數用來執行一個字符串表達式,并返回表達式的值 x = 7 print (eval( ' 3 * x ' )) # isinstance() 函數來判斷一個對象是否是一個已知的類型,類似 type() print (isinstance (x,int)) # pow() 方法返回 xy(x的y次方) 的值 print ( pow(2,5 )) # sum() 方法對系列進行求和計算 print (sum([5,6,8 ])) # basestring() 方法是 str 和 unicode 的超類(父類),也是抽象類,因此不能被調用和實例化,但可以被用來判斷一個對象是否為 str 或者 unicode 的實例 # isinstance(obj, basestring) 等價于 isinstance(obj, (str, unicode))。 print (isinstance( " Hello world " , str)) # execfile() 函數可以用來執行一個文件。 execfile('hello.py') # issubclass() 方法用于判斷參數 class 是否是類型參數 classinfo 的子類。 class A: pass class B(A): pass print (issubclass(B,A)) # print() 方法用于打印輸出,最常見的一個函數。 print 在 Python3.x 是一個函數,但在 Python2.x 版本不是一個函數,只是一個關鍵字。 ''' super() 函數是用于調用父類(超類)的一個方法。 super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復調用(鉆石繼承)等種種問題。 MRO 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。 ''' # bin() 返回一個整數 int 或者長整數 long int 的二進制表示 print (bin(255 )) # file() 函數用于創建一個 file 對象,它有一個別名叫 open(),更形象一些,它們是內置函數。參數是以字符串的形式傳遞的。 # iter() 函數用來生成迭代器。 lst = [1, 2, 3 ] for i in iter(lst): print (i) # Python len() 方法返回對象(字符、列表、元組等)長度或項目個數。 print (len(lst)) # python range() 函數可創建一個整數列表,一般用在 for 循環中。 range(start, stop[, step]) # type() 函數如果你只有第一個參數則返回對象的類型,三個參數返回新的類型對象。 # property() 函數的作用是在新式類中返回屬性值。 # Python 元組 tuple() 函數將列表轉換為元組。 print (tuple([1,2,3,4 ])) # bool() 函數用于將給定參數轉換為布爾類型,如果沒有參數,返回 False。 bool 是 int 的子類。 # filter() 函數用于過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。 ''' class bytearray([source[, encoding[, errors]]]) 如果 source 為整數,則返回一個長度為 source 的初始化數組; 如果 source 為字符串,則按照指定的 encoding 將字符串轉換為字節序列; 如果 source 為可迭代類型,則元素必須為[0 ,255] 中的整數; 如果 source 為與 buffer 接口一致的對象,則此對象也可以被用于初始化 bytearray。 如果沒有輸入任何參數,默認就是初始化數組為0個元素。 bytearray() 方法返回一個新字節數組。這個數組里的元素是可變的,并且每個元素的值范圍: 0 <= x < 256。 ''' print (bytearray([1,2,3]), bytearray( ' runoob ' , ' utf-8 ' ) ) # float() 函數用于將整數和字符串轉換成浮點數。 # ist() 方法用于將元組轉換為列表。 aTuple = (123, ' xyz ' , ' zara ' , ' abc ' ) print (list(aTuple)) # python raw_input() 用來獲取控制臺的輸入。 raw_input() 將所有輸入作為字符串看待,返回字符串類型。 # unichr() 函數 和 chr()函數功能基本一樣, 只不過是返回 unicode 的字符。 # callable() 函數用于檢查一個對象是否是可調用的。如果返回 True,object 仍然可能調用失敗;但如果返回 False,調用對象 object 絕對不會成功。 # Python2.6 開始,新增了一種格式化字符串的函數 str.format(),它增強了字符串格式化的功能。 基本語法是通過 {} 和 : 來代替以前的 % 。 format 函數可以接受不限個參數,位置可以不按順序。 # locals() 函數會以字典類型返回當前位置的全部局部變量。 對于函數, 方法, lambda 函式, 類, 以及實現了 __call__ 方法的類實例, 它都返回 True。 # reduce() 函數會對參數序列中元素進行累積。 函數將一個數據集合(鏈表,元組等)中的所有數據進行下列操作:用傳給 reduce 中的函數 function(有兩個參數)先對集合中的第 1、2 個元素進行操作, # 得到的結果再與第三個數據用 function 函數運算,最后得到一個結果。 # chr() 用一個范圍在 range(256)內的(就是0~255)整數作參數,返回一個對應的字符。 print (chr(97 )) # frozenset() 返回一個凍結的集合,凍結后集合不能再添加或刪除任何元素。 # long() 函數將數字或字符串轉換為一個長整型。 # reload() 用于重新載入之前載入的模塊。 # vars() 函數返回對象object的屬性和屬性值的字典對象。 # getattr() 函數用于返回一個對象屬性值。 # map() 會根據提供的函數對指定序列做映射。 第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。 # repr() 函數將對象轉化為供解釋器讀取的形式。 # xrange() 函數用法與 range 完全相同,所不同的是生成的不是一個數組,而是一個生成器。 # cmp(x,y) 函數用于比較2個對象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 # lobals() 函數會以字典類型返回當前位置的全部全局變量。 # max() 方法返回給定參數的最大值,參數可以為序列。 print (max(80, 100, 1000 )) # reverse() 函數用于反向列表中元素。 aList = [123, ' xyz ' , ' zara ' , ' abc ' , ' xyz ' ] aList.reverse() print (aList) # zip() 函數用于將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表。 # compile() 函數將一個字符串編譯為字節代碼。 # hasattr() 函數用于判斷對象是否包含對應的屬性。 # memoryview() 函數返回給定參數的內存查看對象(Momory view)。 所謂內存查看對象,是指對支持緩沖區協議的數據進行包裝,在不需要復制對象基礎上允許Python代碼訪問 # round() 方法返回浮點數x的四舍五入值。 # __import__() 函數用于動態加載類和函數 。 如果一個模塊經常變化就可以使用 __import__() 來動態載入。 __import__(name[, globals[, locals[, fromlist[, level]]]]) # complex() 函數用于創建一個值為 real + imag * j 的復數或者轉化一個字符串或數為復數。如果第一個參數為字符串,則不需要指定第二個參數。。 # hash() 用于獲取取一個對象(字符串或者數值等)的哈希值。 print (hash( ' hello ' ) ) # min() 方法返回給定參數的最小值,參數可以為序列。 # set() 函數創建一個無序不重復元素集,可進行關系測試,刪除重復數據,還可以計算交集、差集、并集等。 # delattr 函數用于刪除屬性。 # help() 函數用于查看函數或模塊用途的詳細說明 # next() 返回迭代器的下一個項目。 # setattr() 函數對應函數 getattr(),用于設置屬性值,該屬性不一定是存在的。 # dict() 函數用于創建一個字典。 print ( dict(a= ' a ' , b= ' b ' , t= ' t ' ) ) # hex() 函數用于將10進制整數轉換成16進制,以字符串形式表示。 print (hex(15 )) # slice() 函數實現切片對象,主要用在切片操作函數里的參數傳遞。 # dir() 函數不帶參數時,返回當前范圍內的變量、方法和定義的類型列表;帶參數時,返回參數的屬性、方法列表。如果參數包含方法__dir__(),該方法將被調用。如果參數不包含__dir__(),該方法將最大限度地收集參數信息。 # id() 函數用于獲取對象的內存地址。 # oct() 函數將一個整數轉換成8進制字符串。 ''' sorted() 函數對所有可迭代的對象進行排序操作。 sort 與 sorted 區別: sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。 list 的 sort 方法返回的是對已經存在的列表進行操作,無返回值,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。 sorted(iterable, cmp=None, key=None, reverse=False) iterable -- 可迭代對象。 cmp -- 比較的函數,這個具有兩個參數,參數的值都是從可迭代對象中取出,此函數必須遵守的規則為,大于則返回1,小于則返回-1,等于則返回0。 key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自于可迭代對象中,指定可迭代對象中的一個元素來進行排序。 reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認 ''' a = [5,7,6,3,4,1,2 ] b = sorted(a) # 保留原列表 print (b)
?函數裝飾器和閉包
1? 裝飾器基礎知識:
裝飾器是可調用對象,其參數是另外一個函數(被裝飾的函數),裝飾器可能會處理被裝飾的函數,然后把他返回,或者將其替換成另一個函數和或者可調用對象。
def deco(func): def inner(): print ( " running inner " ) return inner @deco def target(): print ( " running target() " ) target() # 運行結果:running inner
deco返回inner函數對象,使用deco裝飾target, 調用被裝飾的target其實會運行inner。嚴格來說,裝飾器只是語法糖,裝飾器可以像常規的調用對象那樣調用,其參數是另一個函數。
上文中? @deco? ? 等價于? ?deco(target)
裝飾器特性 1? 能把被裝飾的函數替換為其他函數? ? 2 裝飾器在加載模塊時候立即執行,被裝飾的函數只在明確調用時運行。
2? 變量作用域規則
b = 6 def f2(a): print (a) print (b) b = 9 f2( 3 ) ''' Traceback (most recent call last): File "作用域.py", line 12, inf2(3) File "作用域.py", line 9, in f2 print(b) Unboun
實際python編譯函數的定義體時,它判斷b是局部變量,因為函數體中給它賦值了,生成字節碼證實了這種判斷,python會嘗試從本地環境獲取b。如果函數體中賦值想讓解釋器把b當成全局變量,
要用global聲明。
b = 6 def f2(a): global b print (a) print (b) b = 9 f2( 3 ) print (b) ''' 3 6 9 '''
3 閉包:
4 對象引用
pipixia = { " name " : " pipi01 " , " age " :18 } dapipixia = pipixia print (dapipixia is pipixia) print (id(pipixia),id(dapipixia)) pipixia[ " eating " ] = " yes " print (dapipixia) eq_pipixia = { ' age ' : 18, ' eating ' : ' yes ' , ' name ' : ' pipi01 ' } print (pipixia == eq_pipixia) print (pipixia is eq_pipixia) ''' True 60536520 60536520 {'age': 18, 'eating': 'yes', 'name': 'pipi01'} True False '''
dapipixia? 就是pipixia別名,id()類似C語言地址,具有唯一性。 ==比較值 ,is比較對象標識(id()返回對象標識的整數表示)。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
