目录
定一个函数
函数,就是把重复的代码单独的分离出来,放在⼀个公共的地⽅,以后可以⼀直的进⾏调⽤,这样就可以解决多次重复来编写Python编程语⾔,它也是函数式的编程语⾔
定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None
调用函数,请使用函数名称后跟括号;
def my_function(fname):
"函数_文档字符串"
print(fname + " Gates")
#调用函数
my_function("Bill")
my_function("Steve")
my_function("Elon")
Rory John Gates
Jennifer Katharine Gates
Phoebe Adele Gates
参数
信息可以作为参数传递给函数。
参数在函数名后的括号内指定。您可以根据需要添加任意数量的参数,只需用逗号分隔即可。
下面的例子有一个带参数(fname)的函数。当调用此函数时,我们传递一个名字,在函数内部使用它来打印全名
def my_function(fname):
print(fname + " Gates")
my_function("Rory John")
my_function("Jennifer Katharine")
my_function("Phoebe Adele")
Rory John Gates
Jennifer Katharine Gates
Phoebe Adele Gates
参数传递
在 python 中,类型属于对象,变量是没有类型的
a=[1,2,3]
a="Runoob"
以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象
可更改和不可更改对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
-
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
-
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
-
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
-
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象
#传不可变对象实例
def ChangeInt(a):
a = 10
b = 2
ChangeInt(b)
print(b) # 结果是 2
#传可变对象实例
mylist = [10, 20, 30]
def changeme(mylist):
"修改传入的列表"
mylist.append([1, 2, 3, 4])
print("函数内取值: ", mylist)
return
# 调用changeme函数
changeme(mylist)
print("函数外取值: ", mylist)
默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值
#可写函数说明
def printinfo( name, age = 35 ):
"打印任何传入的字符串"
print("Name: ", name)
print("Age ", age)
return
#调用printinfo函数
printinfo(age=50, name="miki")
printinfo(name="miki")
关键字参数
可以使用 key = value 语法发送参数。参数的顺序无关紧要
def my_function(child3, child2, child1):
print("The youngest child is " + child3)
my_function(child1 = "Phoebe", child2 = "Jennifer", child3 = "Rory")
def printinfo( name, age ):
"打印任何传入的字符串"
print("Name: ", name)
print("Age ", age)
return
#调用printinfo函数
printinfo( age=50, name="miki" )
动态参数
在⼀个函数中,由于我们在调⽤函数中,实际参数可能是列表的数据类型,也可能是字典的数据类型,还有可能是元组的数据类型,这样我们在定义函数的时候就⽆法指定具体的形式参数,这个时候我们可以使⽤动态参数来解决这个问题,在动态参数中,*args指的是元组的数据类型**kwargs指的是字典的数据类型
def func(*args, **kwargs):
print(args)
print(kwargs)
# 请求参数是元组
func((1, 2, 3))
# 请求参数是列表
func([1, 2, 3])
# 请求参数是字典
func(name='xcj', age=18)
((1, 2, 3),)
{}
([1, 2, 3],)
{}
()
{'name': 'wuya', 'age': 18}
函数动态参数实战
测试的接⼝它的请求参数是不确定的,也就是说有的场景有的请求参数是必须带的,有的场景有的请求参数是不需要带的,但是我们为了覆盖更多的测试场景,这些测试点我们都需要覆盖到,这样的话,我们的解决思路是写多个函数,有动态参数我们可以使⽤动态参数很轻松的编写⼀个函数来解决这个问题。
def func1(**kwargs):
return kwargs, type(kwargs)
print(func1(username='xcj', password='admin', age=18, sex='男'))
print(func1(password='admin', age=18, sex='男'))
print(func1(age=18, sex='男'))
print(func1(sex='男'))
({'username': 'wuya', 'password': 'admin', 'age': 18, 'sex': '男'}, <class 'dict'>)
({'password': 'admin', 'age': 18, 'sex': '男'}, <class 'dict'>)
({'age': 18, 'sex': '男'}, <class 'dict'>)
({'sex': '男'}, <class 'dict'>)
return 语句
⼀个函数,不管是否写return的关键字,函数都是有它的返回值的,如果在定义的函数⾥⾯没有写return的关键字,那么函数的返回值为None,如果写了,函数的返回值就是return后⾯的内容。同时需要说明的是⼀个函数,可以有N个返回值。函数的返回值,它最⼤的价值就是给另外的函数或者是⽅法提供请求的参数⽽已,也就是API测试中需要解决的上⼀个测试⽤例的输出是下⼀个测试⽤例的输⼊
def login(username='xcj', password='admin'):
if username == 'xcj' and password == 'admin':
return 'sdfdrfjyu'
else:
return False
def profile(token='sdfdrfjyu'):
if token == 'sdfdrfjyu':
print('欢迎来到⽆涯课堂')
else:
print('sorry')
if __name__ == '__main__':
profile(login())
全局&局部变量
优先级
在函数⾥⾯定义的变量是局部变量,⽽在程序开始定义的变量是全局变量,全局变量是作⽤域是整个函数,⽽局部变量的作⽤域仅仅是函数⽽已,当全部变量与局部变量的名字是⼀样的时候,在函数内部,局部变量是第⼀优先级,⽽函数外,全局变量是第⼀优先级
name = '⽆涯课堂'
def func():
name = '⽆涯课堂,让测试更简单!'
print(name)
if __name__ == '__main__':
print(name)
func()
⽆涯课堂
⽆涯课堂,让测试更简单!
Global关键字
如果想在函数内部调⽤全部变量,我们就使⽤关键字global申明全局变量
name='⽆涯课堂'
def func():
global name
print(name)
if __name__ == '__main__':
func()
匿名函数
lambda是匿名函数
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print("相加后的值为 : ", sum( 10, 20 ))
print("相加后的值为 : ", sum( 20, 20 ))