1.python基础知识

来源:互联网 发布:命运之手mac汉化补丁 编辑:程序博客网 时间:2024/06/06 23:27

1.查看某个变量或者对象占用空间的大小
import sys
v=1
print sys.getsizeof(v)
2.排序
ipinfo=sorted(ipinfo.iteritems(),key= lambda  abs:abs[1],reverse=True)
sorted用于字典或者列表的排序。
key:   函数, 传入第一个元素, 返回比较的key。
cmp:   函数,传入两个参数, 如果第一个参数大于第二个参数, 返回一个正数, 如果第一个参数小于第二个参数,返回一个负数。  如果等于的话,返回O。 ,一般此函数不用自己制定,默认为None即可。

3.python2.6交互模式中退格键乱码问题:

在SSH连接CENTOS中 python2.6的交互模式中使用退格键乱码。 主要是因为所安装的Python缺少了readline模块所导致,具体的解决办法如下:

解决办法:
1.按退格键的时候按住crtl键。   (稍显不便)
2.先 yum install readline    yum install readline-devel     然后
easy_install readline 

4.Python多进程访问文件
python中文件操作往往会涉及到多个进程向同一个文件write的情况,这时要想保证同时只有一个进程写文件,可以采用如下方法:

使用fcntl.flock.

view plain
#coding:utf-8  
  
""" 
文件锁测试 
"""  
  
import fcntl  
import time  
  
fp = open('hello.txt','w')  
fcntl.flock(fp, fcntl.LOCK_EX)  
print '文件锁开始执行'  
time.sleep(100)  
fcntl.flock(fp, fcntl.LOCK_UN)  
fp.close() 

5.python for else:
如果for循环没有被break中断那么for执行完之后执行器对于的else语句
for i in "123":
    print i
else:
    print "for cycle have run without break"
6.python中的apply函数和*args **args的应用
def test(*args):
    print args
 test(1,2,3)
 输出为(1,2,3)
 def test(**args):
     print args
 test(a=1,b=2,c=3)
 输出为{“a”:1,"b":2,"c":3}

对于test这种类型的函数可以通过如下的形式进行调用:
test(**{'a':1})
 apply函数的应用。
 apply(func,argstuple)
 例如apply(test,(1,2,3)),参数必须为tuple,不能为列表或者是字典。
 7.对于Python类的理解

 class test:
    def __init__(self):
        pass
    def use(self,a,b):
        return test_1().add(a,b)
class test_1:
    def add(self,a,b):
        return a+b
类是对函数的封装,具有更高级的特性,类的方法,及方法内的操作在对象被建立的环境中执行。例如:
class test:
    def __init__(self):
        pass
    def use(self,b):
        return test_1().add(b)
class test_1:
    def add(self,b):
        return a+b
a=123
b=test()
b.use(123)
8.python 正则非贪婪模式

9.关于类的特殊代码
class test:
    def __init__(self):
        a[1]=2
        print a[1]
a={}
b=test()
可以正常运行。!
10.关于类的方法~
class test:
    def a():
        print 007
b=test()
b.a()
同下:
b=test()
c=b.a
c()
11.在python的函数中一定要注意:
def test(a,b,c):
    print a+b+c
test(a=1,b=2,3) 是错误的, 3不能出现在a=1,b=2的后面。
非关键字的必须要放在关键字的后面。!

12.对于函数内不能对全局变量是只读,之后在使用了global之后才是可写的理解。
在函数内想要通过=改变全局变量的值,必须要使用global进行修饰此变量。
如果在函数内通过函数或者方法修改全局变量的值,不必通过global进行修饰。直接进行即可
虽然在函数内对于形式参数是只读的,但是不代表在函数内不能改变形式参数的值。   在未用global修饰之前,不能使用=改变一个形式参数的值,但是可以通过此形参的方法修改形参的内容。

13.共享引用
a=[]
b=a
b.append(123)
print a
print b
结果均为[123]

14.使用列表的一个技巧
a=[4,5,6]
a.index(4) 返回其索引, 如果出现重复,则会返回第一个索引
15.python连接mysql时,如果已经设置mysql为autocommit了,如果是innodb的引擎在用Mysqldb连接的时候要这样:
conn=MySQLdb.connect()
cursor=conn.cursor()
cursor.execute()
conn.commit()
cursor.close()
conn.close()
最后已经要commit, 如果是用的myiaim引擎,则无需进行commit

