前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >测试开发进阶(三)

测试开发进阶(三)

作者头像
zx钟
发布2019-08-13 15:13:41
5420
发布2019-08-13 15:13:41
举报
文章被收录于专栏:测试游记

生成器的三个方法

  • send()和生成器内部进行数据交互
  • close()关闭生成器
代码语言:javascript
复制
gen = (i for i in range(0, 20, 2))
print(next(gen)) # 0
print(next(gen)) # 2
gen.close()
print(next(gen))
"""
Traceback (most recent call last):
  File "/Users/zhongxin/Desktop/py/zx/03/0809.py", line 5, in <module>
    print(next(gen))
StopIteration
"""
  • throw()触发异常
代码语言:javascript
复制
gen = (i for i in range(0, 20, 2))
gen.throw(NameError, 'name is xxx')
"""
Traceback (most recent call last):
  File "/Users/zhongxin/Desktop/py/zx/03/0809.py", line 2, in <module>
    gen.throw(NameError, 'name is xxx')
  File "/Users/zhongxin/Desktop/py/zx/03/0809.py", line 1, in <genexpr>
    gen = (i for i in range(0, 20, 2))
NameError: name is xxx
"""

函数

递归函数

在函数中调用函数自身,我们把这种函数叫做递归函数 递归边界:递归的终止条件

代码语言:javascript
复制
def func(n):
    print(n)
    func(n - 1)
func(10)
"""
Traceback (most recent call last):
  File "/Users/zhongxin/Desktop/py/zx/03/0809_1.py", line 5, in <module>
    func(10)
  File "/Users/zhongxin/Desktop/py/zx/03/0809_1.py", line 3, in func
    func(n - 1)
  File "/Users/zhongxin/Desktop/py/zx/03/0809_1.py", line 3, in func
    func(n - 1)
  File "/Users/zhongxin/Desktop/py/zx/03/0809_1.py", line 3, in func
    func(n - 1)
  [Previous line repeated 993 more times]
  File "/Users/zhongxin/Desktop/py/zx/03/0809_1.py", line 2, in func
    print(n)
RecursionError: maximum recursion depth exceeded while calling a Python object
"""
def func1(n):
    print(n)
    if n == 1:
        return
    else:
        func(n - 1)
func1(10)
"""
10
9
8
7
6
5
4
3
2
1
"""

实现一个累加函数

  • 6累加的结果 6+5+4+3+2+1
  • 10累加的结果 10+9+8+7+6+5+4+3+2+1
代码语言:javascript
复制
1 1
2 1+2
3 1+2+3
4 1+2+3+4
5 1+2+3+4+5
...
代码语言:javascript
复制
def fun_add(n):
    if n == 1:
        return 1
    return n + fun_add(n - 1)
print(fun_add(6))
查看最大递归次数
代码语言:javascript
复制
import sys
print(sys.getrecursionlimit()) # 默认1000 实际996
sys.setrecursionlimit(3000) # 实际2996
使用装饰器缓存调用

调用同样的参数后,使用缓存,不会重新开辟空间

https://docs.python.org/zh-cn/3/library/functools.html @functools.lru_cache(maxsize=128, typed=False) 一个为函数提供缓存功能的装饰器,缓存 maxsize 组传入参数,在下次以相同参数调用时直接返回上一次的结果。用以节约高开销或I/O函数的调用时间。 由于使用了字典存储缓存,所以该函数的固定参数和关键字参数必须是可哈希的。

一个题目:

爬100个台阶,爬台阶每一步可以上一阶,两阶,或三阶,请问一共有多少种爬法

代码语言:javascript
复制
from functools import lru_cache

@lru_cache(maxsize=128)
def func999(n):
    if n == 1:
        return 1
    elif n == 2:
        return 2
    elif n == 3:
        return 4
    else:
        return func999(n - 1) + func999(n - 2) + func999(n - 3)

print(func999(100)) # 180396380815100901214157639

纯函数

一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用

  • 变量都只在函数作用域内获取
  • 不会产生副作用(side effects),不会改变被传入的数据或其他数据(全局变量)

函数的副作用:

  • 相同的输入保证相同的输出
代码语言:javascript
复制
def func(a, b):
    return a * b + 100
print(func(11, 222))
内置函数
  • map
代码语言:javascript
复制
li = [1, 2, 3, 4, 5, 6, 7]  # 每个元素*1000/2
def fun(n):
    return n * 1000 / 2
res = map(fun, li)
print(res)  # <map object at 0x1033050f0>
print(list(res)) # [500.0, 1000.0, 1500.0, 2000.0, 2500.0, 3000.0, 3500.0]
  • filter 过滤器
代码语言:javascript
复制
def func1(n):
    return n >= 5
res1 = filter(func1,li)
print(res1) # <filter object at 0x103b9f390>
print(list(res1)) # [5, 6, 7]
  • zip 聚合打包

长度不一样,以最短为准

代码语言:javascript
复制
title = ['name', 'age', 'gender']
data = ['zx', 26, '男']
print(list(zip(title,data))) # [('name', 'zx'), ('age', 26), ('gender', '男')]
print(dict(zip(title,data))) # {'name': 'zx', 'age': 26, 'gender': '男'}
num = [1, 2, 3]
print(list(zip(title, data, num))) # [('name', 'zx', 1), ('age', 26, 2), ('gender', '男', 3)]

匿名函数

关键字:lambda

代码语言:javascript
复制
lambda 参数:表达式(返回值)
代码语言:javascript
复制
res = (lambda n: n * 2)(4)
print(res) # 8

偏函数

代码语言:javascript
复制
# 偏函数之前的写法
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list(filter(lambda x:x>5,li))) # [6, 7, 8, 9, 10]
代码语言:javascript
复制
from functools import partial

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
myfilter = partial(filter, lambda x: x > 5)
print(list(myfilter(li))) # [6, 7, 8, 9, 10]

一个简单的例子:

代码语言:javascript
复制
from functools import partial
def func1(a, b, c):
    print(a, b, c)

func1(11, 22, 33)
func1(11, 'bb', 'cc')
func1(11, 'dd', 'ee')

myfilter1 = partial(func1, 11)
myfilter1(22, 33)
myfilter1('bb', 'cc')
myfilter1('dd', 'ee')

myfilter2 = partial(func1, b=22)
myfilter2(a=11, c='cc') # 11 22 cc

myfilter2 = partial(func1, a=11, b=22)
myfilter2(c='cc') # 11 22 cc
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数
    • 递归函数
      • 查看最大递归次数
      • 使用装饰器缓存调用
    • 纯函数
      • 内置函数
    • 匿名函数
      • 偏函数
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档