Python基础

1 交换变量

在其它语言中,需要这样交换变量

temp = a
a = b
b = temp

在Python中这样就完成交换变量

a, b = b, a

2 Python控制台的”_”

_用来存储上一次的打印结果。

当结果为None的时候,控制台不会打印,_ 里面存储的值也就不会改变。

>>> name = "John"
>>> name
'John'
>>> _
'John'
>>> name = None
>>> name
>>> _
'John'

3 合并字符串

# No
colors = ['red', 'blue', 'green', 'yellow']

result = ''
for s in colors:
    result += s

join只能用于元素是字符串的list

# Yes
result = ''.join(colors)

4 关键字in

当你需要判断一个KEY是否在dict中或者要遍历dict的KEY时,最好的方法是使用关键字in

# No
if d.has_key('c'):  # 在Python3中已经去除该用法
    print True

for key in d.keys():
    print key
# Yes
if 'c' in d:
    print True

for key in d:
    print key

Python的dict对象是对KEY做过hash的,而keys()方法会将dict中所有的KEY作为一个list对象;所以,直接使用in的时候执行效率会比较快,代码也更简洁。

5 字典

get如果该key不存在抛出KeyError。

# No
d = {'a': 1, 'b': 2}
d['c']
# Yes
d = {'a': 1, 'b': 2}
d.get('c')

fromkeys通过一个list生成dict,但是要提供默认值。

dict.fromkeys(['a', 'b', 'c'], 1)

setdefault有些情况下,我们需要给dict的KEY一个默认值。

d = {'a': 1, 'b': 2}
>>> d.setdefault('a', 0)
1
>>> d.setdefault('c', 3)
3
>>> d
{'b': 2, 'a': 1, 'c': 3}

6 字典的组装

>>> l1 = ['a', 'b', 'c']
>>> l2 = [1, 2, 3]
>>> dict(zip(l1, l2))
{'c': 3, 'b': 2, 'a': 1}

7 Python中的True值

对于自己声明的class,如果你想明确地指定它的实例是True或False,你可以自己实现class的__nonzero__(Python2)__bool__(Python3)或__len__方法。

当你的class是一个container时,你可以实现__len__方法。

class Test(object):

    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

如果你的class不是container,你可以实现__bool__方法。

class Test1(object):

    def __init__(self, value):
        self.value = value

    def __bool__(self):
        return bool(self.value)

8 enumerate索引和元素

在遍历列表的时候,可以通过enumerate方法来获取遍历时的index。

enumerate方法是惰性方法,所以它只会在需要的时候生成一项。

>>> l1 = ['a', 'b', 'c']
>>> for (index, value) in enumerate(l1):
...     print(index, value)
...
0 a
1 b
2 c

>>> e = enumerate(l1)
>>> e.__next__()
(0, 'a')

9 字符串格式化format

>>> name = "John"
>>> "I'm {0}".format(name)
"I'm John"
>>> "I'm {name}".format(name=name)
"I'm John"

>>> names = ["John", "Tom"]
>>> "I'm {0[0]}".format(names)
"I'm John"

# ^、<、>分别是居中、左对齐、右对齐,后面带宽度
# :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充
>>> num = 3
>>> "{0:0^5}".format(num)
'00300'
>>> "{0:0<5}".format(num)
'30000'
>>> "{0:0>5}".format(num)
'00003'

>>> '{:,}'.format(1234567890)
'1,234,567,890'

10 排序

sort改变原list,sorted不改变原list,同时返回新list。

>>> l1 = ['c', 'a', 'b']
>>> l1.sort()
>>> l1
['a', 'b', 'c']
>>> l2 = ['c', 'b', 'a']
>>> sorted(l2)
['a', 'b', 'c']
>>> l2
['c', 'b', 'a']

这里通过key完成更复杂的排序,其原理为,通过key进行排序,原list根据排序结果进行一一对应,为最终排序结果。
>>> l1 = ["John", "Tom", "jack"]
>>> l1.sort(key=str.lower)
>>> l1
['jack', 'John', 'Tom']

11 获取脚本参数

import sys

print(sys.argv[0])
print(sys.argv[1])

# 脚本名:    sys.argv[0]
# 参数1:     sys.argv[1]
# 参数2:     sys.argv[2]
# ...

12 实现杨辉三角 Generator

# 杨辉三角

          1
        1   1
      1   2   1
    1   3   3   1
  1   4   6   4   1
1   5   10  10  5   1

# 实现代码

def triangles():
    a = [1]
    while True:
        yield a
        a = [sum(i) for i in zip([0] + a, a + [0])]

# zip 函数
# a = [1, 2]  b = [4, 5]
# zip(a,b) [(1, 4), (2, 5)]

字符串首字母大写函数 capitalize()

13 生成素数

def odd_iter():
    n = 1
    while True:
        n += 2
        yield n


def is_dividable(n):
    return lambda x: x % n > 0


def primes():
    yield 2
    it = odd_iter()
    while True:
        n = next(it)
        yield n
        it = filter(is_dividable(n), it)

14 内置排序

sort  在原列表排序
sorted 产生新的排序列表