15. python中一个常常遇见的一个问题
a=[]
def test(a):
    b=a
    b.append(123)
    return b
b=test(a)
print a,b
结果是[123], 我们的本意是想b=[123],而不改变a的值。  但是事与愿违。想要避免这样,可以按照如下:
a=[]
def test(a):
    import copy
    b=copy.deepcopy(a)
    b.append(123)
    return b
b=test(a)
print a,b
这样就是我们想要的结果了,python中一切皆是引用。  b=a会直接让其共享引用,  对于不可变对象,共享引用一般不会带来什么麻烦问题。 但是对于可变对象,如果一个地方的对象被改变了,那么
对齐其他的引用他的变量来说说,会直接感受到的。

16。python  时间字符串转时间戳
如a="20150320"
import time
a=time.strptime(a,"%Y-%m-%d")  #生成时间结构体
b=time.mktime(a)  #根据时间结构体返回时间戳

时间戳转时间:
a=time.time()
b=time.localtime(a)   #根据时间戳生成相应的时间结构体
c=time.strftime("%Y-%m-%d",b)  #根据时间tuple生成对应的字符串

17.set的作用
a=[1,2,1]
b=set(a)     #b为[1,2]   set自动去重   ,还可用于字符串等其他类型、

18.sum可以对所有可以迭代的对象进行求和,但是可迭代对象必须为迭代值必须int

19. urllib 和pycurl常常用于post get提交数据。
如果提t交的是Json数据, 其常常会以post方式进行提交, 在用Pos方式提交json数据的时候,和平常的Post有所不同,  平常的Post一般是key-value型的, 这种post 是吧json数据当作key,value为空。
def post_json_by_urllib(url,jsondata):
    request=urllib2.Request(url,jsondata)
    request.add_header("Content-type","application/json")
    request.get_method=lambda :"POST"
    request=urllib2.urlopen(request)
    return request.read()
#data=post_json_by_urllib("http://192.168.8.223:8080/solr/clientinfo/update",json.dumps({"add":{"doc":{"cid":9999996}}}))
data=post_json_by_urllib("http://192.168.2.254:8009/pointgold/url_test/",json.dumps({"add":{"doc":{"cid":99999995}}}))
print data
这就是一个例子,POST json数据的时候就相当于, 传递的Key为json数据, value为空
<QueryDict: {u'{"add": {"doc": {"cid": 99999995}}}': [u'']}>

20.python 操作hbase需要的模块:
thrift  hbase  .   
使用例子:
from thrift import Thrift  
from thrift.transport import TSocket  
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol  
from hbase import Hbase  
from hbase.ttypes import *

transport = TSocket.TSocket('192.168.3.152',9090)
transport = TTransport.TBufferedTransport(transport)

protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = Hbase.Client(protocol)
transport.open()

21. python 中的字符串‘aaa’.rfind方法:
b='tttbc'.rfind('b')  意思是在tttbc字符串中寻找b第一次出现的地方,返回其索引!
22. urllib中有一个urllib.quote函数,其用于对url进行编码。
在url中对于中文=号等需要进行转义才成作为一个参数的value进行GET传输。
这个时候就可以公国quote进行编码。网上也有网页版的编码工具
a=urllib.quote('digger.gongchang.com/?cid=123&uid=456')
b="digger.gongchang.com/?next=%s"%a
这就是个很好的例子。



23.  python try except else finanly 异常捕获。    不发生异常就执行else内的    finanly是无论异常是否发生都执行。
24.  Pycharm快捷键:
TAB   缩进选中行。   shift+TAB  取消对选中行的缩进
Ctrl+ / 注释/取消注释选中行~
25. python mysql cursor对象在使用时:
cursor.execute("select * from teset where username = %s",param=("abc",))
第二个参数,param  如果是int会自动填充到sql, 如果是str也会自动填充到SQL,而且会自动添加引号。!
26.  type 和isinstance的用法区别:
对于旧类    如class a():
                   pass
type(a()) 结果是instance 而不是我们想要的a, 对于新类 如a(object)形式的类, 可以用type进行判断。
  isinstance 可以对新类和旧类同时进行判断, 而且能够支持对继承关系的识别。

