目录
本文主要介绍python函数的定义和调用、函数的参数、函数的作用域、内置函数。
对特定的一些功能进行封装,提高代码的重用率,进而提升开发的效率,格式:
nginx
- def 函数名()
- # 函数体
1)可以由字母、数字及下划线(_)组成,但不能用数字开头,且不能使用python中的关键字。
2)函数命名的风格: 单词之间下划线隔开(python中函数命名推荐这种风格), 大驼峰小驼峰写法 ,如:UserName、userName英文单词首字母大写。
语法:return 表达式
1)函数的返回值是由return来决定的,return后面写什么,函数的返回值就是什么
2)如果函数中没有return,那么函数的返回值默认为 None
3)return 后面没有任何内容,返回值也是None
4)函数要返回多个数据,可以在return后面,每个数据之间用逗号隔开,调用函数之后接收到的是个元组形式的数据
注意:return的作用除了返回结果外,也可以用于结束函数的运行,只要函数中执行到return,就直接返回内容,跳出函数,return后面的代码就不会执行
函数名(),示例如下:
swift
- def func():
- print('python666')
- return "abc", 4444
- print("99999999999999999999") # 该行不会被执行
-
- res = func()
- print(res)
运行结果:
awk
- C:\software\python\python.exe D:/myworkspace/test/test/test.py
- python666
- ('abc', 4444)
-
- Process finished with exit code 0
定义的参数称为:形参
调用实际传递的为:实参
位置参数:按位置顺序进行传递
关键字参数:通过关键字指定传给某个参数
routeros
- # 位置参数(按位置顺序进行传递)
- def add_num(a, b, c): # a,b是形参,没有真正的值,用于接收实参
- return a + b - c
-
- res1 = add_num(67, 12, 1) # 此时传入的67,12是实参
- print(res1)
-
- # 关键字参数(通过关键字指定传给某个参数)
- res2 = add_num(b=34, a=12, c=11)
- print(res2)
-
- # 参数混用时,位置参数写最前面,关键字参数写在后面,不能重复传
- res3 = add_num(30, c=12, b=12)
- print(res3)
运行结果:
awk
- C:\software\python\python.exe D:/myworkspace/test/test/test.py
- 78
- 35
- 30
-
- Process finished with exit code 0
routeros
- def test(a, b, c, *args, **kwargs):
- print("a的值", a)
- print("b的值", b)
- print("c的值", c)
- print("*args的值", args)
- print("**kwargs的值", kwargs)
-
- va1 = test(11, 22, 33, 4, 3, 2)
- va2 = test(11, 5, 6, 7, g=33, k=22, f=12)
- print(va1, va2)
运行结果(有None是因为函数中没有返回值,调用了两次函数因此打印了两个None):
awk
- C:\software\python\python.exe D:/myworkspace/test/test/test.py
- a的值 11
- b的值 22
- c的值 33
- *args的值 (4, 3, 2)
- **kwargs的值 {}
- a的值 11
- b的值 5
- c的值 6
- *args的值 (7,)
- **kwargs的值 {'g': 33, 'k': 22, 'f': 12}
- None None
-
- Process finished with exit code 0
扩展:不定长参数可以使用*对元组(列表也可以,但一般不用)进行拆包,**可以对字典进行拆包,拆包原理如下:
apache
- # 拆包
- def func():
- return 11,22,33 # 当返回结果有多个值时,会以元组的形式返回
-
- c1 = func()
- print(c1) # 返回的是一个元组(11,22,33)
-
- a,b,c =func() # 可以通过变量把返回的元组进行拆包,接收对应的值,a接收了11,b接收了22,c接收了33
- print(a,b,c) # 返回对应的元素11,22,33
运行结果:
awk
- C:\software\python\python.exe D:/myworkspace/test/test/test.py
- (11, 22, 33)
- 11 22 33
-
- Process finished with exit code 0
拆包在自动化测试中有很大的作用,如果不理解,可以动手多敲几遍,以下是拆包示例:
routeros
- def func(a, b, c):
- print('这是', a)
- print('这是', b)
- print('这是', c)
-
- # 利用*、**分别对元组、字典拆包:只能用在函数调用时使用
- # 对元组进行拆包
- func(*(1, 2, 3))
-
- print('-------分割线-------')
- tu = (4, 5, 6)
- func(*tu)
-
- print('-------分割线-------')
- # 对字典进行拆包, 注意**kwargs接收的是接收必需参数、默认参数之外的关键字参数
- # 因此字典的键要与函数的形参一致
- dic = {'a': 88, 'b': 90, 'c': 91}
- func(**dic)
运行结果:
awk
- C:\software\python\python.exe D:/myworkspace/test/test/test.py
- 这是 1
- 这是 2
- 这是 3
- -------分割线-------
- 这是 4
- 这是 5
- 这是 6
- -------分割线-------
- 这是 88
- 这是 90
- 这是 91
-
- Process finished with exit code 0
直接定义在py文件(即模块)中的变量,叫全局变量,在该文件中任何地方都可以使用
在函数内部定义的变量,叫做局部变量,只能在该函数内部使用,函数外部无法使用
关键字:global 在函数内部声明全局变量。
变量的查找过程:由内到外(先找函数自身的,没有再去外面找)。
如果要在外部使用函数内部定义的局部变量,需要声明该变量,简单来说就是告诉程序,这个变量在这个模块内都能使用。
python
- name = "张三" # 定义一个全局变量
-
- def func():
- # global a # 如果要声明全局变量,要加上这句
- a = 100 # 定义一个局部变量
- print(a)
- print(name)
-
- func() # 调用函数
- print("------分割线-----")
- print(name) # 全局变量哪里都能使用
- print(a) # 这是一个局部变量,打印a运行会报错说a没有被定义,如果要使用a就要声明a为全局变量
-
- print("------分割线-----")
- aa = 10
- def func():
- print(aa) # 变量的查找过程:由内到外(先找自身的,没有再去外面找)
- func()
运行结果(因为报错了,所以后面的aa没有打印出来,只要声明全局变量就不会报错):
awk
- C:\software\python\python.exe D:/myworkspace/test/test/test.py
- 100
- 张三
- ------分割线-----
- 张三
- Traceback (most recent call last):
- File "D:/myworkspace/test/test/test.py", line 12, in <module>
- print(a) # 这是一个局部变量,打印a运行会报错说a没有被定义,如果要使用a就要声明a为全局变量
- NameError: name 'a' is not defined
-
- Process finished with exit code 1
内置函数就是python编程语言中预先已经定义的函数,直接调用即可,常用的内置函数如下: