Python接口自动化测试框架(基础篇)–函数与内置函数

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

前言

函数在前面的基础部分频繁出现,更有多次演示,多是数据类型的相关函数或是python内建函数(不需要自己定义的);这章会重点讲自己怎么写函数,即自定义函数。

image.png

函数

一个问题,什么是函数?

函数是有组织、有目的,可重复使用的,即提高代码复用率的功能代码块;关键字是def 函数名(如果有参数): Pass

image.png

自定义函数


def hello():
    print("Hello World!")

hello() # 调用函数,输出内容会打印在控制台:Hello World!

print(hello())  
# 会输出print的内容到控制台,同时还有一个None
复制代码
  • 思考一下,为啥print(函数())会有一个None?

参数传递

这里先简单介绍一下参数有哪些名词:形参、实参、默认参数、不定长参数、关键字参数、必须参数,位置参数

  • 形参:就是在定义函数时的参数,如:def func(a): pass那么a就是形式参数
  • 必须参数:延续上面的例子,如果调用函数func()不传参数就会报错,这时a就是必须参数
  • 实参:既然不传参数会报错,那么就给个参数:func(1),这时1就是实际传入func的参数,实参
  • 位置参数: 意思是调用函数时指定参数并传值,这样参数就跟定义函数时的位置没有关系了
def func(a,b):
    return a+b

print(func(b=2,a=1)) # 输出:3

# 如果不使用位置参数指定入参,那么a和b的值就会不一样。
print(func(2,1)) # 这时函数内部,a=2,b=1
复制代码
  • 默认参数:很好理解,就是定义函数时带参数,并且给参数一个值,那么在调用时可以选择不传参也不会报错
  • 不定长参数:又叫动态参数/可变参数;用于不知道函数具体要传多少参数及参数类型,一般有两种使用方式*argsb表示和**kwargs

def func(a,b,c=None,*args,**kwargs):
    print("第一个参数a:"+a)
    print("第二个参数b:"+b)
    print("第三个参数c:"+c)
    print("第四个参数args:"+args)
    print("第五个参数kwargs:"+kwargs)
    pass
    
func(a=1,c=3,b=2,*("a","v","c"),key="value1",k="value2")
复制代码

变量

  • 什么是变量?
在于变。即在程序运行过程中可能发生变化的量;如:a初始为0,随着程序运行最终a变成了1或非0的值,那么a就是变量;注意:a在使用中才会创建的变量,即给它分配内存空间。
复制代码
  • 既然说到变量,就不得不说一下局部变量跟全局变量
# 局部变量为当前代码块或循环中的变量,它不能被它以外的事务请求

>>> def func():
...     a=1
...     b=2
...     return a+b
...
>>> func()
3
>>> print(a)  
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

# 当输入a变量时,则会报错,提示a没有被定义
复制代码
    • 全局变量
# 相反,定义在代码块以外的变量称之为全局变量,它可以在当前py模块中任意位置调用,但是不能在它未被申明之前

>>> a = 1
>>> def func(a):
...     a = a+1
...     return a
...
>>> func(a)
2
>>> print(a)  # 函数内的a是变了,但是外面的a没有变
1
复制代码
  • global关键字,定义全局变量
# 如下这种情况,a不是全局变量,因为func()函数用的不是外面的a
>>> a = 1
>>> def func():
...     a = 2
...     return a
...
>>> func()
2
>>> print(a)
1
复制代码
    • 使用关键字global使func函数内的a成为全局变量,那么它在外面调用就应该是func所改变的a
>>> a = 1
>>> def func():
...     global a
...     a = 2
...     return a
...
>>> func()
2
>>> print(a)
2
复制代码

内置函数

不需要引用也不需要定义就能直接使用的函数,这里特别介绍几个常用的内置函数

  • 常用数据类型就是最基础的内置函数:str()、dict()、list()、bool()等等
  • eval() # 执行字符串的表达式,并返回它的结果
>>> eval("5*3")
15
复制代码
  • input()和print() # 输入输出
  • range() # 一般与for循环搭配使用,创建list或遍历
  • type() # 获取变量或数据的数据类型
  • isinstance() # 判断数据类型,返回结果为True或者False
  • enumerate() # 将可遍历的数据类型组合为一个索引序列
>>> list(enumerate(("a","b","c")))
[(0, 'a'), (1, 'b'), (2, 'c')]
复制代码
  • id() # 获取变量在内存中的地址
  • open() # 用于文件IO操作
  • sum() # 求和
  • len() # 求序列数据类型的长度
  • min()和max() # 最大或最小值,
  • all()和any() # 可迭代参数,判断元素中不能有0或空字符或None元素的数据;但是空列表却是True
>>> a = 1
>>> b = 0
>>> all([a,b])
False
>>> all([a])
True
复制代码
  • round() # 数值求整数

扩展

匿名函数

  • lambda,它是一个表达式,比def定义的函数体要简单的多;所以它本身只能是一行代码表示,且逻辑有限,返回的的是:冒号后面的结果
>>> create_list = lambda x:[i for i in range(x)]
>>> create_list(4)
[0, 1, 2, 3]
>>>
>>> sum_x = lambda a,b:a+b
>>> sum_x(3,5)
8
复制代码

return和yield

  • return 每个def定义的函数,都有一个默认的return,后面没有东西,print它是个None
# 对比一下两个函数
>>> def func():
...     print(1)
...
>>> func()
1
>>> print(func())
1
None
>>> 
>>> 
>>> def func():
...     print("输出1")
...     return "修改了默认输出"
...
>>> print(func())
输出1
修改了默认输出
复制代码
  • yield在python是个特殊用法,函数使用了yield就叫生成器;比较特别,它会在第一个使用它并且记住它,到第二次使用时就进入下一个值,可以说是迭代器
# 引入runoob.com的代码示例:

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()
        
# yield实现斐波那契数列:
# 输出:0 1 1 2 3 5 8 13 21 34 55
复制代码