zoukankan      html  css  js  c++  java
  • cookbook学习第一弹

    1.1现在有一个包含N个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给N个变量

    代码:

    >>>p = (4,5)

    >>>x,y = p

    >>>x

    4

    >>>y

    5

    >>>data = ['ACME',50,91.1,(2012,12,21)]

    >>>name,shares,price,data = data

    >>>name

    'ACME'

    >>>data

    (2012,12,21)

    >>>name,shares,price,(year,mon,day) = data

    >>>name

    'ACME'

    >>>year

    2012

    如果变量个数和序列元素的个数不匹配,会产生一个异常。实际上,解压赋值可以用在任何可迭代对象上面,而不仅仅是列表或者元组。包括字符串,文件对象,迭代器和生成器

    有时候, 如果只想解压一部分,丢弃其他部分,可以用任意变量去占位,到时候丢掉这些变量就行了

    代码:

    >>>data = ['ACME',50,91.1,(2012,12,21)]

    >>>_,shares,price,_ = data

    >>>shares

    50

    1.2如果一个可迭代对象的元素个数超过变量个数时,回抛出一个ValueError。那么怎样才能从这个可迭代对象中解压出N个元素出来?

    代码:

    def drop_first_last(grades):

      first,*middle,last = grades

      return avg(middle)

    也可以把*号放在最后一个位置,最后一定得到的是一个列表

    代码:

    >>>record = ('Dave','dave@example.com','773-555-1212','847-555-1212')

    >>>name,email,*phone_numbers = record

    >>>name

    'Dave'

    >>>phone_numbers

    ['773-555-1212','847-555-1212']

    也可以把*放在最前面

    代码:

    *trailing_qtrs,current_qtr = sales_record

    trailing_avg = sum(trailing_qtrs)/len(trailing_qtrs)

    return avg_comparison(trailing_avg,current_qtr)

    1.3在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录

    代码:

    from collections iport deque

    def search(lines,pattern,history=5):

      previous_lines = deque(maxlen=history)

      for li in lines:

        if pattern in li:

          yield li,previous_lines

        previous_lines.append(li)

    if __name__ == '__main__':

      with open(r'../../cookbook/somefile.txt')as f:

        for line,prevlines in search(f,'python',5):

          for pline in prevlines:

            print(pline,end='')

          print(line,end='')

          print('_'*20)

    代码讲解:

    首先是deque,使用deque(maxlen=N)构造函数回新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉,如果没有指定大小,默认就是无限大

    代码示例:

    >>>q = deque(maxlen=3)

    >>>q.append(1)

    >>>q.append(2)

    >>>q.append(3)

    >>>q

    deque([1,2,3],maxlen=3)

    >>>q.append(4)

    >>>q

    deque([2,3,4],maxlen=3)

    >>>q=deque()

    >>>q.append(1)

    >>>q.append(2)

    >>>q.append(3)

    >>>q

    deque([1,2,3])

    >>>q.appendleft(4)

    >>>q

    deque([4,1,2,3])

    >>>q.pop()

    3

    >>>q.popleft()

    4

    生成器yield的用法讲解

    def fab(max): 
        n, a, b = 0, 0, 1 
        while n < max: 
            yield b 
            # print b 
            a, b = b, a + b 
            n = n + 1 
    
    '''

    仅仅把 print b 改为了 yield b,就在保持简洁性的同时获得了 iterable 的效果。

     >>> for n in fab(5): 
     ...     print n 
     ... 
     1 
     1 
     2 
     3 
     5

    简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

    1.4、怎样从一个集合中获得最大或者最小的N个元素列表

    heapq模块有两个函数:nlargest和nsmallest()可以解决

    代码:

    import heapq

    nums = [1,8,2,23,7,-4,18,23,42,37,2]

    print(heapq.nlargest(3,nums))

    print(heapq.lsmallest(3,nums))

    两个函数都能接受一个关键字参数,用于更复杂的数据结构中:

    代码:

    portfolio = [

    {'name':'IBM','shares':100,'price':91.1},

    {'name': 'AAPL', 'shares': 50, 'price': 543.22},

    {'name': 'FB', 'shares': 200, 'price': 21.09},

    {'name': 'HPQ', 'shares': 35, 'price': 31.75},

    {'name': 'YHOO', 'shares': 45, 'price': 16.35},

    {'name': 'ACME', 'shares': 75, 'price': 115.65}

    ]

    cheap = heapq.nsmallest(3,portfolio,key=lambda s:s['price'])

    expensive = heapq.nlargest(3,portfolio,key=lambda s:s['price'])

    heapq的排序函数heapify

    >>>nums = [1,8,2,23,7,-4,18,23,42,37,2]

    >>>import heapq

    >>>heapq.heapify(nums)

    >>>nums

    [-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]

    >>>heapq.heappop(nums)

    -4

    如果是查找唯一的最大或者最小的话,可以直接使用min()和max()

    如果N接近集合的大小的话,可以直接用sorted先排序再取sorted(items)[:N]或者sorted(items)[_N:]

  • 相关阅读:
    关于requests.exceptions.SSLError: HTTPSConnectionPool(host='XXX', port=443)问题
    python Requests库总结
    fiddler实现手机抓包及手机安装证书报错“无法安装该证书 因为无法读取该证书文件”解决方法
    django接口的工作原理
    postman+newman+jenkins 持续集成搭建及使用,实现接口自动化
    Jmeter之JDBC Request及参数化
    selenium+Python中的面试总结
    UI自动化测试:页面截图的3种方法
    selenium中通过location和size定位元素坐标
    Allure+pytest生成测试报告
  • 原文地址:https://www.cnblogs.com/yingqml/p/6180054.html
Copyright © 2011-2022 走看看