1. 程式人生 > >小甲魚Python學習筆記

小甲魚Python學習筆記

html 解決 www. agen emp 遍歷 CI 微軟 -a

isdigit()
True: Unicode數字,byte數字(單字節),全角數字(雙字節),羅馬數字
False: 漢字數字
Error: 無

isdecimal()
True: Unicode數字,,全角數字(雙字節)
False: 羅馬數字,漢字數字
Error: byte數字(單字節)

isnumeric()
True: Unicode數字,全角數字(雙字節),羅馬數字,漢字數字
False: 無
Error: byte數字(單字節)

二、andor

python 中的and從左到右計算表達式,若所有值均為真,則返回最後一個值,若存在假,返回第一個假值。

or也是從左到有計算表達式,返回第一個為真的值。

、優先級

冪運算>正負號>算術操作符>比較操作符>邏輯運算符

-3**2=-9 3**-2=0.1111111111 冪運算的優先級:與單目操作符(一般為負號)結合時,比右側的優先級低,比左側的優先級高。

四、哈希/字典/映射/散列

dict為內置函數,使用時必須用括號將內容括起來,這是最外面的一層括號;由於dict函數內只支持一個參數,所以將f I s h c 這些元素都用括號包起來模擬成一個參數,實際上這些元素都是分開的,這層括號是中間層的,內層的括號只是用來將每個元素隔開。

dict.setdefault()在使用時如果鍵為引號引起的數字,則在顯示中沒有引號,如果為字母或符號,則會有引號標註。如果括號內的鍵字典中已存在,則會顯示出該鍵所對應的值。

五、內嵌函數和閉包

global

nonlocal

六、Os

os.walk(top)遍歷top目錄下所有子目錄並返回一個三元組(‘路徑‘,[路徑包含目錄],[路徑包含文件])

>>> test = os.walk(r‘D:\Python34\test‘)
>>> test
<generator object walk at 0x02365DA0>
>>> temp = list(test)
>>> for each in temp:
each


(‘D:\\Python34\\test‘, [‘002‘, ‘0035‘, ‘test下的第二個文件‘], [‘intorfloat - 副本 - 副本.py‘, ‘intorfloat-1.py‘, ‘intorfloat.py‘, ‘log_in-box.py‘, ‘log_in重命名.py‘])
(‘D:\\Python34\\test\\002‘, [], [‘guess.py‘, ‘流程圖.png‘, ‘流程圖.vsd‘])
(‘D:\\Python34\\test\\0035‘, [], [‘case01.py‘])
(‘D:\\Python34\\test\\test下的第二個文件‘, [‘下一級文件夾‘], [])
(‘D:\\Python34\\test\\test下的第二個文件\\下一級文件夾‘, [], [])

七、locals 和globals

Python兩個內置函數——locals 和globals


這兩個函數主要提供,基於字典的訪問局部和全局變量的方式。
在理解這兩個函數時,首先來理解一下python中的名字空間概念。Python使用叫做名字空間的
東西來記錄變量的軌跡。名字空間只是一個字典,它的鍵字就是變量名,字典的值就是那些變
量的值。實際上,名字空間可以象Python的字典一樣進行訪問
每個函數都有著自已的名字空間,叫做局部名字空間,它記錄了函數的變量,包括函數的參數
和局部定義的變量。每個模塊擁有它自已的名字空間,叫做全局名字空間,它記錄了模塊的變
量,包括函數、類、其它導入的模塊、模塊級的變量和常量。還有就是內置名字空間,任何模
塊均可訪問它,它存放著內置的函數和異常。
當一行代碼要使用變量 x 的值時,Python會到所有可用的名字空間去查找變量,按照如下順序:
1.局部名字空間 - 特指當前函數或類的方法。如果函數定義了一個局部變量 x,Python將使用
這個變量,然後停止搜索。
2.全局名字空間 - 特指當前的模塊。如果模塊定義了一個名為 x 的變量,函數或類,Python
將使用這個變量然後停止搜索。
3.內置名字空間 - 對每個模塊都是全局的。作為最後的嘗試,Python將假設 x 是內置函數或變量。
如果Python在這些名字空間找不到 x,它將放棄查找並引發一個 NameError 的異常,同時傳遞
There is no variable named ‘x‘ 這樣一條信息。

八、

