Python学习笔记06_高级特性

本文介绍了Python中的序列操作,包括切片、列表生成式及生成器等高级特性,并详细讲解了如何利用这些特性进行高效编程。

切片

  • L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3.
  • 如果第一个索引是0,还可以省略L[:3]
  • L[-2:],表示倒数第二个元素到末尾。L[-2:-1],表示倒数第二个元素到倒数第一个元素,但不包括倒数第一个元素。
  • L[:10:2],前10个数,每两个取一个。
  • L[::5],所有数,每5个取一个。
  • L[:],原样复制一个list。
  • tuple切片,唯一区别是tuple不可变,操作的结果仍是tuple。
    <<< (0,1,2,3,4,5)[:3]
    (0,1,2)
    
  • 字符串也可以看成是一种list,每个元素就是一个字符。
    <<< 'ABCDEFG'[:3]
    'ABC'
    <<< 'ABCDEFG'[::2]
    'ACEG'
    

迭代

  • dict默认迭代key,for key in d,如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k,v in d.items()
  • for循环,可作用于一个可迭代对象。
    <<< from collections import Iterable
    <<< isinstance('abc',Iterable) # str是否可迭代
    True
    <<< isinstance([1,2,3],Iterable) # list是否可迭代
    True
    <<< isinstance(123,Iterable) # 整数是否可迭代
    False
    
  • list的下标循环,Python内置的enumerate函数可以把一个list变成索引-元素对。
    <<< for i, value in enumerate(['A','B','C']):
            print(i,value)
    

列表生成式List Comprehensions

  • 生成list[1,2,3,4,5,6,7,8,9,10]可以用list(range(1,11))

  • 生成[1×1,2×2,3×3,...,10×10]

    <<< L = []
    <<< for x in range(1,11):
            L.append(x * x)
    
    <<< [x * x for x in range(1,11)]
    
  • 生成偶数的平方

    <<< x * x for x in range(1,11) if x % 2 == 0
    
  • 生成全排列

    <<< m + n for m in 'ABC' for n in 'XYZ'
    
  • 列出当前目录下的所有文件和目录名

    <<< import os # 导入os模块
    <<< [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
    
  • 使用两个变量来生成list

    <<< d = {'x':'A', 'y':'B', 'z':'C'}
    <<< [k + '=' + v for k, v in d.items()]
    
    
  • 把一个list中所有的字符串变成小写,如果list中既包含字符串,又包含整数,使用内建的isinstance()函数可以判断一个变量是不是字符串。

    <<< L1 = ['Hello','World',18,'Apple',None]
    <<< L2 = [s.lower() for s in L1 if isinstance(s, str))]
    print(L2)
    

生成器generator

  • 创建简单generator,用生成器

    <<< L = [x * x for x in range(10)] # L是一个list
    <<< g = (x * x for x in range(10)) # g是一个generator
    <<< next(g) # 获得generator的下一个返回值
    <<< for n in g:
            print(n) # generator是可迭代对象
    
  • 创建复杂generator,用函数实现

    # 创建非波拉契数列(Fibonacci)
    def fib(max):
        n, a, b = 0, 0, 1
        while n<max:
            yield b
            a, b = b, a+b
            n = n + 1
        return 'done'
    
    # 拿到generator的rerurn语句的返回值
    <<< g = fib(6)
    <<< while True:
            try:
                x = next(g)
                print('g:', x)
            except StopIteration as e:
                print('Generator return value:', e.value)
                break
    

迭代器

  • 可直接作用于for循环的数据类型:一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。
  • 可直接作用于for循环的对象统称为可迭代对象:Iterable。
    <<< from collection import Iterable
    <<< isinstance([], Iterable)
    True
    <<< isinstance({}, Iterable)
    True
    <<< isinstance('abc', Iterable)
    True
    <<< isinstance((x for x in range(10)), Iterable)
    True
    <<< isinstance(100, Iterable)
    False
    
  • 可以被next()函数调用并不断返回下一个值的对象成为迭代器:Iterator。
    <<< from collections import Iterator
    <<< isinstance((x for x in range(10)), Iterator)
    True
    <<< isinstance([], Iterator)
    False
    <<< isinstance({}, Iterator)
    False
    <<< isinstance('abc', Iterator)
    False
    
  • 生成器都是Iterator对象,但list、dict、str虽然是Iterable对象,却不是Iterator。
  • 把list、dict、str等Iterable变成Iterator可以使用iter()函数。
    <<< isinstance(iter([]), Iterator)
    True
    <<< isinstance(iter('abc'), Iterator)
    True
    
  • Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。Iterator可以表示一个无限大的数据流,如全体自然数,而用list是不可能存储全体自然数。

小结

  • 凡是可作用于for循环的对象都是Iterable类型。

  • 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列。

  • 集合数据类型如list、dict、str等死Iterable但不是Iterator,但可以通过iter()函数获得一个Iterator对象。

  • Python的for循环本质上就是通过不断调用next()函数实现的。

    for x in [1, 2, 3, 4, 5]
        pass
    
    # 首先获得Iterator对象
    it = iter([1, 2, 3, 4, 5])
    # 循环
    while True:
        try:
            # 获得下一个值
            x = next(it)
        except StopIteration:
        # 遇到StopIteration就退出循环
            break
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值