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)命名风格,首字母大写,私有类可用一个下划线开头
函数名一律小写,如有多个单词,用下划线隔开
私有函数可用一个下划线开头
变量名尽量小写, 如有多个单词,用下划线隔开
常量采用全大写,如有多个单词,使用下划线隔开