dir(classname)查看類中有哪些東西
dir(instance)查看實例中有哪些東西
__dict__查看有哪些屬性
id()查看哪些屬性一樣
我通過一系列測試得出結論:
類中的所有東西都“復制”實例中了包括類函數,靜態函數,類變量,其實能通過實例調用相同名字的類變量
instance__class__.value
另外self是用來進行綁定用的,這點可以通過直接打印函數名能夠看到哪個類的對象被綁定
另外還有繼承,也可以用上述方法研究看看這些父類子類中到底有哪些東西:其實父類中所有的東西也都復制到子類中了,正是有了顯示綁定才能方便的用子類實例調用父類的方法:應為子類實例綁定了父類函數
說到底,都是python的設計哲學比較好,能夠用一些方法清楚的看到所有的東西,比起java來說迷迷糊糊的只能看資料了解哪些類中有什麽東西,繼承時,創建實例時發生了什麽改變。

Python類中的一些內置函數用法

1.issubclass(class,classinfo)判斷一個類是否是另一個類或類組成的元組的其中一個類的子類的方法

>>> class A:
pass
>>> class B(A):
pass
>>> issubclass(B,A)
True
>>> issubclass(B,object)
True
>>> issubclass(B,B)
True

2.isinstance(object,class)判斷是否是一類的實例化對象

>>> class A:
pass
>>> class B(A):
pass
>>> a = A()
>>> b = B()
>>> isinstance(a,A)
True
>>> isinstance(a,B)
False
>>> isinstance(b,B)
True
>>> isinstance(b,A)
True

3.hasattr(object,name)測試一個對象是否有指定的屬性

4.getattr(object,name[,default])返回一個對象內某個成員的值

>>> class C:
def __init__(self,size):
self.size = size

>>> c1 = C(3)

>>> getattr(c1,‘size‘)
3

>>> getattr(s1,‘size‘,‘屬性不存在!‘)
‘屬性不存在!‘

5.setattr(object,name,value)設置一個對象內某個變量的值

>>> class C:
def __init__(self,size):
self.size = size

>>> c1 = C(3)

>>> setattr(c1,‘size‘,5)
>>> getattr(c1,‘size‘)
5

6.delattr(object,name)刪除一個對象的某個變量

