注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老狗的博客

尽管每一步都很微小,但我确认我在进步

 
 
 

日志

 
 
关于我
sky

认真生活,努力工作 热爱技术,关注DB,存储,分布式,中间层,java,c++,php

网易考拉推荐

python学习  

2014-03-01 07:52:09|  分类: language |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
0. exception
r = redis.Redis(host="", port=6379, db=0)
try:
reply = r.get("a")
except Exception, ex:
print "exception:%s" % ex
逗号的类似用法只能在这里使用吧
也可以是Exception as ex

在这个地方可以详细的分析下,python24是不支持Exception as ex类似的语法,所以当报此类错误的时候,注意检查下python的版本问题
python ./check_incr.py 0
这样启动的话,使用的是默认的Python版本
./check_incr.py 0
这样启动的话,使用的是第一行通过#!指定的版本

1None 是singleton, 不要使用 == or != 去比较None, 应该使用 is或者 is not

2. bool值,bool值的比较使用 not x 或者 x进行表示 
对于False和True的比较,不要使用 == 或者 != , 最好使用 if not x or if x
数据结构 长度是否为0的比较, 则可以用真或者假进行表示
a= [];
if a:
 print "not empty"
else:
 print "empty"
结果为:empty

4. 如果是整数, 则比较其是否为0, 最好通过 == 进行比较

5. 尽量使用python自己支持的特性, 而不是使用模块特有的,如string
foo = "hello, world"
foo.split(" ");

6. 使用xrange, 而不是range
 Like range(), but instead of returning a list, returns an object that
 generates the numbers in the range on demand.  For looping, this is 
 slightly faster than range() and more memory efficient.
类似 range(), 不同的是, 它并不返回一个list, 而是返回一个对象,
这个对象在需要的时候会产生数字

7. 一行不要超过80个字符
def function(a, b, c, d, e, f="hello",
g="ok")

如果一个字符串过长,则可以使用implicit line join
a = ("hello"
"world")
也可以使用
a = "hello\
world"

a= "hello\n
world"

8. 每一个Python脚本的开头应该包含
#!/usr/bin/evn python26

9. 字符串
使用%进行格式化
print "%s,%d" % ("ok", 1)
注意有多个元素必须用括号括起来,否则报错
整型数:%d
无符号整型数:%u
八进制:%o
十六进制:%x   %X
浮点数:%f
科学记数法: %e   %E
根据数值的不同自动选择%e或%f: %g
根据数值的不同自动选择%E或%f: %G

复杂数据结构的格式化打印
list数据结构没有问题
a = ["hello", "world"]
print "%s,ok" % a;
tuple数据结构不行
a=("hello", "world")
print "%s,ok" % a;
hashtable数据结构可以
a= {“1”, "hello"}
print "%s,ok" % a


10. python中的字符串都是不可变的
a = "hello" + "world"
在这个操作中,会产生三个字符串对象
第一个是"hello", 第二个是"world", 第三个是"hello, world"

如果在for循环中,这样做会浪费很多内存空间,效率也很差
for  seq in xrange(1000):
a += "hello, world"
中间过程会产生1000个中间对象

a = [];
for seq in xrange(1000):
a.append("hello,world");
b = "".join(a);
join
    Return a string which is the concatenation of the strings in the
    iterable.  The separator between elements is S.

11. python的数据结构
tuple: 不可变的列表
a = (1, 2, 3)
for item in a:
print item

list:  可变列表
b = [1, 2, 3]
for item in b:
print item
列表:[1, 2, 3]
从左边开始索引是: 0 1 2
从右边开始索引是: -3 -2 -1
如第一个元素可以是a[0], 也可以是a[-3]

截取字串,如果两个参数都没有设定,则默认为0, 以及最好一个元素的序号
a[:] :  所有元素
a[0:]: 获取列表中的所有元素
a[:-1]: 获取除最好一个元素外的其他元素
dict: hashtable
c= { "1" : "apple", "2" : "google"}
for k, v in c.iteritems():
print  k
print v

has_key 可以判断key是否存在
if c.has_key("1"):
  print c["1"]


12. python class

class Person(object):
count = 0; #class variables
def __init__(self, name, age):
self.name = name #public
self._age = age #protected
self.__tel = "138" #private
Person.count += 1

def sayhi(self):
print "hi, myname is " + self.name

def __del__(self):
print "oh, my name is " + self.name + ", goodbye, i will die"
Person.count -= 1

class Manager(Person):
def __init__(self, name, age, position):
Person.__init__(self, name, age);
self.position = position

def sayhi(self):

print "name=%s" % self.name

print "age=%d" % self._age

print "tel=%s" % self.__tel

p = Person("liudong", 25)
m = Manager("liuyang", 19, "manager")

print m.sayhi()

