python之基本內容

来源:http://www.cnblogs.com/zhangdewang/archive/2017/07/26/7236831.html
-Advertisement-
Play Games

這裡提供在使用python進行開發中常使用到的方法技巧,如有不對歡迎批評指正。 要點:開發中類、變數特性查詢,類型就是類,斷言的使用,深淺複製判斷等 python腳本文件是使用UTF-8編碼的,所以在發現中文字元出現亂碼時應當考慮是否文本文件採用UTF-8編碼。 如果想指定不同的編碼需要在源碼文件中 ...


這裡提供在使用python進行開發中常使用到的方法技巧,如有不對歡迎批評指正。

要點:開發中類、變數特性查詢,類型就是類,斷言的使用,深淺複製判斷等

python腳本文件是使用UTF-8編碼的,所以在發現中文字元出現亂碼時應當考慮是否文本文件採用UTF-8編碼。

如果想指定不同的編碼需要在源碼文件中開頭處添加這樣的註釋:

# -*- coding: utf-8 -*-

如果python在linux和unix系統中運行,需要在源碼的第一行添加:

#!/usr/bin/python3

如何獲取python中各個模塊,變數,類等的內容呢?

python中關於幫組的查詢可以通過變數__all__,__dict__,函數help(),dir()來獲取。

如果__all__在類,模塊中定義,一般包含著外部可以調用的特性,如果定義了沒有賦值,會自動使用非下劃線開頭的特性填充。如果沒有參數__all__python會提示AttributeError屬性錯誤。

__dict__一般會給出類或者模塊中定義的特性(包括屬性和方法),是以字典的形式輸出的使用元組來表示參數和參數值(參數,參數值或者描述)

1 >>> list.__dict__
2 2 mappingproxy({'__repr__': <slot wrapper '__repr__' of 'list' objects>, '__hash__': None, '__getattribute__': <slot wrapper '__getattribute__' of 'list' objects>, '__lt__': <slot wrapper '__lt__' of 'list' objects>, '__le__': <slot wrapper '__le__' of 'list' objects>, '__eq__': <slot wrapper '__eq__' of 'list' objects>, '__ne__': <slot wrapper '__ne__' of 'list' objects>, '__gt__': <slot wrapper '__gt__' of 'list' objects>, '__ge__': <slot wrapper '__ge__' of 'list' objects>, '__iter__': <slot wrapper '__iter__' of 'list' objects>, '__init__': <slot wrapper '__init__' of 'list' objects>, '__len__': <slot wrapper '__len__' of 'list' objects>, '__getitem__': <method '__getitem__' of 'list' objects>, '__setitem__': <slot wrapper '__setitem__' of 'list' objects>, '__delitem__': <slot wrapper '__delitem__' of 'list' objects>, '__add__': <slot wrapper '__add__' of 'list' objects>, '__mul__': <slot wrapper '__mul__' of 'list' objects>, '__rmul__': <slot wrapper '__rmul__' of 'list' objects>, '__contains__': <slot wrapper '__contains__' of 'list' objects>, '__iadd__': <slot wrapper '__iadd__' of 'list' objects>, '__imul__': <slot wrapper '__imul__' of 'list' objects>, '__new__': <built-in method __new__ of type object at 0x000000005BBAF530>, '__reversed__': <method '__reversed__' of 'list' objects>, '__sizeof__': <method '__sizeof__' of 'list' objects>, 'clear': <method 'clear' of 'list' objects>, 'copy': <method 'copy' of 'list' objects>, 'append': <method 'append' of 'list' objects>, 'insert': <method 'insert' of 'list' objects>, 'extend': <method 'extend' of 'list' objects>, 'pop': <method 'pop' of 'list' objects>, 'remove': <method 'remove' of 'list' objects>, 'index': <method 'index' of 'list' objects>, 'count': <method 'count' of 'list' objects>, 'reverse': <method 'reverse' of 'list' objects>, 'sort': <method 'sort' of 'list' objects>, '__doc__': "list() -> new empty list\nlist(iterable) -> new list initialized from iterable's items"})
list的__dict__查看

dir()會以列表的形式給出所有可以獲得的特性屬性,而不含有值和屬性描述:

1 1 >>> dir(list)
2 2 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
list使用dir()查看

一般而言使用__dict__和dir()就可以了,當然很多時候也需要help()查看詳細的文檔(其實就是__doc__中的內容):

 1  help(list)
 2 Help on class list in module builtins:
 3 
 4 class list(object)
 5  |  list() -> new empty list
 6  |  list(iterable) -> new list initialized from iterable's items
 7  |
 8  |  Methods defined here:
 9  |
10  |  __add__(self, value, /)
11  |      Return self+value.
12  |
13  |  __contains__(self, key, /)
14  |      Return key in self.
15  |
16  |  __delitem__(self, key, /)
17  |      Delete self[key].
18  |
19  |  __eq__(self, value, /)
20  |      Return self==value.
21  |
22  |  __ge__(self, value, /)
23  |      Return self>=value.
24  |
25  |  __getattribute__(self, name, /)
26  |      Return getattr(self, name).
27  |
28  |  __getitem__(...)
29  |      x.__getitem__(y) <==> x[y]
30  |
31 -- More  --
list使用help()查看

 如果我們現在創建了一個對象 a = list(),現在想要獲取對象a有什麼特性方法,也是使用dir()和help()。