>>> class C:
def __init__(self,size):
self.size = size
>>> c1 = C(3

>>> delattr(c1,‘size‘)
>>> getattr(c1,‘size‘,‘對象%s內不存在%s變量‘%(‘c1‘,‘size‘))
‘對象c1內不存在size變量

7.property(fget=None,fset=None,fdel=None,doc=None) 用屬性設置屬性,第一個參數為獲取對象屬性的方法名,第二個參數為設置對象屬性的方法名,第三個參數為刪除對象屬性的方法名,可以將其賦值給一個對象屬性,那麽當其被對一個對象調用時則調用對象內定義的獲取對象屬性方法,當對其進行賦值時則調用設置對象屬性的方法,當用del語句刪除時則調用刪除對象屬性的方法,舉例說明:
>>> class Case:
def __init__(self,size):
self.size = size
def getSize(self):
print(‘正在調用獲得對象屬性的方法!‘)
return self.size
def setSize(self,value):
print(‘正在調用設置對象屬性的方法!‘)
self.size = value
def delSize(self):
print(‘正在調用刪除對象屬性的方法!‘)
del self.size
x = property(getSize,setSize,delSize
>>> s1 = Case(3)
>>> s1.x
正在調用獲得對象屬性的方法!
3
>>> s1.x = 5
正在調用設置對象屬性的方法!
>>> s1.x
正在調用獲得對象屬性的方法!
5
>>> del s1.x
正在調用刪除對象屬性的方法!
>>> getattr(s1,‘size‘,‘屬性不存在!‘)
屬性不存在!

十、修飾符(裝飾器)

終於算明白了這個修飾符的基礎概念。
這個修飾符@,其實是建立在閉包基礎上的一種概念。
我的問題裏面,說通常func()要重寫一遍,應該是說在定義的時候是這樣的,
def timeslong():
def func():
.....
那麽調用的時候就是 a = timeslong() a()才能調用到func()。大概這麽個意思吧。。。

但是如果改用修飾符
@timeslong
def func()
就會直接把func作為timeslong的參數傳入,返回一個對象再賦值給func
即:func() = timeslong(func)()

附:https://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html

十一、全局變量和局部變量

參考文獻:https://www.cnblogs.com/z360519549/p/5172020.html

十二、編碼

什麽是編碼



事實上計算機只認識 0 和 1,然而我們卻可以通過計算機來顯示文本,這就是靠編碼實現的。編碼其實就是約定的一個協議,比如 ASCII 編碼約定了大寫字母 A 對應十進制數 65,那麽在讀取一個字符串的時候,看到 65,計算機就知道這是大寫字母 A 的意思。

由於計算機是美國人發明的,所以這個 ASCII 編碼設計時只采用 1 個字節存儲(事實上只用了 7 位,1 個字節有 8 位),包含了大小寫英文字母、數字和一些符號。但是計算機在全世界普及之後,ASCII 編碼就成了一個瓶頸,因為 1 個字節是完全不足以容納各國語言的。

大家都知道英文只用 26 個字母就可以組成不同的單詞,而漢字光常用字就有好幾千個,至少需要 2 個字節才足以存放,所以後來中國制訂了 GB2312 編碼,用於對漢字進行編碼。

然後日本為自己的文字制訂了 Shift_JIS 編碼,韓國為自己的文字制訂了 Euc-kr 編碼,一時之間,各國都制訂了自己的標準。不難想象,不同的標準放在一起,就難免出現沖突。這也正是為什麽最初的計算機總是容易看到亂碼的現象。

為了解決這個問題,Unicode 編碼應運而生。Unicode 組織的想法最初也很簡單:創建一個足夠大的編碼,將所有國家的編碼都加進來,進行統一標準。

沒錯,這樣問題就解決了。但新的問題也出現了:如果你寫的文本只包含英文和數字,那麽用 Unicode 編碼就顯得特別浪費存儲空間(用 ASCII 編碼只占用一半的存儲空間)。所以本著能省一點是一點的精神,Unicode 還創造出了多種實現方式。

比如常用的 UTF-8 編碼就是 Unicode 的一種實現方式,它是可變長編碼。簡單地說,就是當你的文本是 ASCII 編碼的字符時,它用 1 個字節存放;而當你的文本是其它 Unicode 字符的情況,它將按一定算法轉換,每個字符使用 1~3 個字節存放。這樣便實現了有效節省空間的目的。

十三爬蟲

1.(推薦)由於 GBK 是向下兼容 GB2312,因此你檢測到是 GB2312,則直接用 GBK 來編碼/解碼

>>> if chardet.detect(response)[‘encoding‘] == ‘GB2312‘:

response.decode(‘GBK‘)

……

<ul><li># <a href="thread-64400-1-1.html" title="喬布斯最精彩演講:這三個故事決定了我的一生" target="_blank">喬布斯最精彩演講:這三個故事決定了我的一</a></li><li># <a href="thread-50608-1-1.html" title="42個鍛煉大腦的方法,你想不聰明都不行!" target="_blank">42個鍛煉大腦的方法,你想不聰明都不行!</a></li><li># <a href="thread-23917-1-1.html" title="屌絲看完,淚流滿面(轉)" target="_blank">屌絲看完,淚流滿面(轉)

2. GET:是指向服務器請求獲得數據

POST:是指向指定服務器提交被處理的數據

3. urllib.parse.urlencode()encodeutf-8:把一個date(字典形式)編碼成url形式,然後硬編碼成utf-8形式

4. 修改headsRequest生成之前:把User-Agent以字典的形式賦值給head,通過urllib.request.Requesturldatehead)傳入。

Request生成之後:req=urllib.request.Requesturldate

req.add_header(‘User-Agent’,’User-Agent對應的值’)

這樣傳入

5.反向引用(鏈接https://www.cnblogs.com/-ShiL/archive/2012/04/06/Star201204061009.html

捕獲組匹配到什麽,反向引用也只能匹配到什麽。

6.前向肯定斷言、前向否定斷言、後向肯定斷言、後向否定斷言

解釋:

參考鏈接:https://www.crifan.com/detailed_explanation_about_python_regular_express_positive_lookbehind_assertion/

鏈接:https://blog.csdn.net/lilongsy/article/details/78505309

7.urllib.request.Request()是什麽意思?

urllib.request.Request()不是一個函數,而是一個類,類具有自帶的多種屬性和多種可供操作的方法。以URL為參數將類實例化後,不需要自定義方法和屬性,可直接使用類中的方法和屬性,方便對URL進行操作

#可以將url先構造成一個Request對象,傳進urlopen #Request存在的意義是便於在請求的時候傳入一些信息,而urlopen則不

8.由於urlopen()對於一些HTTP的高級功能不支持,所以,如果我們要修改報頭,則可以使用urllib.request.build_opener()方法。當然,也可以使用urllib.request.Request()實現瀏覽器的模擬。重點在前者,後者在後面的學習中才會用到。

小甲魚Python學習筆記