27.  优先级顺序 not and or

28. python中str.strip方法的作用:
a="abc"
b=a.strip("ac")
print b
b结果为b。  strip方法的作用:   如果self的开头或者结尾元素在参数(通常为序列)内则删除之,   删除之后继续进行判断:、、、 直到结束。
a.strip()  ==a.strip("\n\r\t ")
lstrip   :如果self的开头元素在参数(通常为序列)内则删除之,删除之后继续进行判断,直到结束。
rstrip: 同上,只不过是从结尾元素




29. os.path.join(*args)  用户把多个分离的路径组成一个路径。
  os.path.join("a","b","c")

30. str.join  join方法的作用, 把self放到  参数之间~~~
a="-"
b=a.join("abc")
print b
b为 “a-b-c”
31 。 sys.argv的使用
python test.py init
sys.argv 是一个列表。    sys.argv[0]是 test.py    sys.argv[1]是init

31. python 元组不可变加深离家
a=(1,[])
a[1].append(2)
是可以正常执行的。执行之后
a=(1,[2])

32.  python 中实现字典相加的简便方法:
a={"1":2,"3":1}
b={"1":3,"2":3}
c=dict(a,**b)
c的结果为{"1":3,"2":3,"3":1}
dict还可以用于生成字典:
a=dict([(1,2)])
a={1:2}

                min_date=datetime.datetime.strptime(min_date,"%Y%m%d")
                max_date=datetime.datetime.strptime(max_date,"%Y%m%d")
                date_step=datetime.timedelta(days=1)   #步进为1
33. python的map 和filter用法
map:
a=map(lambda i:i ,(1,2,3))
a=[1,2,3]
map总是返回一个列表。  
filter:
a=filter(lambda i:i,[0,1,2,3])
a=[1,2,3]
fiter利用第一个函数对对二个可迭代对象进行筛选,返回筛选函数返回值为真的一个可迭代对象。
map中多参数的处理


34. python MySQLdb 中一个用法:
conn=connect(**)
cursor=conn.cursor()
cursor.execute("select * from test where name in %s"%(("小李","小王"),))  这样执行肯定会出错。 正确的用法如下:
cursor.execute("select * from test where name in %s",(("小李","小王"),))
35. python 元类的理解:
   1.类的理解:
def __init__(self,a):
    self.a=a
def __del__(self):
    print self.a
    print "have del the object"
class test(object):
    pass
test.__init__=__init__
test.__del__=__del__
a=test(123)
常用type 和isinstance用来判断一个对象是不是属于一个类。   type对于新式类    isinstance可用于新类和旧类
type是类的工厂!  可以用来产生类
下面是通过type创建类的一个例子:
def __init__(self,a):
    self.a=a
def __del__(self):
    print self.a
    print "have del the object"
@classmethod
def test(cls):
    print cls.version
testclass=type("testclass",(),{"test":test,"version":456,"__init__":__init__,"__del__":__del__})
testclass.test()
静态方法可以直接通过类  对象  调用。    类方法可以通过类  对象 调用。    对象方法可以通过对象调用!
元类就是创建类的一个东西,   可以称作为类的工厂,      type就是一个内置的默认的一个元类!   object.__class__正是type!!! 关于元类的一个例子:
def upper_attr(future_class_name, future_class_parents, future_class_attr):
    print future_class_attr

    #  选择所有不以'__'开头的属性
    attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
   # 将它们转为大写形式
    uppercase_attr = dict((name.upper(), value) for name, value in attrs)
    print upper_attr
    # 通过'type'来做类对象的创建
    return type(future_class_name, future_class_parents, uppercase_attr)

__metaclass__ = upper_attr  #  这会作用到这个模块中的所有类

class Foo(object):
    # 我们也可以只在这里定义__metaclass__,这样就只会作用于这个类中
    bar = 'bip'
    __metaclass__ = upper_attr


print hasattr(Foo,"bar")
print type(Foo)
print Foo.__module__
在一个模块中定义一个元类之后,     如果是新式类,  显式对__metaclass__属性指定一下,对于旧类,则无需指定。  会自动生效。 

36. python模块具有封装型
testfile.py
def test():
    print a