在這裡需要強調的是,dir()和help()的強大之處不僅僅可以查閱類,還可以我們定義的變數。這樣我們在編碼過程中能夠獲得更多的內容。

 1 >>> a=1
 2 >>> dir(a)
 3 ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
 4 >>> help(a)
 5 Help on int object:
 6 
 7 class int(object)
 8  |  int(x=0) -> integer
 9  |  int(x, base=10) -> integer
10  |
11  |  Convert a number or string to an integer, or return 0 if no arguments
12  |  are given.  If x is a number, return x.__int__().  For floating point
13  |  numbers, this truncates towards zero.
14  |
15  |  If x is not a number or if base is given, then x must be a string,
16  |  bytes, or bytearray instance representing an integer literal in the
17  |  given base.  The literal can be preceded by '+' or '-' and be surrounded
18  |  by whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.
19  |  Base 0 means to interpret the base from the string as an integer literal.
20  |  >>> int('0b100', base=0)
21  |  4
22  |
23  |  Methods defined here:
24  |
25  |  __abs__(self, /)
26  |      abs(self)
27  |
28  |  __add__(self, value, /)
29  |      Return self+value.
30  |
31  |  __and__(self, value, /)
32  |      Return self&value.
33  |
34 -- More  --
a=1中變數a含有方法的查找

 變數和對象類型的查找等操作

python中除了使用dir(),help(),__all__,__dict__查看原來定義設計的內容外,可以使用很多已經定義的特性來獲取更多信息:

獲取變數類型和對象類型的方法:

>>> a =1
>>> a.__class__
<class 'int'>
>>> b = 1.0
>>> b.__class__
<class 'float'>
>>> c = ''
>>> c.__class__
<class 'str'>
>>> d = list()
>>> d.__class__
<class 'list'>
>>> e = tuple()
>>> e.__class__
<class 'tuple'>
>>> f = dict()
>>> f.__class__
<class 'dict'>
>>> list.__class__
<class 'type'>
>>> dict.__class__
<class 'type'>
>>> tuple.__class__
<class 'type'>
>>> object.__class__
<class 'type'>
>>> None.__class__
<class 'NoneType'>
通過__class__查詢變數和類類型

通過上面的代碼我們發現,如果class為type其實這個本身就是一個類的定義,如果是其他的則是對象。

你想過沒有,在python中基本的變數也是對象?

在一般語言中,我們的類型都分為整型,浮點型,字元串等等。但是在python這些類型其實都是類的形式定義的,而類也是繼承了頂級超類的。

 1 >>> a = 1
 2 >>> a.__class__
 3 <class 'int'>
 4 >>> int.__class__
 5 <class 'type'>
 6 >>> str.__class__
 7 <class 'type'>
 8 >>> bool.__class__
 9 <class 'type'>
10 >>> list.__class__
11 <class 'type'>
12 >>> dict.__class__
13 <class 'type'>
14 >>> tuple.__class__
15 <class 'type'>
16 >>> type.__class__
17 <class 'type'>
18 >>> object.__class__
19 <class 'type'>
20 >>> type.__bases__
21 (<class 'object'>,)
22 >>> int.__bases__
23 (<class 'object'>,)
24 >>> str.__bases__
25 (<class 'object'>,)
26 >>> bool.__bases__
27 (<class 'int'>,)
28 >>> float.__bases__
29 (<class 'object'>,)
30 >>> object.__bases__
31 ()
32 >>>
使用__class__查看類型,__bases__查看超類

發現沒有,我們使用的類型其實都是類,除了bool繼承了類int,其他的都是繼承超類object。而object類沒有超類。應該說,type是一個類型類!當然None類型是NoneType,而NoneType卻不是類,這是說None是個空值。

1 >>> dir(type)
2 ['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__prepare__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__text_signature__', '__weakrefoffset__', 'mro']
3 >>> dir(object)
4 ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
type類中含有的內容和object類中含有的內容

 is 和id()可以讓我們看清變數之間的隱藏關係!

我們都知道,python從在使用上有著弱類型的便捷性。當然在python中,相同數值的變數只有一個!這是為什麼呢?這是因為他們都是指向同一個記憶體地址,可以將這些變數想象成他們存放的是一個個記憶體地址,我們對他們的賦值不過是將他們指向的記憶體地址做了改變!!

從指針的角度理解python是很有幫助的。變數本身存放的是指針,如果你這個能夠理解了,那麼關於python的變數和記憶體回收機制就能夠很好理解並運用了。

A is B 操作的作用是判斷A是否是B,如果為真,則說明A與B是同一個對象,如果為假,則說明A與B不是同一個對象。

id(A) 操作的作用是判斷A在記憶體中的id序列號。

