python編碼規范pdf
功能要求
為Python代碼添加註釋,對Python程序代碼進行說明。
實例代碼
'''多行注釋開始
下面的代碼根據變數x的值計算y
注意代碼中使用縮進表示代碼塊
多行注釋結束'''
x = 5
if x > 100:
y = x * 5 - 1 # 單行注釋:x>100時執行該語句
else:
y = 0 # x <= 100時執行該語句
print(y) # 輸出y
運行結果
知識說明
注釋用於為程序添加說明性的文字,幫助程序員更好的閱讀和理解程序代碼。Python解釋器會忽略注釋的內容,即注釋的內容不會被Python解釋器執行。
Python注釋分為單行注釋和多行注釋。
單行注釋以符號「#」開始,當前行中符號「#」及其後的內容為注釋語句。單行注釋可以獨佔一行,也可放在語句末尾。 說明: 在Pycharm中使用「ctrl + /」可以添加/取消單行注釋。
多行注釋是用3個英文單引號「'''多行注釋文本'''」或3個雙引號「"""注釋文本"""」進行注釋。 注意: 由一對三個單引號或一對三個雙引號括起來的內容被認為是注釋,但不能由三個單引號和三個雙引號混合使用。
Ⅱ 如何提升Python編程能力
一、Python之禪(The Zen of Python)
The Zen of Python是Python語言的指導原則,遵循這些基本原則,你就可以像個Pythonista一樣編程。具體內容你可以在Python命令行輸入import this看到:
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
# 優美勝於醜陋(Python以編寫優美的代碼為目標)
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.
# 不要包容所有錯誤,除非你確定需要這樣做(精準地捕獲異常,不寫except:pass風格的代碼)
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.
# 雖然這並不容易,因為你不是 Python 之父(這里的Dutch是指Guido)
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背後的哲學真理。Python之禪已經正式成文PEP 20,具體內容見:PEP 20
二、PEP8: Python編碼規范(PEP8: Style Guide for Python Code)
Abelson & Sussman在《計算機程序的構造和解釋》一書中說道:程序是寫來給人讀的,只是順帶讓機器執行。所以,我們在編碼時應該盡量讓它更易讀懂。PEP8是Python的編碼規范,官方文檔見:PEP 8,PEP是Python Enhancement Proposal的縮寫。PEP8包括很多編碼的規范,下面主要介紹一下縮進和命名等內容。
空格和縮進(WhiteSpace and Indentation)
空格和縮進在Python語言中非常重要,它替代了其他語言中{}的作用,用來區分代碼塊和作用域。在這方面PEP8有以下的建議:
1、每次縮進使用4個空格
2、不要使用Tab,更不要Tab和空格混用
3、兩個方法之間使用一個空行,兩個Class之間使用兩個空行
4、添加一個空格在字典、列表、序列、參數列表中的「,「後,以及在字典中的」:「之後,而不是之前
5、在賦值和比較兩邊放置一個空格(參數列表中除外)
6、緊隨括弧後面或者參數列表前一個字元不要存在空格
Python命名
命名規范是編程語言的基礎,而且大部分的規范對於高級語言來說都是一樣的,Python的基本規范如下:
1、方法 & 屬性:joined_lower
2、常量:joined_lower or ALL_CAPS
3、類:StudlyCaps
4、類屬性:interface, _internal, __private
5、camelCase only to conform to pre-existing conventions
以上內容只是對PEP8做了非常簡單的介紹,由於今天的主題不在於此,所以就不在這里多講。想要更加深入的了解Python編碼規范,可以閱讀PEP8官方文檔和Google Python編碼規范等內容。
三、交換變數值(Swap Values)
在其他語言中,交換兩個變數值的時候,可以這樣寫:
temp = a
a = b
b = temp
在Python中,我們可以簡單的這樣寫:
b, a = a, b
可能你已經在其他地方見過這種寫法,但是你知道Python是如何實現這種語法的嗎?首先,逗號(,)是Python中tuple數據結構的語法;上面的語法會執行一下的操作:
1、Python會先將右邊的a, b生成一個tuple(元組),存放在內存中;
2、之後會執行賦值操作,這時候會將tuple拆開;
3、然後將tuple的第一個元素賦值給左邊的第一個變數,第二個元素賦值給左邊第二個變數。
再舉個tuple拆分的例子:
In [1]: people = ['David', 'Pythonista', '15145551234']
In [2]: name, title, phone = people
In [3]: name
Out[3]: 'David'
In [4]: title
Out[4]: 'Pythonista'
In [5]: phone
Out[5]: '15145551234'
這種語法在For循環中非常實用:
In [6]: people = [['David', 'Pythonista', '15145551234'], ['Wu', 'Student', '15101365547']]
In [7]: for name, title, phone in people:
...: print name, phone
...:
David 15145551234
Wu 15101365547
PS:在使用這種語法時,需要確保左邊的變數個數和右邊tuple的個數一致,否則,Python會拋出ValueError異常。
更多tuple的例子:
>>> 1,
(1,)
>>> (1,)
(1,)
>>> (1)
1
>>> value = 1,
>>> value
(1,)
我們知道:逗號(,)在Python中是創建tuple的構造器,所以我們可以按照上面的方式很方便的創建一個tuple;需要注意的是:如果聲明只有一個元素的tuple,末尾必須要帶上逗號,兩個以上的元素則不需要。聲明tuple的語法很簡單,但同時它也比較坑:如果你發現Python中的變數不可思議的變成了tuple,那很可能是因為你多寫了一個逗號。。
四、Python控制台的"_"(Interactive "_")
這是Python中比較有用的一個功能,不過有很多人不知道(我也是接觸Python很久之後才知道的)。。在Python的互動式控制台中,當你計算一個表達式或者調用一個方法的時候,運算的結果都會放在一個臨時的變數 _ 裡面。_(下劃線)用來存儲上一次的列印結果,比如:
>>> import math
>>> math.pi / 3
1.0471975511965976
>>> angle = _
>>> math.cos(angle)
0.50000000000000011
>>> _
0.50000000000000011
PS:當返回結果為None的時候,控制台不會列印,_ 裡面存儲的值也就不會改變。
五、合並字元串(Building Strings from Sub strings)
假如現在有一個list,裡面是一些字元串,你現在需要將它們合並成一個字元串,最簡單的方法,你可以按照下面的方式去處理:
colors = ['red', 'blue', 'green', 'yellow']
result = ''
for s in colors:
result += s
但是,很快你會發現:這種方法非常低效,尤其當list非常大的時候。Python中的字元串對象是不可改變的,因此對任何字元串的操作如拼接,修改等都將產生一個新的字元串對象,而不是基於原字元串。所以,上面的方法會消耗很大的內存:它需要計算,存儲,同時扔掉中間的計算結果。正確的方法是使用Python中的join方法:
result = ','.join(colors)
當合並元素比較少的時候,使用join方法看不出太大的效果;但是當元素多的時候,你會發現join的效率還是非常明顯的。不過,在使用的時候請注意:join只能用於元素是字元串的list,它不會進行任何的強制類型轉換。連接一個存在一個或多個非字元串元素的list時將拋出異常。
Ⅲ Python源碼是什麼意思
源代碼是指原始代碼,可以是任何語言代碼。Python源碼就是指編寫的最原始程序的代碼。運行的軟體是要經過編寫的,程序員編寫程序的過程中需要他們的「語言」。
Ⅳ 怎麼在Python里使用UTF-8編碼
概述
在python代碼即.py文件的頭部聲明即可
解析
py文件中的編碼
Python 默認腳本文件都是 ANSCII 編碼的,當文件 中有非 ANSCII 編碼范圍內的字元的時候就要使用"編碼指示"來修正一個 mole 的定義中,如果.py文件中包含中文字元(嚴格的說是含有非anscii字元),則需要在第一行或第二行指定編碼聲明:
# -*- coding=utf-8 -*-
#coding=utf-8
# 以上兩種選其一即可
其他的編碼如:gbk、gb2312也可以;否則會出現:
SyntaxError: Non-ASCII character 'xe4' in file test.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
python中的編碼與解碼
先說一下python中的字元串類型,在python中有兩種字元串類型,分別是 str 和 unicode,他們都是basestring的派生類;
str類型是一個包含Characters represent (at least) 8-bit bytes的序列;
unicode 的每個 unit 是一個 unicode obj;
在str的文檔中有這樣的一句話:
The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file.
也就是說在讀取一個文件的內容,或者從網路上讀取到內容時,保持的對象為str類型;如果想把一個str轉換成特定編碼類型,需要把str轉為Unicode,然後從unicode轉為特定的編碼類型如:utf-8、gb2312等。
拓展內容
utf-8編碼
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,也是一種前綴碼。它可以用來表示Unicode標准中的任何字元,且其編碼中的第一個位元組仍與ASCII兼容,這使得原來處理ASCII字元的軟體無須或只須做少部分修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他存儲或發送文字的應用中,優先採用的編碼。
UTF-8使用一至六個位元組為每個字元編碼(盡管如此,2003年11月UTF-8被RFC 3629重新規范,只能使用原來Unicode定義的區域,U+0000到U+10FFFF,也就是說最多四個位元組):
1、128個US-ASCII字元只需一個位元組編碼(Unicode范圍由U+0000至U+007F)。
2、帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個位元組編碼(Unicode范圍由U+0080至U+07FF)。
3、其他基本多文種平面(BMP)中的字元(這包含了大部分常用字,如大部分的漢字)使用三個位元組編碼(Unicode范圍由U+0800至U+FFFF)。
4、其他極少使用的Unicode輔助平面的字元使用四至六位元組編碼(Unicode范圍由U+10000至U+1FFFFF使用四位元組,Unicode范圍由U+200000至U+3FFFFFF使用五位元組,Unicode范圍由U+4000000至U+7FFFFFFF使用六位元組)。
對上述提及的第四種字元而言,UTF-8使用四至六個位元組來編碼似乎太耗費資源了。但UTF-8對所有常用的字元都可以用三個位元組表示,而且它的另一種選擇,UTF-16編碼,對前述的第四種字元同樣需要四個位元組來編碼,所以要決定UTF-8或UTF-16哪種編碼比較有效率,還要視所使用的字元的分布范圍而定。不過,如果使用一些傳統的壓縮系統,比如DEFLATE,則這些不同編碼系統間的的差異就變得微不足道了。若顧及傳統壓縮演算法在壓縮較短文字上的效果不大,可以考慮使用Unicode標准壓縮格式(SCSU)。
互聯網工程工作小組(IETF)要求所有互聯網協議都必須支持UTF-8編碼。互聯網郵件聯盟(IMC)建議所有電子郵件軟體都支持UTF-8編碼。
Ⅳ python3.4 編碼有哪些
Python3中的編碼問題前,第一個段落對位元組、ASCII與Unicode與UTF-8等進行基本介紹,如果不對這幾種編碼犯頭暈,可直接跳過。
ASCII與Unicode與UTF-8與GBK
首先從老大哥說起。跟很多人一樣,大學讀了這么久,久仰ASCII編碼的大名。要說這個老大哥,我們再先從位元組說起。一個位元組包括八個比特位,每個比特位表示0或1,一個位元組即可表示從00000000到11111111共2^8=256個數字。一個ASCII編碼使用一個位元組(除去位元組的最高位作為作奇偶校驗位),ASCII編碼實際使用一個位元組中的7個比特位來表示字元,共可表示2^7=128個字元。比如那時寫C語言的程序,就經常要背下ASCII編碼中的01000001(即十進制的65)表示字元『A』,01000001加上32之後的01100001(即十進制的97)表示字元『a』。現在打開Python,調用chr和ord函數,我們可以看到Python為我們對ASCII編碼進行了轉換。
第一個00000000表示空字元,因此ASCII編碼實際上只包括了
字母、標點符號、特殊符號等共127個字元。因為ASCII是在美國出生的,對於由字母組成單詞進而用單詞表達的英文來說也是夠了。但是中國人、日本人、
韓國人等其他語言的人不服了。中文是一個字一個字,ASCII編碼用上了渾身解數256個字元都不夠用。
因此後來出現了Unicode編碼。Unicode編碼通常由兩個位元組組成,共表示256*256個字元,即所謂的UCS-2。某些偏僻字還會用到四個位元組,即所謂的UCS-4。也就是說Unicode標准也還在發展。但UCS-4出現的比較少,我們先記住:最原始的ASCII編碼使用一個位元組編碼,但由於語言差異字元眾多,人們用上了兩個位元組,出現了統一的、囊括多國語言的Unicode編碼。
在Unicode中,原本ASCII中的127個字元只需在前面補一個全零的位元組即可,比如前文談到的字元『a』:01100001,在Unicode中變成了00000000 01100001。不久,美國人不開心了,吃上了世界民族之林的大鍋飯,原本只需一個位元組就能傳輸的英文現在變成兩個位元組,非常浪費存儲空間和傳輸速度。
人們再發揮聰明才智,於是出現了UTF-8編碼。因為針對的是空間浪費問題,因此這種UTF-8編碼是可變長短的,從英文字母的一個位元組,到中文的通常的三個位元組,再到某些生僻字的六個位元組。解決了空間問題,UTF-8編碼還有一個神奇的附加功能,那就是兼容了老大哥的ASCII編碼。一些老古董軟體現在在UTF-8編碼中可以繼續工作。
注意除了英文字母相同,漢字在Unicode編碼和UTF-8編碼中通常是不同的。比如漢字的『中』字在Unicode中是01001110
00101101,而在UTF-8編碼中是11100100 10111000
10101101。
我們祖國母親自然也有自己的一套標准。那就是GB2312和GBK。當然現在挺少看到。通常都是直接使用UTF-8。記得我唯一一次看到GB編碼的網頁,是一個成人網站。
Python3中的默認編碼
Python3中默認是UTF-8,我們通過以下代碼:
import sys
sys.getdefaultencoding()
可查看Python3的默認編碼。
Python3中的encode和decode
Python3中字元編碼經常會使用到decode和encode函數。特別是在抓取網頁中,這兩個函數用的熟練非常有好處。我的理解,encode的作用,使我們看到的直觀的字元轉換成計算機內的位元組形式。decode剛好相反,把位元組形式的字元轉換成我們看的懂的、直觀的、「人模人樣」的形式。如下圖。
\x表示後面是十六進制,\xe4\xb8\xad即是二進制的11100100 10111000
10101101。也就是說漢字『中』encode成位元組形式,是11100100 10111000
10101101。同理,我們拿11100100
10111000 10101101也就是\xe4\xb8\xad來decode回來,就是漢字『中』。完整的應該是b'\xe4\xb8\xad',在Python3中,以位元組形式表示的字元串則必須加上前綴b,也就是寫成上文的b'xxxx'形式。
前文說的Python3的默認編碼是UTF-8,所以我們可以看到,Python處理這些字元的時候是以UTF-8來處理的。因此從上圖可以看到,就算我們通過encode('utf-8')特意把字元encode為UTF-8編碼,出來的結果還是相同:b'\xe4\xb8\xad'。
明白了這一點,同時我們知道UTF-8兼容ASCII,我們可以猜想大學時經常背誦的『A』對應ASCII中的65,在這里是不是也能正確的decode出來呢。十進制的65轉換成十六進制是41,我們嘗試下:
b'\x41'.decode()
結果如下。果然是字元『A』
Python3中的編碼轉換
據說字元在計算機的內存中統一是以Unicode編碼的。只有在字元要被寫進文件、存進硬碟或者從伺服器發送至客戶端(例如網頁前端的代碼)時會變成utf-8。但其實我比較關心怎麼把這些字元以Unicode的位元組形式表現出來,露出它在內存中的廬山正面目的。這里有個照妖鏡:
xxxx.encode/decode('unicode-escape')
輸出如下
b'\\u4e2d'還是b'\u4e2d,一個斜杠貌似沒影響。同時可以發現在shell窗口中,直接輸'\u4e2d'和輸入b'\u4e2d'.decode('unicode-escape')是相同的,都會列印出漢字『中』,反而是'\u4e2d'.decode('unicode-escape')會報錯。說明說明Python3不僅支持Unicode,而且一個『\uxxxx』格式的Unicode字元可被辨識且被等價於str類型。
如果我們知道一個Unicode位元組碼,怎麼變成UTF-8的位元組碼呢。懂了以上這些,現在我們就有思路了,先decode,再encode。代碼如下:
xxx.decode('unicode-escape').encode()
測試如下:
可以看到最後輸出的UTF-8位元組與上面的相同。嘗試成功。所以其他的編碼之間的轉換,大概也是如此。
最後的擴展
還記得剛剛那個ord嗎。時代變遷,老大哥ASCII被人合並,但ord還是有用武之地。試試ord('中'),輸出結果是20013。20013是什麼呢,我們再試試hex(ord('中')),輸出結果是'0x4e2d',也就是20013是我們在上文見面了無數次的x4e2d的十進制值。這里說下hex,是用來轉換成十六進制的函數,學過單片機的人對hex肯定不會陌生。
最後的擴展,在網上看到的他人的問題。我們寫下類似於'\u4e2d'的字元,Python3知道我們想表達什麼。但是讓Python讀取某個文件的時候出現了'\u4e2d',是不是計算機就不認識它了呢?後來下文有人給出了答案。如下:
import codecs
file = codecs.open( "a.txt", "r", "unicode-escape" )
u = file.read()
print(u)
Ⅵ ASN.1語法以及在python中如何編碼解碼
「
ASN.1的文章本來是免費的,但是有的人一定要搞小動作,咱惹不起就只能躲著了,做了一些修改後,改為付費文章
」
應用程序在網路協議的應用層對payload數據,多使用ASN.1標准進行處理
ASN.1
ASN.1
「
Abstract Syntax Notation One,抽象語法標記,ASN.1是描述數據格式的標准方法, 它不管語言是如何執行、這些數據具體指什麼、用什麼類型的編碼規則 ,是一種抽象的語法
」
ASN.1由兩部分組成:
一部分描述信息內數據,數據類型及序列格式
另一部分描述如何將各部分組成消息
語法
例如
Report ::= SEQUENCE {
author OCTET STRING,
title OCTET STRING,
body OCTET STRING,
biblio Bibliography
}
Report是結構體名稱
SEQUENCE表示消息是由許多數據單元構成的
中括弧{}裡面是各種類型的數據單元
前三個數據單元author/title/body的類型是OCTET STRING
最後一個數據單元biblio的類型是另一個ASN.1結構體
Bibliography ::= SEQUENCE {
author OCTET STRING
title OCTET STRING
publisher OCTET STRING
year OCTET STRING
}
數據類型
類型含義
NULL空
BOOLEAN布爾類型
INTEGER整型
REAL實數類型
BIT STRING比特串
OCTEC STRING位元組串
OBJECT IDENTIFIER實體標識符
ENUMERATED枚舉類型
SEQUENCE序列
SEQUENCE OF類型的序列
SET集合
SET OF類型的集合
CHOICECHOICE類型
...STRING(有很多就不一一列舉)字元串類型
UTCTime時間類型
GeneralizedTime時間類型
ASN.1文件結構
例如
Foo DEFINITIONS ::= BEGIN
Question ::= SEQUENCE {
id INTEGER,
question IA5String
}
Answer ::= SEQUENCE {
id INTEGER,
answer BOOLEAN
}
END
解析上面的ASN.1文件的結構
ASN.1支持的編碼規則
基本編碼規則(BER)
規范編碼規則(CER)
識別名編碼規則(DER)
壓縮編碼規則(PER)
XML編碼規則(XER)
python如何對ASN.1結構的信息編碼和解碼
如果我們想用python對信息進行編碼,需要明確幾點:
提供的ASN.1格式的數據
更多內容,請參考公-中-號, 汽車網路診斷通信
Ⅶ python程序有哪些編碼規范
編碼格式聲明
通常,編碼格式聲明是必需的。如果 python 源碼文件沒有聲明編碼格式,python 解釋器會默認使用 ASCII 編碼,一旦源碼文件包含非ASCII編碼的字元,python 解釋器就會報錯。以 UTF-8 為例,以下兩種編碼格式聲明都是合乎規則的。
縮進
統一使用 4 個空格進行縮進。絕對不要用tab, 也不要tab和空格混用。對於行連接的情況,我一般使用4空格的懸掛式縮進。例如:
引號
自然語言使用雙引號
機器標識使用單引號
正則表達式使用雙引號
空行
編碼格式聲明、模塊導入、常量和全局變數聲明、頂級定義和執行代碼之間空兩行
頂級定義之間空兩行,方法定義之間空一行
在函數或方法內部,可以在必要的地方空一行以增強節奏感,但應避免連續空行
導入模塊
導入總應該放在文件頂部,位於模塊注釋和文檔字元串之後,模塊全局變數和常量之前。導入應該按照從最通用到最不通用的順序分組,分組之間空一行
標准庫導入
第三方庫導入
應用程序指定導入
命名規范
模塊盡量使用小寫命名,首字母保持小寫,盡量不要用下劃線
類名使用駝峰(CamelCase)命名風格,首字母大寫,私有類可用一個下劃線開頭
函數名一律小寫,如有多個單詞,用下劃線隔開
私有函數可用一個下劃線開頭
變數名盡量小寫, 如有多個單詞,用下劃線隔開
常量採用全大寫,如有多個單詞,使用下劃線隔開