python学习笔记(一 pythonic)

1 字符串反转

#pythonic
def reverse_str( s ):
    return s[::-1]

#not pythonic
def reverse_str( s ):
    t = ''
    for x in xrange(len(s)-1,-1,-1):
        t += s[x]
    return t

2 For循环的索引

#pythonic
x = [2, 3, 10, 9, 5, 6, 1, 8]
for k, v in enumerate(x, start=1):
    print k, v

#not pythonic
for i in range(1,len(x)):
    print i, x[i]

3 并行遍历两个集合

a, b = [1,2,3], [5,7,9,12]

#pythonic

#zip 在内存中创建由元组组成的第三个列表, 其中每一个元素都是带有指向原始数据指针的独立对象。换句话说,它需要比原来两个列表的总和还要使用更多的内存。
for m,n in zip(a,b):
    print m,n

#对于较小的列表, zip是比较快的,但是如果列表较大建议使用izip, 因为izip 会在需要的时候优先使用迭代器,而不需要一上来就开辟一块很大的内存空间。
from itertools import izip
for m, n in izip(a, b):
    print m,n

#not pythonic
n = min(len(a), len(b))
for i in range(n):
   print a[i], b[i]

4 列表和字典的转化

#pythonic
a, b = [1,2,3], [5,7,9]
print dict(zip(a,b))

#not pythonic
w = dict()
for i in range(len(a)):
    w[a[i]] = b[i]

5 删除列表中的重复元素

#无序版
a, b = [1,2,3], [5,7,9]
list(set(a))

#有序版
from collections import OrderedDict

6 For…else针对没有从for循环中断的情况

#pythonic
for x in xrange(1,5):
if x == 5:
    print 'find 5'
    break
else:
    print 'can not find 5!'

#not pythonic
find = False
for x in xrange(1,5):
    if x == 5:
        find = True
        print 'find 5'
        break
if not find:
    print 'can not find 5!'

7 三元符的替代

#pythonic
a = 3   
b = 2 if a > 2 else 1

#not pythonic
if a > 2:
    b = 2
else:
    b = 1

8 列表求和,最大值,最小值,乘积

numList = [1,2,3,4,5]   

#pythonic
sum = sum(numList)  #sum = 15
maxNum = max(numList) #maxNum = 5
minNum = min(numList) #minNum = 1
from operator import mul
prod = reduce(mul, numList, 1) 
**#默认值传1以防空列表报错**


#not pythonic:
sum = 0
maxNum = -float('inf')
minNum = float('inf')
prod = 1
for num in numList:
    if num > maxNum:
        maxNum = num
    if num < minNum:
        minNum = num
    sum += num
    prod *= num

9 字典计数

#pythonic :使用 defaultdict 或者 Counter
a = [1,2,3,4,5]
from collections import defaultdict
d = defaultdict(int)
for i in a:
  d[i] += 1

#not very pythonic:
for i in a:
  d = setdefaultdict(i,0) + 1

# not Pythonic:使用 get() 方法
d = {}
for i in a:
  d[i] = d.get(i, 0) + 1

defaultdict(function_factory)构建的是一个类似dictionary的对象,其中keys的值,自行确定赋值,但是values的类型,是function_factory的类实例,而且具有默认值。
defaultdict类除了接受类型名称作为初始化函数的参数之外,还可以使用任何不带参数的可调用函数,到时该函数的返回结果作为默认值,这样使得默认值的取值更加灵活。比如:

d = defaultdict(lambda:10)

setdefault(key[, default])与defaultdict(function_factory)基本差不多,但是后者速度更快。

10 合并字典

a = {'a':1,'b':2}
b = {'c':3}

# pythonic:注意这里是拷贝
new_dict = a.copy()
new_dict.update(b)
#等价于:
new_dict = dict(a, **b)

# not pythonic
new_dict = dict(a.items()+b.items())

参考文献:
1 http://www.jb51.net/article/56719.htm
2 http://www.cnblogs.com/xueweihan/p/5160998.html

你可能感兴趣的:(python基础知识)