下麵我們來詳細說明下python中的相關現象:

  1.python中A和B雖然是同一個對象,但是當對A賦值之後,A與B再是同一個對象,因為python中的賦值是將A所所指向的地址改成了另一個對象的地址,這時候與B中的地址不一樣,B地址所致的對象的值不會收到A賦值影響。

  2.python中同一個對象所具有的id可能是不同的,因為在沒有指向該地址的變數時,python記憶體自動清理會清理掉這個對象。再次使用到具有相同數值的對象可能是在前一個對象自動清理之後創建的新對象

針對第一個情況我們首先通過對True和False和數字來確定哪些值對象的id是系統自帶的,即便這些值對象不被變數使用python記憶體清理也不會清理這些對象!

 1 >>> id(True)
 2 1538937056
 3 >>> id(False)
 4 1538937088
 5 >>> id(False) - id(True)
 6 32
 7 >>> id(-5)
 8 1539416992
 9 >>> id(-6)
10 1667933956912
11 >>> id(-4)
12 1539417024
13 >>> id(-4)-id(-5)
14 32
15 >>> id(-3)-id(-4)
16 32
17 >>> id(-3)
18 1539417056
19 >>> id(-2)
20 1539417088
21 >>> id(-2) - id(-3)
22 32
23 >>> id(255)
24 1539425312
25 >>> id(256)
26 1539425344
27 >>> id(256) - id(255)
28 32
29 >>> id(257)
30 1667904611440
31 >>> id(1.0)
32 1667904643192
通過id來判斷數值和布爾值中的值對象是否是系統自帶的對象

你會發現數字-5到256是連續的,他們相鄰的id值相差是32,意思是他們是32表示的數值。id返回的值就是他們在python中邏輯記憶體地址的值,在不同python進程中這些相同值對象返回的id值是一致的。而小於-5或者大於256的數值,小數,超過單個字元的字元串都是python在用戶使用時創建的值對象,在不同的python進程中相同的值的id是不同的!其他值在不使用時有的就會被python記憶體清理程式清理掉釋放記憶體!

當然,python中還有很多對象、類、函數等是python自創建的不會因為不使用而被記憶體清理程式清理掉。比如 int,None,dict,list。

不夠值得一提的是 None is None是返回True 。並且id(None)的返回值是1538983120。這說明與其他腳本(比如javascript)不一樣,None是空值,是一個唯一的空值對象,程式中所有的None都是相等的。都是同一個記憶體地址中存放的值。

很多情況下,我們想判斷兩個變數是否指向同一個記憶體地址塊存放的值,可以使用is來判斷。

python中對於全局變數,局部變數,外部變數有著額外的處理方式

如果一個函數中定義了與外部名稱相同的變數,在函數內部如何能夠獲得外部定義的變數呢?在其他語言中,我們都知道局部變數會覆蓋掉同名的外部變數。而在python中雖然也是這個邏輯,但是他提供了 3個函數來使得我們能夠獲得不同作用域中定義的同名的變數值。

globals()獲取所有全局變數值

locals()獲取所有局部變數值

nonlocals()獲取所有外部變數值(因為python是支持函數嵌套的,內部函數如果想要獲得外部函數局部變數的值可以使用這個)

 1 >>> a = 234
 2 >>> globals()
 3 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec_

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是什麼加密?可以吃嗎? 今天的給大家分享的應該是BASE64、MD5、AES演算法共同實現的吧,不過加密後體積會變大些,他不可以吃 一、概述 加密的流程大概就是醬紫的: 原文→BASE64編碼 →AES加密 得到密文 密碼→MD5加密 解密的流程大概是醬紫: 密碼 → MD5加密 → BASE64解 ...
  • java ee 中struts2中struts.xml中result標簽 ...
  • 1.package標簽下主要的點在namespace和name,extend上 extend 一般繼承自struts-default.xml下,繼承其攔截器及一些功能,這個已在本人的攔截器一文中有講到 namespace,主要用於約束訪問地址action前的路徑,比如http://www.baidu ...
  • 本節探討Java 8中的函數式數據處理 - Stream API,它能大大簡化常見的集合數據操作,怎麼做到的呢? ...
  • 1. 正則表達式基礎 1.1. 簡單介紹 正則表達式並不是Python的一部分。正則表達式是用於處理字元串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,在提供了正則表達式的語言里,正則表達式的語法都是一樣的,區別隻在於不同的編程語 ...
  • 加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959 結構體struct struct 用來自定義複雜數據結構,可以包含多個欄位(屬性),可以嵌套; go中的struct類型理解為類,可以定義方法,和函數定義有些許區別; struct類型是值類型。 struct定義 ...
  • VGGNet,牛津大學電腦視覺組(Visual Geometry Group)和Google DeepMind公司一起研發,深度捲積神經網路。VGGNet反覆堆疊3x3小型捲積核和2x2最大池化層,成功構築16~19層深捲積神經網路。比state-of-the-art網路結構,錯誤率幅下降,取得I ...
  • 1.什麼是包裝類? java是一種面向對象的編程語言,基本數據類型數據不能當做對象處理,為此java為每一種基本數據類型提供了一種以面向對象思想操作的載體,該載體即包裝類。 2.轉化 當包裝類與對應的基本數據類型運算時,包裝類自動轉化為基本數據類型。 3.Integer常量池 Integer類型變數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...