在编写自动化用例代码时老是会写很多函数,对函数的参数理解的很混乱,在这里我对函数的用法进行一个简单的总结和整理
函数定义
def 函数名(形参1,形参2,...):
代码
#如果有必要返回一个结果给调用者就需要加上return 返回值,没必要就不用加返回值
return 返回值
函数调用
函数名(实参1,实参2,...)
根据函数是否带参数,分为无参函数和带参函数。
1.无参函数
不会对一些实参(变量,常量,表达式,函数等)进行操作,无参函数没有形参,调用函数没有实参。
例1:定义一个函数,函数功能:打印hello。调用这个函数。
#定义函数
def print_hello():
print ('hello')
#调用函数
print_hello()
例2:定义一个函数,打开chrome浏览器无痕模式,并访问百度。调用这个函数。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
#定义函数
def open_baidu():
options = webdriver.ChromeOptions()
# 无痕模式
options.add_argument('--incognito')
# 启动chrome浏览器无痕模式
driver = webdriver.Chrome(chrome_options=options)
# 打开百度
driver.get("http://www.baidu.com")
#调用函数
open_baidu()
从上面两个栗子可以看出:如果不需要对任何的参数(变量,常量,表达式,函数等)进行操作,就不需要定义函数时加上形参。
2.带参函数
当需要对一些实参(可以是变量,常量,表达式,函数等)进行一些操作时,就需要对函数定义形参和调用时传入对应的实参。
实参类型包括:位置实参,关键字实参
形参类型包括:默认参数,可变参数,关键字参数
2.1实参类型
2.1.1 位置实参:要求实参的顺序与形参的顺序相同
注意:位置参数位置和个数必须对应(实参多少个形参就多少个)。
举个栗子:打印名字和成绩
def print_info(name,score):
print name
print score
print_info('jack',100)
jack
100
ps:有时候工作中会疑惑,在python中实参和形参是否名字能够相同?
然后我就试了一下:把实参赋给一个变量,变量名与形参名一样,运行后与上面一样。
name='jack'
score=100
def print_info(name,score):
print name
print score
print_info(name,score)
结果运行结果一样:
jack
100
2.1.2 关键字实参:关键字实参是传递给函数的名称—值对。直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。
作用:让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途,所以在传入时无需考虑顺序。
举个栗子:(这个例子实参位置没有对应形参位置)
def print_info(name,score):
print name
print score
#这里实参位置没有对应形参位置
print_info(score=100,name='jack')
结果运行正常
jack
100
2.2形参类型
2.2.1.默认参数
举个栗子:计算X的n次方,计算三个值(2,3,4)的平方,计算5的三次方。
#计算x的n次方并返回打印结果
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return print(s)
power(2)
power(3)
power(4)
power(5,3)
结果:
4
9
16
125
由上面的例子可以得出:
当设置了默认参数后,实参需要传入的值与默认参数一样时就不需要对应的实参(即:计算2,3,4的平方时不需要传入第二个实参 2,当需要计算5的3次方时就需要传入第二个实参)
注意:必选参数在前,默认参数在后(例子中:x在前,n在后)。(否则Python的解释器会报错)。当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
2.2.2 可变参数
顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
当传入的参数个数不确定时,就需在形参前加 * 来表示可变参数
举个例子:计算输入的实参总和
#计算实参总和
def Plus(*numbers):
sum = 0
for n in numbers:
sum = sum + n
print(sum)
Plus(1,2,3)
#传入参数可以是0个
Plus()
运行结果:
6
0
ps:在函数内部,参数numbers
接收到的是一个tuple
如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:
def Plus(*numbers):
sum = 0
for n in numbers:
sum = sum + n
print(sum)
#已经有一个list
num=[1,2,3,4,5]
#在实参前加*
Plus(*num)
Plus()
*num
表示把num
这个list的所有元素作为可变参数传进去。
运行结果:
15
0
2.2.3关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。上面的关键字实参是传入时无需考虑顺序,而这里的关键字参数是可以传入任意个数的关键字参数。函数的调用者可以传入任意不受限制的关键字参数(参数的key和value都是自己定义的)。
这里的关键字实参和上面的区别是什么?这个关键字参数是对形参操作的哈。
当传入的参数为可变关键词参数时,就需在形参前加 ** 来表示可变参数
举个栗子:
#name和age 为必选参数,**kw为可选参数
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
#可以在name和age后面添加任意个数的实参
person('jack',20,city='chengdu',hobby='draw')
结果:
name: jack age: 20 other: {'city': 'chengdu', 'hobby': 'draw'}
和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去:
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
others_info= {'city': 'chengdu', 'hobby': 'draw'}
person('jack',20,**others_info)
结果一样:
name: jack age: 20 other: {'city': 'chengdu', 'hobby': 'draw'}
关于返回值
顾名思义:函数返回的值被称为返回值。(听君一席话,如听一席话)
什么时候使用?
如果有必要返回一个结果给调用者就需要加上return 返回值,没必要就不用加返回值
一般来说调用有返回值的函数时,需要提供一个变量,用于存储返回的值。
举个栗子
def print_info(name,score):
return print(name,'的成绩为',score)
info=print_info('jack',100)
jack 的成绩为 100
函数可以返回任何类型的值,包括列表和字典等较为复杂的数据结构
例如:返回一个字典
def print_info(name,score):
person={'name':name,'score':score}
return person
info=print_info('jack',100)
print(info)
运行结果
{'name': 'jack', 'score': 100}
函数也可以返回多个值:
举个栗子:输入半径,计算周长和面积并返回
#!/usr/bin/env python
#coding=utf-8
import math
pi = 3.14159265358979324
#计算周长和面积并返回
def cal(x):
area=pi*x*x
cir =2*pi*x
return area,cir
#调用函数cal,并将结果赋值给result
result=cal(1)
#打印调用结果
print(result)
结果:
(3.141592653589793, 6.283185307179586)
注意:返回多个值的函数的返回值是一个tuple!