Python Coding 小技巧

来源:互联网 发布:单片机晶振电容选择 编辑:程序博客网 时间:2024/06/05 19:04

1.python跟perl相比数据结构或者数据类型实现了具象化,即不在变量而是在数据块层面区分不同结构,Python中数据结构大体分为五种:Num, String => ' ' or " ", Tuple => ( ), List => [ ] , dict => { }, 其中数字和字符串对应传统变量的数据,元组和列表对应传统数组的数据,字典则对应哈希hash变量的数据。Python中变量层面不分区结构,仅区分变量所指向数据的类型。对比:perl中仅有列表数据结构 ( ) 可用来赋值给数组和哈希变量。

2.Python是典型的引用传递语言,不同于shell,perl值传递语言(perl中所谓的引用实质是指针),Python中结构型变量传递都是引用传递,即指向传递,而传统变量传递则为值传递,该特性与JAVA类似,注:结构型变量即指向tuple,list和dict数据结构的变量,而传统变量是指向数字和字符串的变量。

值传递和引用传递的区别在于引用传递仅改变变量对原有内存数据块的引用指向,不创建新的数据块,也可理解为别名,表现为多个变量可指向同一个数据块;而值传递则创建新的数据块用来存储原有数据块里的数据,在新创建数据块里存储原有数据块的存储地址(指向索引)即为指针,可通过该地址/索引调用原有数据块内数据。

3.Python中函数没有采用shell和perl 在定义时完全不指定形参而在函数体内部通过$n/$@/$*,$_[n]/@_索引实参的方式,在定义时需要声明参数。

def func(positional_args, keyword_args, *tuple_arg, **dict_arg):

上述中关键字参数也称为默认参数,即有通过=赋值的参数,位置参数一定要在关键字参数之前,而元组和字典形参则必须在关键字参数之后,后两个形参用来存储实参中匹配位置参数和关键参数后剩余的实参,其中剩余的位置形参(无=)依序引用到元组各元素,剩余的关键字参数(有=)依次引用到字典各元素。调用函数时,实参会按照定义时形参的准确顺序(按照逗号隔开的顺序)进行引用传递或者赋值。

4.Python中函数名也仅仅是对函数代码块的引用,可类似于变量传递。由此可构造函数装饰器@decorator

def decode(func):        def ret():                print '%s %s() called' % (ctime(), func.__name__)                func()        return ret@decodedef fun():        print "&&&&&"fun() <===> x = decode(fun); x()

5.python中模块索引路径有两种定义方法:使用PYTHONPATH环境变量或者在程序中sys.path.append('/xx/xx')sys.path存储模块索引路径,sys.modules存储加载的模块信息。Python中包即文件夹,但该文件夹下必须要有__init__.py文件才能作为包索引其下存储的模块。使用import <module_name>或者from <package/module> import <module/func/var>将模块,变量和函数引入当前的命名空间以调用,可在上述两条命令后使用as <alias>设置别名。

python代码无论是直接执行还是作为模块加载都会运行因此使用__name__系统变量检测代码是作为模块加载还是直接执行,如果作为模块加载,__name__即为模块的名字;如果直接执行,__name__即为__main__

6.Python完全支持面向对象,所有方法声明时第一个形参都要指定为self,类似于C++中的this,该形参用于类实例化时引用类实例,使用实例调用方法时,实例名实参则由解释器自动传入,指定传入的实参从方法第二个定义的形参开始匹配。perl中模块里的方法使用->符号调用时模块名作为实参第一个参数会自动传入。

7.Python中包和模块的区别从文件组织结构上来说即包是包含子包和模块文件的文件夹,其下要有__init__.py文件,用来import该包时默认执行,完成一些初始化的操作,如设置该包仅仅为了组织模块文件则无需编写任何初始化代码。必要时可以在该__init__.py文件中使用from xx import yy将该包下模块中定义的变量、函数或者类导入该包空间内,这样在主程序中import该包后直接使用<package>.<yy>调用,典型Python LIB编写如requests。简单实例如下:

/home/brce/Desktop/test.py/home/brce/Desktop/Module                        ├── func.py                        └── __init__.py

其中test.py是执行程序,Module文件夹是定义的包,其下__init__.py是初始化程序,func.py是定义了函数的模块。

__init__.py:********************************from func import callcall()    ********************************func.py:*********************************************************def call():   print("This Message means function call successfully")if __name__ == '__main__':   call()*********************************************************test.py:****************************************import syssys.path.append('/home/brce/Desktop')print sys.pathimport ModuleModule.call()***************************************

执行程序后结果如下:

brce@ubuntu:~/Desktop$ python test.py ['/home/bruce/Desktop', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/home/bruce/Desktop']This Message means function call successfullyThis Message means function call successfully

注意两条Message回显是因为__init__.py里调用了call函数导致了第一次回显,主程序里针对包的调用导致了第二次回显,程序执行后会发现Module文件夹下会自动生成pyc文件,该类型文件是Python的字节码文件用于模块的加载和调用。

brce@ubuntu:~/Desktop/Module$ lsfunc.py  func.pyc  __init__.py  __init__.pyc