python学习日志

python中if __name__ == '__main__': 的解析

当你打开一个.py文件时,常常会在代码的最下面看到if __name__ == '__main__':,如今就来介 绍一下它的做用.html

        模块是对象,而且全部的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。若是 import 一个模块,那么模块__name__ 的值一般为模块文件名,不带路径或者文件扩展名。可是您也能够像一个标准的程序样直接运行模块,在这 种状况下, __name__ 的值将是一个特别缺省"__main__"。python

///////////////////////////////////////////////////////////////////////////////////////////////////mysql

在cmd 中直接运行.py文件,则__name__的值是'__main__';linux

而在import 一个.py文件后,__name__的值就不是'__main__'了;sql

从而用if __name__ == '__main__'来判断是不是在直接运行该.py文件数据库

 

 

 


Python 得到命令行参数的方法

须要模块:sys
参数个数:len(sys.argv)
脚本名:    sys.argv[0]
参数1:     sys.argv[1]
参数2:     sys.argv[2]
json

 

 


Python xrange与range的区别windows

range 前面小节已经说明了,range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。api

好比:函数

1 >>> range(5)
2 [01234]
3 >>> range(1,5)
4 [1234]
5 >>> range(0,6,2)
6 [024]

xrange 用法与 range 彻底相同,所不一样的是生成的不是一个list对象,而是一个生成器。

01 >>> xrange(5)
02 xrange(5)
03 >>> list(xrange(5))
04 [01234]
05 >>> xrange(1,5)
06 xrange(15)
07 >>> list(xrange(1,5))
08 [1234]
09 >>> xrange(0,6,2)
10 xrange(062)
11 >>> list(xrange(0,6,2))
12 [024]

由上面的示例能够知道:要生成很大的数字序列的时候,用xrange会比range性能优不少,由于不须要一上来就开辟一块很大的内存空间。

xrange 和 range 这两个基本上都是在循环的时候用。

1 for in range(0100):
2     print i
3  
4 for in xrange(0100):
5     print i

这两个输出的结果都是同样的,实际上有不少不一样,range会直接生成一个list对象:

1 = range(0,100)
2 print type(a)
3 print a
4 print a[0], a[1]

输出结果:

1 <type 'list'>
2 [01234567891011121314151617181920,212223242526272829303132333435363738,394041424344454647484950515253545556,575859606162636465666768697071727374,757677787980818283848586878889909192,93949596979899]
3 0 1

而xrange则不会直接生成一个list,而是每次调用返回其中的一个值:

1 = 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')

相关文章
相关标签/搜索