美文网首页
python 高级特性

python 高级特性

作者: 倔强的潇洒小姐 | 来源:发表于2019-01-04 22:41 被阅读13次

    1行代码能实现的功能,决不写5行代码,代码越少,效率越高

    一、切片(含头不含尾)

    作用:可以实现很多行循环才能完成的操作

    L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
    
    # 取前三
    print(L[0:3])  # [1, 2, 3]
    print(L[:3])   # [1, 2, 3]
    # 第2个开始,不含第5个
    print(L[2:5])  # [3, 4, 5]
    # 倒数第4个到最后
    print(L[-4:])  # [7, 8, 9, 0]
    # 前7位数,每隔2位取一个
    print(L[:7:2])  # [1, 3, 5, 7]
    # 复制
    print(L[:])
    

    练习题:实现一个trim()函数,去除字符串首尾的空格

    def trimbegin(s):
        for i in range(length):
            if s[i] == ' ':
                i += 1
            else:
                return s[i:]
    
    
    def trimend(s):
        length = len(trimbegin(s))   # 去除前空格后需要重新计算length
        for j in range(length):
            if s[length-1-j] == ' ':
                j += 1
            else:
                return s[:length-j]
    
    
    def trim(s):
        s2 = trimbegin(s)
        s3 = trimend(s2)
        return s3
    
    
    if __name__ == '__main__':
        s = input('请输入字符串:')
        s1 = trim(s)
        print('去除字符串首尾空格后为:', s1)
    

    补充:

    • strip()函数 :仅去除前后空格
    • re.sub()函数: 前中后空格都会去除, 格式:re.sub(‘ ’, '', str)
    经验总结

    (1)牢牢记住公式[i : i+n : m],当出现缺省值时,通过想象把公式补全;
    (2)索引为负且步长为正时,按倒数计算索引位置;索引为负且步长为负时,先翻转列表,再按倒数计算索引位置。

    二、迭代(遍历)

    只要是可迭代对象,无论有无下标,都可以迭代

    d = {'a': 1, 'b': 2, 'c': 3}
    
    for key in d:   # 迭代key
        print(key)
    
    for value in d.values():   # 迭代value值
        print(value)
    
    for key, value in d.items():  # 迭代key和value
        print(key, value)
    

    判断一个对象是否是可迭代对象:通过collections模块的Iterable类型判断

    print(isinstance('abc', Iterable))  # 字符串 True
    print(isinstance(2132, Iterable))   # 整数 False
    print(isinstance((1, 2, 3), Iterable))  # 元组 True
    print(isinstance({'1': 1, '2': 2, '3': 3}, Iterable))  # 字典 True
    print(isinstance([1, 2, 3], Iterable))  # 列表 True
    print(isinstance(([1, 2, 43, 2, 1]), Iterable))   # 集合 True
    
    enumerate :可以把一个list变成索引-元素对

    enumerate adds an index or position value to each item in the list starting at 0.

    利用它可以同时获得索引和值

    list_test = ["办", "公", "室", "好", "热", "啊"]
    for index, item in enumerate(list_test, 3):
        print(index, item)
    
    image.png

    enumerate() takes at most 2 arguments,可以指定索引值,默认为0

    image.png

    练习题:使用迭代查找一个list中最小和最大值,并返回一个tuple

    def findMinAndMax(L):
        max1 = min1 = L[0]
        for x in L:
            if max1 < x:
                max1 = x
        for y in L:
            if min1 > y:
                min1 = y
        return min1, max1
    
    
    if __name__ == '__main__':
        L = [11, 2, 35, 4, 5, 6, 7, 28, 19]
        a = findMinAndMax(L)
        print(a)
    

    三、列表生成式

    Python内置的非常简单却强大的可以用来创建list的生成式(可以快速生成list,也可以通过一个list推导出另一个list)

    练习:求10以内偶数的平方

    a = [x * x for x in range(10) if x % 2 == 0]     # [0, 4, 16, 36, 64]
    

    如果list中既包含字符串,又包含整数,通过添加if语句保证列表生成式能正确地执行

    L1 = ['Hello', 'World', 18, 'Apple', None]
    L2 = [s.lower() for s in L1 if isinstance(s, str)]
    print(L2)
    if L2 == ['hello', 'world', 'apple']:
        print('测试通过')
    else:
        print('测试失败')   
    

    四、生成器:一边循环一边计算

    工作原理可以理解为在 for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。
    对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束

    1、把一个列表生成式的 [] 改成 (),就创建了一个generator
    输出generator的每一个元素,用next()函数,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误

    L = (x * x for x in range(10))
    print(L)    # <generator object <genexpr> at 0x000001CD581CC7D8>
    print(next(L))   # 0
    print(next(L))   # 1
    print(next(L))   # 4
    print(next(L))   # 9
    ....
    print(next(L))   # StopIteration
    

    2、函数中使用yield

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n += 1
        return 'done'
    
    
    if __name__ == '__main__':
        x = fib(10)
        print(x)      # <generator object fib at 0x0000019618EA01A8>
    

    五、迭代器

    1、可以表示一个无限大的数据流
    2、可以被 next() 调用并不断返回下一个值的对象

    判断方法:使用 isinstance(),使用 iter() 将Iterable变成Iterator

    from collections import Iterator
    
    print(isinstance((x for x in range(10)), Iterator))   # True
    print(isinstance([], Iterator))   # list,False
    print(isinstance({}, Iterator))   # dict,False
    print(isinstance('abc', Iterator))   # str,False
    print(isinstance(iter([]), Iterator))   # True
    print(isinstance(iter({}), Iterator))   # True
    print(isinstance(iter('abc'), Iterator))   # True   
    

    相关文章

      网友评论

          本文标题:python 高级特性

          本文链接:https://www.haomeiwen.com/subject/hmwikqtx.html