应该尽量避免使用全局变量。不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性。对全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误。这种错误是很难发现和更正的。
全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖于全局变量。同样,全局变量降低了代码的可读性,阅读者可能并不知道调用的某个变量是全局变量。
但是某些时候,全局变量能够解决局部变量所难以解决的问题。事物要一分为二。
python里面全局变量有两种灵活的用法:
1 声明法
在文件开头声明全局变量variable,
在具体函数中使用该变量时,需要事先声明 global variable,否则系统将该变量视为局部变量。
CONSTANT = 0
(将全局变量大写便于识别)
def modifyConstant() :
global CONSTANT
print CONSTANT
CONSTANT += 1
return
if __name__ == '__main__' :
modifyConstant()
print CONSTANT
2模块法(推荐)
把全局变量定义在一个单独的模块中:
#gl.py
gl_1 = 'hello'
gl_2 = 'world'
在其它模块中使用
#a.py
import gl
def hello_world()
print gl.gl_1, gl.gl_2
#b.py
import gl
def fun1()
gl.gl_1 = 'Hello'
gl.gl_2 = 'World'
第二种方法,适用于不同文件之间的变量共享,而且一定程度上避免了开头所说的全局变量的弊端,推荐! ......
=========================================================
Python获取元组和列表中的元素的方法print len(元组)
print len(列表)
============================== python获取当前路径的方法>>> import os
>>> homedir = os.getcwd()
>>> print homedir
D:\python\test
>>>
>>> import sys
>>> print sys.argv[0]
D:\python\test\temp.py
>>> print os.path.abspath(sys.argv[0])
D:\python\test\temp.py
>>>
=====================================================
Python定义及使用结构体
Python中没有专门定义结构体的方法,但可以使用class标记定义类来代替结构体,其成员可以在构造函数__init__中定义,具体方法如下。
# 例:定义及使用结构体
class item:
def __init__(self):
self.name = '' # 名称
self.size = 10 # 尺寸
self.list = [] # 列表
a = item() # 定义结构对象
a.name = 'cup'
a.size = 8
a.list.append('water')
==========================================================
使用C定义的结构体:
struct ss {
int num1;
int num2;
};
使用Python定义的结构体
from ctypes import *
class ss(Structure):
_fields_ = [
("num1", c_int),
("num2", c_int),
]
测试:
cstruct = ss()
cstruct.num1 = 1
cstruct.num2 = 2
print cstruct.num1
print cstruct.num2
输出:
1
2
===========================================================
[转]制作Python的安装模块
Python模块的安装方法:
1. 单文件模块
直接把文件拷贝到$python_dir/lib
2. 多文件模块,带setup.py
python setup.py install
3. egg文件,类似Java的jar
1) 下载ez_setup.py,运行python ez_setup
2) easy_install *.egg
虽然Python的模块可以拷贝安装,但是一般情况下推荐制作一个安装包,即写一个setup.py文件来安装。
setup.py文件的使用:
% python setup.py install #安装
% python setup.py sdist #制作分发包
% python setup.py bdist_wininst #制作windows下的分发包
% python setup.py bdist_rpm
setup.py文件的编写
简单的例子:
setup.py文件
setup(
name = " mytest " ,
version = " 0.10 " ,
description = " My test module " ,
author = " Robin Hood " ,
url = " http://www.csdn.net " ,
license = " LGPL " ,
packages = find_packages(),
scripts = [ " scripts/test.py " ],
)
mytest.py
def get():
return sys.path
scripts/test.py
print os.environ.keys()
setup中的scripts表示将该文件放到 Python的Scripts目录下,可以直接用。
OK,简单的安装成功,可以运行所列举的命令生成安装包,或者安装该python包。
本机测试成功(win32-python25)!
======================================================
Python读取ini文件的包 「dict4ini」
主页 http://code.google.com/p/dict4ini/
描述:python 读取传统ini文件的扩展,详细实例 点击上面连接可见
========================================================
使用Python的MD5模块比较两个文件是否一致
在Python中内置了md5的实现,就是md5模块,因此可以很简单的处理比较两个文件是否一致的问题。如以下代码片断:
import os,sys,md5
f1 = open('f:/1.txt','r')
f2 = open('f:/1.txt','r')
print md5.new(f1.read()).digest() == md5.new(f2.read()).digest()
以上处理在处理比较大的文件(比如几百M的文件)的时候会有内存问题。
python的md5模块使用非常简单,包括以下几个函数:
md5.new([arg])
返回一个md5对象,如果给出参数,则相当于调用了update(arg)
md5.updte(arg)
用string参数arg更新md5对象
md5.digest()
返回16字节的摘要,由传给update的string生成,摘要没有ascii字符
md5.hexdigest()
以16进制的形式返回摘要
代码示例:
01.#!/usr/bin/python
02.import sys
03.import md5
04.
05.str=sys.argv[1]
06.key = md5.new()
07.key.update(str)
08.print key.hexdigest()
09.str=sys.argv[1]
保存代码为md.py
1.[fengyj@fengyj python]$ chmod +x md.py
2.[fengyj@fengyj python]$ ./md.py fengyajie
3.74d040444b8f20d37aa9b2bd2997cd64
===========================================================
python提供了一个进行hash加密的模块:hashlib
下面主要记录下其中的md5加密方式
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("Nobody inspects")
>>> m.update(" the spammish repetition")
>>> m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.hexdigest()
'bb649c83dd1ea5c9d9dec9a18df0ffe9'
对以上代码的说明:
1.首先从python直接导入hashlib模块
2.调用hashlib里的md5()生成一个md5 hash对象
3.生成hash对象后,就可以用update方法对字符串进行md5加密的更新处理
4.继续调用update方法会在前面加密的基础上更新加密
5.加密后的二进制结果
6.十六进制结果
如果只需对一条字符串进行加密处理,也可以用一条语句的方式:
>>>print hashlib.new("md5", "Nobody inspects the spammish repetition").hexdigest()
'bb649c83dd1ea5c9d9dec9a18df0ffe9'
下面分别使用MD5和SHA进行加密:
import hashlib
a = "a test string"
print hashlib.md5(a).hexdigest()
print hashlib.sha1(a).hexdigest()
print hashlib.sha224(a).hexdigest()
print hashlib.sha256(a).hexdigest()
print hashlib.sha384(a).hexdigest()
print hashlib.sha512(a).hexdigest()
还有一种base64加密:
import base64
str='haha'
encoded = base64.b64encode(str)
decoded = base64.b64decode(encoded)
------------------------------
>>> print encoded
aGFoYQ==
>>> print decoded
haha
你会发现decoded == str
========================================================
python 查找文件夹下所有文件 收藏- def find_file_by_pattern(pattern='.*', base=".", circle=True):
- '''''查找给定文件夹下面所有 '''
- re_file = re.compile(pattern)
- if base == ".":
- base = os.getcwd()
- final_file_list = []
- print base
- cur_list = os.listdir(base)
- for item in cur_list:
- if item == ".svn":
- continue
- full_path = os.path.join(base, item)
- if full_path.endswith(".doc") or \
- full_path.endswith(".bmp") or \
- full_path.endswith(".wpt") or \
- full_path.endswith(".dot"):
- continue
- # print full_path
- bfile = os.path.isfile(item)
- if os.path.isfile(full_path):
- if re_file.search(full_path):
- final_file_list.append(full_path)
- else:
- final_file_list += find_file_by_pattern(pattern, full_path)
- return final_file_list
=============================================
for root, dirs, files in os.walk('D:\\'):
for file in files:
print os.path.join(root, file)