文档库 最新最全的文档下载
当前位置:文档库 › python编码标准格式

python编码标准格式

Lession 1 Python概览

1、编译型语言和解释型语言
根据程序执行时的基本表示,是实际机器上的语言,还是虚拟机的机器语言来划分

编译型语言
C/C++/Fortran/Pascal/Ada
C/C++
源文件.c-> 编译.o ->汇编-> 链接 -> 可执行文件.exe(机器执行目标代码)
目标代码由机器指令组成,有可能调用其他函数库,但不在源程序,所以需要链接程序完成外部引用

输入数据->可执行文件->处理器->输出结果

解释型语言
Python/Java/Javascript
不产生目标机器代码,产生中间代码,中间代码由软件解释器来执行。
与编译的程序的不同点在于,每条语句被逐一翻译然后执行。
解释型语言每执行一次就翻译一次,因此效率较低。


Python 源代码.py-> 字节码.pyc -> 解释执行字节码.pyc
每次都需要编译转化成字节码,虚拟机再把字节码转化为机器语言,最后在硬件上运行

输入数据->源代码->解释器->输出结果
输入数据->字节码->解释器->输出结果

Java强制编译成字节码,在JVM上用解释的方式执行字节码

字节码的优点,增加反向工程的难度,保护源代码,但通过反编译仍然可破解,故有一些混淆代码方法

2、Python的历史
Guido van Rossum, 荷兰人,1989年开始写,1991年正式发布python
目前Python的版本分为Python 2.x和Python 3.x(2009年)

性能
3.0 比 2.5 在pystone benchmark慢30%
3.1 比 2.5 慢15%



语法
print "hello world"
print("hello world")

