python三个必知知识点

2018-12-28  本文已影响4人  编程自习室
python1228.png

+、+=、extend()之间的区别与应用场景

首先看测试用例:

# 创建一个序列类型的对象
my_list = [1, 2, 3]
# 将现有的序列合并到my_list
extend_my_list = my_list + [4, 5]

print(extend_my_list)  # [1, 2, 3, 4, 5]
# 将一个元组合并到这个序列
extend_my_list = my_list + (6, 7)
# 抛出异常 TypeError: can only concatenate list (not "tuple") to list
print(extend_my_list)

# 使用另一种方式合并
extend_my_list += (6, 7)
print(extend_my_list)  # [1, 2, 3, 4, 5, 6, 7]

# 使用extend()函数进行合并

extend_my_list.extend((7, 8))
print(extend_my_list)  # [1, 2, 3, 4, 5, 6, 7, 7, 8]

由源代码片段可知:

class MutableSequence(Sequence):

    __slots__ = ()

    """All the operations on a read-write sequence.

    Concrete subclasses must provide __new__ or __init__,
    __getitem__, __setitem__, __delitem__, __len__, and insert().

    """
    # extend()方法内部使用for循环来append()元素,它接收一个可迭代序列
    def extend(self, values):
        'S.extend(iterable) -- extend sequence by appending elements from the iterable'
        for v in values:
            self.append(v)
    # 调用 += 运算的时候就是调用该函数,这个函数内部调用extend()方法
    def __iadd__(self, values):
        self.extend(values)
        return self​

python列表推导式

列表生成式要比操作列表效率高很多,但是列表生成式的滥用会导致代码可读性降低,并且列表生成式可以替换map()和reduce()函数。

# 构建列表
my_list = [x for x in range(9)]
print(my_list)   # [0, 1, 2, 3, 4, 5, 6, 7, 8]
# 构建0-8中为偶数的列表
my_list = [x for x in range(9) if(x%2==0)]
print(my_list)   # [0, 2, 4, 6, 8]
# 构建0-8为奇数的列表,并将每个数字做平方运算
def function(number):
    return number * number
my_list = [function(x) for x in range(9) if x%2!=0]
print(my_list)   # [1, 9, 25, 49]

生成器表达式
生成器表达式就是把列表表达式的中括号变成小括号。

# 构造一个生成器
gen = (i for i in range(9))
# 生成器可以被遍历
for i in gen:
    print(i)

生成器可以使用list()函数转换为列表:

# 将生成器转换为列表
li = list(gen)
print(li)
字典推导式
d = {
    'tom': 18,
    'alice': 16,
    'bob': 20,
}
dict = {key: value for key, value in d.items()}
print(dict)  # {'tom': 18, 'alice': 16, 'bob': 20}

Set集合推导式

my_set = {i for i in range(9)}
print(my_set)   # {0, 1, 2, 3, 4, 5, 6, 7, 8}

python上下文管理器with语句与contextlib简化

上下文管理器with语句与contextlib简化
普通的异常捕获机制:

try:
    pass
except Exception as err:
    pass
else:
    pass
finally:
    pass

with简化了异常捕获写法:

class Demo(object):

    def __enter__(self):
        print("enter...")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("exit...")

    def echo_hello(self):
        print("Hello, Hello...")

with Demo() as d:
    d.echo_hello()

# enter...
# Hello, Hello...
# exit...
import contextlib

# 使用装饰器
@contextlib.contextmanager
def file_open(file_name):
    # 此处写__enter___函数中定义的代码
    print("enter function code...")
    yield {}
    # 此处写__exit__函数中定义的代码
    print("exit function code...")

with file_open("json.json") as f:
    pass

# enter function code...
# exit function code...​
上一篇下一篇

猜你喜欢

热点阅读