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

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