a=123
test.py
from testfile import test
a=456
test()   #运行结果还是123
testfile.py
def test():
    print a
test.py
from testfile import test
a=123
test()  #运行会报错!
37. python中单下划线和双下划线的使用
_a    不能通过 from testfile import  *导入
__a  是类里的私有变量。
__a__是内置方法
38. 通过字符串创建变量。
globals["test"]=123 等价于 test=123
locals["test"]=345    等价于 test=345
39. 通过字符串导入一个模块
 __import__("enapps.enrpc.deploy"%i,fromlist=["deploy"])
等效于    import enapps.enrpc.deploy  as deploy
40. 判断一个函数是否是函数:
可以通过   hasattr(a,"__call__")     

41.  datatime对象和时间戳之间的相互转换
time.mktime(_date.timetuple()) 

42. python  中的字典的键 一定要具有__hash__属性。
 常用 数字  字符串    元组 作为其键(元组中要是含有字典也是不行的!),  具有__hash__属性的对象可以利用hash()函数操作这个对象,会得到一个int值。
43.python 对象中的一个陷阱。



44. python中nametuple的使用。
nametuple是collcetions模块中比较好用的一种数据类型
a=collections.namedtuple("a","name age")
b=a(name="zhou",age=23)
json.dumps(b)  -----------------------'['zhou',23]'
namedtuple更像是一种用来建立可序列化类的一种工具。

45.dir 和vars
二者比较相似, dir()返回一个对象属性值的一个列表。  vars()返回一个对象属性的一个字典。
46. python 中对两个对象执行 ==  !=    >...操作符实际上是调用其相应的内建函数。

47.   python 可以利用类属性 __slots__限制随意的添加实例属性。

48. python续行字符\的使用, 但是如果对于字符串进行续行,可以按照如下的方式:
“123345"\
  "123"
49.  python中分割字符串 
"123".split("1",1)  从左边用1分割字符串,最多分割一次
“123".rsplit("1",1)   从右边用1分割字符串,最多分割一次。

50. __new__方法返回一个类的实例,__init__初始化一个类的实例。
class Test(object):

    def __init__(self,a):

        print 007
def __new__(cls):

    #print args,kwargs
    return object.__new__(cls)

Test(123)
这样是不行的,   当用这个类创建一个对象的时候 会首先电泳 __new__(123)结果new不能接受多余的参数。故报错。
__new__和 __init__不必具有相同的参数结构,但是在新建实例时,只有参数同时能够穿个两个函数才有可能成功。
__new__必须能够要返回一个对象的实例。 可以通过object.__new__()实现。 也可以通过父类的__new__实现。
如果其不返回一个对象的实例, __init__就不会执行。
class Test(object):

    def __init__(self,a):

        print 007
    def __new__(cls,a):

#print args,kwargs
#return object.__new__(cls)
        pass
print Test(123)
51.python中的切片
python支持索引切片。 步进切片。 多维切片。 省略切片。
a[1:10:1]    start end    setup 
a[::-1]         快速逆序一个序列

52. python中有时候安装包的时候distribute报递归过身的错误。   pip --upgrade   distribute即可
53.python中的and  or妙用
and  返回最后一个真值,  第一个假值
or     返回第一个真值, 最后一个假值。
(bool  and [a] or  [b])[0]   可以实现  bool? a:b的三元操作符。

54.   random模块和列表在一起的使用。
random.choice
random.sample(list,5)  从列表中随机取出5个元素



my_dict={i:i*iforiinxrange(100)}
my_set={i*15foriinxrange(100)}


55.  sum(i for i in [1,2,3])可以正确执行,  其内部会生成一个生成器。

56.python中的位运算符:
优先级顺序: 从高到低
~
<<
>>
&
^
|
位运算原则:其总是先把位数对其,位数相同,然后进行位运算。  右移的时候左边补符号位。

57.json dumps中去空格处理:
json.dumps(siteConfig,separators=(",",":"))

59. python中 正则替换函数re.sub的一个高级用法

如果不加\1的话,  c也会被替换掉。
60. python  防止重复import的机制

每一次导入一个模块 ,其都会被加入到sys.modules字典里面,   下一次导入时候会检测这个包是否在sys.modules里面, 如果已经存在就不会导入, 如果不存在就导入

61.





0 0
原创粉丝点击