如果一个类没有父类,则一定要继承object

13. 迭代器
iter(...)
    iter(collection) -> iterator
    iter(callable, sentinel) -> iterator

 Get an iterator from an object.  In the first form, the argument must
    supply its own iterator, or be a sequence.
    In the second form, the callable is called until it returns the sentinel.
14. isinstance
isinstance(...)
    isinstance(object, class-or-type-or-tuple) -> bool
    
    Return whether an object is an instance of a class or of a subclass thereof.
    With a type as second argument, return whether that is the object's type.
    The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for
    isinstance(x, A) or isinstance(x, B) or ... (etc.).

15. mktime(...)
    mktime(tuple) -> floating point number
    
    Convert a time tuple in local time to seconds since the Epoch.
16. import
一个模块就是一个py文件,
一个包是一个目录,下面放了一堆的py文件, 一个包一般都有__init__.py
sys.modules 和 sys.path都是为了导入模块(import)服务的
sys.modules是一个map, 存储了模块名称和模块地址的映射关系
sys.path是list,存储了一组路径
在Import模块的时候,首先在sys.modules中间找这个模块是否存在,如果不存在,则
到sys.path的路径里面进行查找
sys.path是一个路径的list, 如下,

['', '/home/liudong2/python/lib/python26.zip', '/home/liudong2/python/lib/python2.6', '/home/liudong2/python/lib/python2.6/plat-linux2', '/home/liudong2/python/lib/python2.6/lib-tk', '/home/liudong2/python/lib/python2.6/lib-old', '/home/liudong2/python/lib/python2.6/lib-dynload', '/home/liudong2/python/lib/python2.6/site-packages']

当我们要导入一个模块的时候,首先会在sys.modules中查找,是否已经import,
 如果没有, 则会在sys.path目录列表中逐个进行查找
如果找到了这个sys.py文件, 则执行主块部分内容
sys.modules是一个map, 如下:

>>> print sys.modules

如果我们想查看某个模块的路径,可以通过如下命令执行:
import a_module
print a_module.__file__
>>> print os.__file__
/home/liudong2/python/lib/python2.6/os.pyc

我们随便写一个脚本测试一下
import os
import sys
import logging

print __file__
print os.path.realpath(__file__)
print __name__

./test.py
/data1/liudong7/python-test/test.py
__main__


17. import的顺序问题
import一行一条,分为三组:标准库,第三方库, 应用程序自己的库

18. property封装

def Person:

def __init__(self, name, tel):

self.name = name;

self.__tel = tel;

###tel可以作为变量使用,封装相当方便

@property

def tel():

return "*" * 7 + self.__tel[-4:]


p = Person("xman", "18911923060");

print p.tel


*******3060

11. 命令行参数
import sys
argv是一个list
可以通过len(sys.argv)获取其长度

sys.argv[0] : 脚本名字


12 __name__问题
如果模块是被导入,则__name__是模块名字
如果模块是直接执行,则__name__是__main__

13. 文件操作
1. 打开文件
input = open("./data1.txt", "r")
output = open("./data1.txt", "w")

2. 字符串去除末尾的字符序列
1). s为字符串,rm为要删除的字符序列
s.strip(rm)
s.lstrip(rm)
s.rstrip(rm)
3. 遍历文件
for line in input:
line = line.strip()
print line
如果rm为空的时候,默认删除空白字符('\n', '\r', '\t', '')
 14 字符串和数字的相互转化
a = 123
a_str = str(a);
import string
b = "123"
b_num = string.atoi(b)
15. subprocess.Popen
 |  __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
 |      Create new Popen instance.

 |  communicate(self, input=None)
 |      Interact with process: Send data to stdin.  Read data from
 |      stdout and stderr, until end-of-file is reached.  Wait for
 |      process to terminate.  The optional input argument should be a
 |      string to be sent to the child process, or None, if no data
 |      should be sent to the child.
 |      
 |      communicate() returns a tuple (stdout, stderr).
管道的介绍(进程之间通信的工具):
1. 管道是半双共的
2. 管道只能在具有公共祖先的两个进程之间调用
3. 一般使用的方式是,父进程首先通过pipe函数创建了一个管道,然后fork一个子进程,如果需要由父进程向子进程传递数据,则父进程关闭读端,子进程关闭写端
4.  int pipe(int filedes[2]);
def external_cmd(cmd, msg_in=''):
    try:
        proc = subprocess.Popen(cmd,
        shell=True,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,)
        stdout_value, stderr_value = proc.communicate(msg_in)
        return stdout_value, stderr_value

    except ValueError, err:
        return None, None
    except IOError, err:
        return None, None