3、Python的实现
Cpython(C)
Pyston(C++)
IronPython(#C)
Jython(Java)
PyPy(Python)

4、第一个Python程序
utf-8
注释
·[强制] [PY033] 使用docstring描述module、function、class和method接口。docstring必须用三个双引号括起来。

·[强制] 对外接口部分必须用docstring描述,内部接口视情况自行决定是否写docstring。

·[强制][PY034] 接口的docstring描述至少包括功能简介、参数、返回值。如果可能抛出异常,必须注明。

·[强制] 每个文件都必须有文件声明,文件声明必须包括以下信息:版权声明,功能和用途简介,修改人及联系方式。

·[建议] TODO注释格式必须为:

# TODO: 干什么事情$负责人(邮箱前缀)$最终期限(YYYY-MM-DD)$

module注释(提供的vimrc会自动生成此模板)
################################################################################
#
# Copyright (c) 2014 https://www.wendangku.net/doc/5d4378510.html,, Inc. All Rights Reserved
#
################################################################################
"""
This module provide configure file management service in i18n environment.

Authors: jiangjinpeng(jiangjinpeng@https://www.wendangku.net/doc/5d4378510.html,)
Date: 2014/04/05 17:23:06
"""
function注释
def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
"""Fetches rows from a Bigtable.

Retrieves rows pertaining

to the given keys from the Table instance
represented by big_table. Silly things may happen if
other_silly_variable is not None.

Args:
big_table: An open Bigtable Table instance.
keys: A sequence of strings representing the key of each table row
to fetch.
other_silly_variable: Another optional variable, that has a much
longer name than the other args, and which does nothing.

Returns:
A dict mapping keys to the corresponding table row data
fetched. Each row is represented as a tuple of strings. For
example:

{'Serak': ('Rigel VII', 'Preparer'),
'Zim': ('Irk', 'Invader'),
'Lrrr': ('Omicron Persei 8', 'Emperor')}

If a key from the keys argument is missing from the dictionary,
then that row was not found in the table.

Raises:
IOError: An error occurred accessing the bigtable.Table object.
"""
pass

class注释
class SampleClass(object):
"""Summary of class here.

Longer class information....
Longer class information....

Attributes:
likes_spam: A boolean indicating if we like SPAM or not.
eggs: An integer count of the eggs we have laid.
"""

def __init__(self, likes_spam=False):
"""Inits SampleClass with blah."""
self.likes_spam = likes_spam
self.eggs = 0

def public_method(self):
"""Performs operation blah."""
TODO注释
# TODO: Improve performance using concurrent operation. $jiangjinpeng$2014-04-05$



中英文

a.输入输出、注释
raw_input()
print % ,
_
输出重定向>> print >>sys.stderr, "Error1"
#
""" """
''' '''
r''
__doc__

b.操作符
+
-
*
/
//
%
**
>
>=
<
<=
==
!=
<>
and
not
or

数字加减乘除/ //

not 数字

c.变量、赋值
下划线、大小写字母开头,不能数字开头,大小写敏感

关键字
False class finally is return
None continue for lambda try
True def from nonlocal while
and del global not with
as elif if or yield
assert else import pass
break except in raise

g = lambda x: x*2
g(3)

动态语言,在运行时可以改变其结构的语言 :
例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。
python的变量无需事先定义
变量的值和类型在赋值的时刻初始化

常量 : 大写加下划线
USER_CONSTANT
对于不会发生改变的全局变量,使用大写加下划线。

私有变量 : 小写和一个前导下划线
_private_value
Python 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线。
但这只是程序员之间的一个约定,用于警告说明

这是一个私有变量,外部类不要去访问它。
但实际上,外部类还是可以访问到这个变量。

内置变量 : 小写,两个前导下划线和两个后置下划线
__class__ __name__
两个前导下划线会导致变量在解释期间被更名。
这是为了避免内置变量和其他变量产生冲突。
用户定义的变量要严格避免这种风格。以免导致混乱。

没有++i,只能写成i+=1
x = y = z = 1
x,y,z = 1,2,3
swap


d.数字
有符号整数 int 0101 -123 0x80
长整型 long 29979123456L -841234 0xABCDEFABCDEFABCDEFABCDEFLL
(53170898287292916380478459375L)
布尔值 bool True False
浮点值 float 3.1415926 1.5E-10 -90.
复数 complex 1.23+4.5j 0+1j

2**31-1


e.字符串
' '
" "
字符串相加、*
用%,不用+
字符串的索引[0],[:-1],[:]


f.列表、元组、字典
alist = []
atuple=()
adict={}

列表可变、元组不可变,字典类似于键值对

f.if /else / elif / while / for / range / xrange / enumerate
代码块对齐
range和xrange的区别
"switch",使用字典来实现

g.列表解析
一行中使用一个for循环将所有的值放到一个列表当中
甚至可以挑选出符合条件的值
[x**2 for x in xrange(5)]

def func(alist):
if len(alist) <= 0:
return []
return func([x for x in alist[1:] if x > alist[0]]) + \
[alist[0]] + \
func([x for x in alist[1:] if x <= alist[0]])

h.文件
file_handle=open(filename, access_mode="r")
read file
copy file

i.错误和异常
try:
except IOError,e

j.函数
定义函数
默认参数
* 用来传递任意个无名字参数,这些参数会一个Tuple的形式访问。
**用来处理传递任意个有名字的参数,这些参数用dict来访问。

k.类
class ClassName(base_class):
'''class docstring'''
static_member_declarations
method_declarations

class FirstClass(object):
version = "v1.0"
def __init__(self, nm="蟒蛇"):
https://www.wendangku.net/doc/5d4378510.html, = nm
def showname(self):
print https://www.wendangku.net/doc/5d4378510.html,

l.模块
import sys,os,urllib,re,json
执行系统命令copy mv rm

m.布局
(1)起始行(unix)
(2)模块文档
(3)模块导入
(4)变量定义
(5)类定义
(6)函数定义
(7)主程序

__name__="main":
是用来测试用的。通常python的模块都是用于导入调用。
由于主程序的代码,无论是被导入还是被直接执行都会运行,所以我们应该知道模块如何决定具体运行的代码。
由于一个应用程序可能需要导入另外一个应用程序的模块,用于代码重用。
Python是否有一种方法,能在运行时检测该模块是被导入还是被直接执行呢?

5、内存管理
变量无需事先声明
变量无需指定类型
coder无需关心内存管理
变量名会被“回收”
del语句能够直接释放资源

引用计数
a.增加引用计数
对象被创

建并(将其引用)赋值给变量时,该对象的引用计数就被设置为1
同一个对象(的引用)又被赋值给其他变量时,作为参数、方法、类实例,
或被赋值为一个窗口对象的成员(称作别名),就被创建(引用计数自动加一)
x = 1.23
y = x
func(x)
alist = [x, "aa"]

b.减少引用计数
对象被销毁时,引用计数会减小。
离开其作用范围,一般就是函数结束运行时,所有局部变量都会被自动销毁,对象的引用计数也减少。
变量赋值给另外一个对象时,原来的引用计数也会自动减少1

x = '123'
y = x
x = 123
del x(or del y)
alist.remove(x)
del alist

c.垃圾收集
不再使用的内存会被一种称为垃圾收集的机制释放。
用来寻找引用计数为0的对象。
也负责检查那些虽然引用计数大于0,但是也应该被销毁的对象。
当被分配的总量很大的对象,垃圾收集器会留心观察,试图清理所有未引用的。

相关文档