python中if __name__ == '__main__': 的解析
当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用.
模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。
///////////////////////////////////////////////////////////////////////////////////////////////////
在cmd 中直接运行.py文件,则__name__的值是'__main__';
而在import 一个.py文件后,__name__的值就不是'__main__'了;
从而用if __name__ == '__main__'来判断是否是在直接运行该.py文件
Python 获得命令行参数的方法
需要模块:sys
参数个数:len(sys.argv)脚本名: sys.argv[0]
参数1: sys.argv[1]
参数2: sys.argv[2]
Python xrange与range的区别
range 前面小节已经说明了,range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。
比如:
1 |
>>> range ( 5 ) |
2 |
[ 0 , 1 , 2 , 3 , 4 ] |
3 |
>>> range ( 1 , 5 ) |
4 |
[ 1 , 2 , 3 , 4 ] |
5 |
>>> range ( 0 , 6 , 2 ) |
6 |
[ 0 , 2 , 4 ] |
xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。
01 |
>>> xrange ( 5 ) |
02 |
xrange ( 5 ) |
03 |
>>> list ( xrange ( 5 )) |
04 |
[ 0 , 1 , 2 , 3 , 4 ] |
05 |
>>> xrange ( 1 , 5 ) |
06 |
xrange ( 1 , 5 ) |
07 |
>>> list ( xrange ( 1 , 5 )) |
08 |
[ 1 , 2 , 3 , 4 ] |
09 |
>>> xrange ( 0 , 6 , 2 ) |
10 |
xrange ( 0 , 6 , 2 ) |
11 |
>>> list ( xrange ( 0 , 6 , 2 )) |
12 |
[ 0 , 2 , 4 ] |
由上面的示例可以知道:要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。
xrange 和 range 这两个基本上都是在循环的时候用。
1 |
for i in range ( 0 , 100 ): |
2 |
print i |
3 |
4 |
for i in xrange ( 0 , 100 ): |
5 |
print i |
这两个输出的结果都是一样的,实际上有很多不同,range会直接生成一个list对象:
1 |
a = range ( 0 , 100 ) |
2 |
print type (a) |
3 |
print a |
4 |
print a[ 0 ], a[ 1 ] |
输出结果:
1 |
< type 'list' > |
2 |
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99 ] |
3 |
0 1 |
而xrange则不会直接生成一个list,而是每次调用返回其中的一个值:
1 |
a = xrange ( 0 , 100 ) |
2 |
print type (a) |
3 |
print a |
4 |
print a[ 0 ], a[ 1 ] |
输出结果:
1 |
< type 'xrange' > |
2 |
xrange ( 100 ) |
3 |
0 1 |
python 基于mmap模块的jsonmmap实现本地多进程内存共享
1.概述
-
共享内存可以说是最有用的进程间通信方式.两个不用的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址空间.一个进程可以及时看到另一个进程对共享内存的更新,反之亦然.采用共享内存通信的一个显而易见的好处效率高,因为进程可以直接读写内存,而不需要任何数据的复制.对于向管道和消息队列等通信等方式,则需要在内核和用户空间进行四次的数据复制,而共享内存则只需要两次数据复制:一次从输入文件到共享内存区,另一个从共享内存区到输出文件.实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域.而是保持共享区域,知道通信完毕为止,这样,数据内容就一直保存在共享内存中,并没有写回文件.共享内存中的内容往往是在解除映射时才写回文件的.因此,采用共享内存的通信方式效率非常高.
-
mmap系统调用是的是的进程间通过映射同一个普通文件实现共享内存.普通文件被映射到进程地址空间后,进程可以向像访问普通内存一样对文件进行访问,不必再调用read,write等操作.与mmap系统调用配合使用的系统调用还有munmap,msync等. 实际上,mmap系统调用并不是完全为了用于共享内存而设计的.它本身提供了不同于一般对普通文件的访问方式,是进程可以像读写内存一样对普通文件操作.而Posix或System V的共享内存则是纯粹用于共享内存的,当然mmap实现共享内存也是主要应用之一.
2. python mmap模块详解
-
在python中,mmap.mmap()的函数实现在windows和linux上是不一样的,但实现api接口函数很相似,下面以mmap的windows实现为例说明:
-
mmap.mmap(fileno, length[, tagname[, access[, offset]]])
- fileno:the file handle fileno, 文件描述符
- length:共享内存的大小
- tagname: 共享内存区域的名字,可以理解为id
- access:
- ACCESS_READ: 只能读,如果执行写操作,raises a TypeError exception
- ACCESS_WRITE: 可读可写
- ACCESS_COPY: 可读可写,但不更新到文件中去
-
函数列表
- mmap.close() 断开映射关系
- mmap.find(string[, start[, end]]):返回第一个string的索引,否则返回-1
- mmap.move(dest, src, count): 移动count大小的内容从src到dest
- mmap.read(num): 根据文件指针的位置兑取num个字节的内容,更新文件指针的位置
- mmap.read_byte():读取当前字符,更新文件指针位置
- mmap.readline():Returns a single line, starting at the current file position and up to the next newline.从当前位置到下一行位置的所有内容
- mmap.resize(newsize):Resizes the map and the underlying file,改变映射内存与文件大小
- mmap.rfind(string[, start[, end]]): 返回最后一个string的索引
- mmap.seek(pos[, whence]): 设置文件指针的位置
- mmap.size(): 返回共享内存的大小
- mmap.tell():返回当前指针的位置
- mmap.write(string):从当前指针位置开始写入string
- mmap.write_byte(byte): Write the single-character string byte into memory at the current position of the file pointer; the file position is advanced by 1.
Python操作mysql数据库:MySQLdb模块
Python中的mysql操作可以使用MySQLdb模块来完成。它符合Python社区设计的Python Database API SpecificationV2.0标准,所以与其他的数据库操作的API,如SQLite等基本类似。
1.连接的建立与释放
建立连接时可用connect函数,它返回一个Connection类型对象
conn = MySQLdb.connect('localhost', 'root', '123456', 'test')
connect方法常用的参数有
host:数据库主机名.默认是用本地主机.
user:数据库登陆名.默认是当前用户.
passwd:数据库登陆的秘密.默认为空.
db:要使用的数据库名.没有默认值.
port:MySQL服务使用的TCP端口.默认是3306.
charset:数据库编码。
如果在数据编码设置正确时,向数据库插入数据出现乱码时,可以设置连接的字符集参数charset。
释放连接时可以应用Connection类型对象的close方法。
conn.close()
2.Cursor对象
执行SQL语句前要获得一个指定连接的Cursor对象,由Cursor对象执行SQL查询并获取结果。
获得Cursor对象的方法
cur = conn.cursor()
在默认情况下cursor方法返回的是BaseCursor类型对象,BaseCursor类型对象在执行查询后每条记录的结果以列表(list)表示。如果要返回字典(dict)表示的记录,就要设置cursorclass参数为MySQLdb.cursors.DictCursor类。
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
这个参数也可在调用connect方法建立连接时设置
conn = MySQLdb.connect(host = 'localhost', user = 'root', passwd = '123456', db = 'test' cursorclass = MySQLdb.cursors.DictCursor)
执行结束后可以关闭cursor对象
cur.close()
3.查询,插入,更新、删除操作。
Cursor类型提供了execute方法用于执行SQL操作
execute(query [,parameters])
query是一个SQL字符串,parameters是一个序列或映射,返回值是所影响的记录数
查询
cur.execute("select * from t1 where name = %s and age = %s", ('June', 27))
cur.execute("select * from t1 where name = %(name)s and age = %(age)s", {'name':'June', 'age':27})
这里和字符串的格式化操作类似,但不管参数是什么类型,都要用'%s'
获取结果
获取结果集有三种方法,fetchone、fetchall和fetchmany,返回结果是一个tuple对象,tuple中的每一个元素对应查询结果中的一条记录。
fetchone()返回结果集中的下一条记录
fetchall()返回结果集中的剩余记录
fetchmany([size])返回结果集中size条记录
插入、更新、删除
cur.execute("insert t1(name, age) values(%s, %s)", ('Jack', 32))
更新和删除的操作与更新、删除类似
除了execute,Cursor类还提供了executemany()方法
executemany(query [, parametersequence])
querey是一个查询字符串,parametersequence是一个参数序列。这一序列的每一项都是一个序列或映射对象。但executemany只适合插入、更新或删除操作,而不适用于查询操作。
cur.execute("insert t1(name, age) values(%s, %s)", (('Jack', 32), ('Junior', 24)))
mysql现在一般会默认InnoDB作为默认引擎,InnoDB引擎执行插入、更新、删除操作后要进行提交,才会更新数据库。
cur.commit()
4.其他操作
Connection类:
rollback() 回滚
Cursor类:
callproc(procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数。
nextset():移动到下一个结果集
执行查询操作或存储过程时可能返回多个结果集,例如:
cur.execute('select * from t1; select * from t2')
来源:oschina
链接:https://my.oschina.net/u/1982946/blog/706049