16. 字符串的单引号,双引号,以及三引号的问题
一般的python字符串用单引号来包含
如果字符串中包含单引号,则可以用 双引号来包含
>>> print "a'b"
a'b
如果字符串中包含双引号,则可以用 三引号来包含
>>> print '''a"bc'''
a"bc
三引号可以有两种 三个双引号,或者三个单引号,这两个没有什么区别,
都是可以的
三引号会完整的将换行包含在其中
>>> print '''a
... b
... c'''
a
b
c
17. 奇怪的语法pythonic
 [ f[:-3] for f in os.listdir('.') if not f.startswith('_') and f.endswith('.py')]
首先是
ret = []
for f in os.listdir('.'):
if not f.startswith('_') and f.endswith('.py')
tmp = f[:-3]
ret.append(tmp)

dict([(name, 'django.core') for name in ['a','b','c']])
ret = {}
for name in ['a', 'b', 'c']:
dict[name] = 'django.core'
18.  函数定义中的*和**语法
def func1(*args):
print args
func1(1, 2, 3, 4)
这里*args, 指的是将所有实参作为一个元组传递过来
def test_arg(*arg):
  for k in arg:
    print k

test_arg(1, 2, 3)
test_arg([1,2,3]) //不能这样做,如果这样做,只能讲[1,2,3]作为元组的第一个元素

执行结果:
[ ~]$ python26 ./test_args.py 
1
2
3
[1, 2, 3] 

def test_arg1(**arg):
  for k, v in arg.iteritems():
    print k, v
def func2(**args):
print args
test_arg1(arg1="k1",arg2="k2")
执行结果:
arg1 k1
arg2 k2


func2(name="liudong", age=19)
这里的**args指将所有参数作为一个字典传递进来

 def func3(*arg1, **arg2):
print arg1
print arg2
>>> func3(1, 2, 3, name="liudong", age=18)
(1, 2, 3)
{'age': 18, 'name': 'liudong'}

19. 字符和数字相互转换
b = ord('a')
a = chr(97)
20. 时间转换
获取unix时间戳
a = time.time()
21. 判断True或者False
这个点犯了很多次错误了,判断一个变量ret为false
if not ret:
 print "error"
22. multiprocessing

from multiprocessing import Process, Queue
import os
import time
import commands
import string
def test_process(global_ret):
pid = os.getpid()
ret = commands.getstatusoutput("/usr/local/bin/php /data1/cacheservice-phpclient/src/mytest.php")
global_ret.put(ret[1])

if __name__ == "__main__":
proc_list = []
global_ret = Queue()
for item in xrange(0, 800):
print "item=%d" % item
child_proc = Process(target=test_process, args=(global_ret,));
proc_list.append(child_proc)
child_proc.start()
for item in proc_list:
item.join()
error_ct = 0
sum_time = 0
sum_ct = 0
process_ct = 0
while not global_ret.empty():
elem = global_ret.get()
elem_array = elem.split(":")
sum_time += string.atoi(elem_array[1])
error_ct += string.atoi(elem_array[0])
sum_ct += string.atoi(elem_array[2])
process_ct += 1
avg_time = sum_time / process_ct
avg_qps = sum_ct / avg_time
print "error=%d,qps=%f" % (error_ct, avg_qps)

1. 首先创建process对象,然后start, 最后再逐个进程进行join
2. 父进程向子进程传递对象,可以通过向线程回调函数传递变量,传递变量有两种
def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
args是数组
kwargs是字典
3. 子进程向父进程传递对象需要通过队列进行
multiprocessing介绍传送门:https://docs.python.org/2/library/multiprocessing.html

22. 整数相除结果是整数
>>> 1/3
0
>>> 1.0/3
0.33333333333333331
>>> 1/3.0
0.33333333333333331
>>> 

23. 字符串
str = "hello"
len(str) 求长度
str.lstrip(s)
str.rstrip(s)
str.strip(s)
首先参数s是可选的,如果没有设定,则说明去除空格以及\r\n等
其次lstrip是删除str左边的特殊字符,rstip是删除str右边的特殊字符,strip是删除两边的特殊字符
注意只是两边


24. 代码风格,续行符 \
a. "%i %s %i" % (v1, 
v2, v3) #正确
b. "%i %s %i" %
(v1, v2, v3) #错误
c. "%i 
%s %i"  % (v1, v2, v3) #错误
b,c两种错误的情况都可以通过在第一行行尾添加续行符\实现

d. 对于函数参数列表,可以换行,不用加续行符
def test(a,
b, c):

25. 类的成员
类的成员变量不一定非的要在构造函数中定义,在成员函数中也可以定义,如下
class person:
def __init__(self, name):
self.name = name
def setAget(age):
self.age = age
26. 求两个集合的差集
print list(set(b).difference(set(a)))

27. python import
http://codecloud.net/python-import-2309.html
  评论这张
 
阅读(342)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018