函数详解(自动化运维-4)
一、函数的基本语法和特性
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
语法定义
def hanshu(): #  def 定义函数,后面跟函数名
    print("第一个函数")
hanshu() #调用函数
def hanshu():
     return  8  # 函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回
     print("第一个函数")
def hanshu():
     pass  # 什么也不做,确保函数执行时不报错
函数的返回值
函数可以返回 数字,字符串,列表,字典等值,如何返回多个值,实际上是返回一个元组,元组里面封装了多个值
def wpic():
    print("Does bushaoxun work on wpic?") #此处打印是给用户看的
    return "yes"  #返回值是给程序员用的,用于进行逻辑判断和传值
print(wpic())
#执行结果
Does bushaoxun work on wpic?
yes
#返回多个值,并且赋值给变量
def multivalue():
    print("return many values")
    return "bushaoxun",23,[1,2,3],{"name":"bushaoxun","age":23}
print(multivalue())
x,y,z,a = multivalue() # 元组赋值给变量
print(x,y,z,a)
#执行结果
return many values
('bushaoxun', 23, [1, 2, 3], {'name': 'bushaoxun', 'age': 23}) # 返回元组
return many values
bushaoxun 23 [1, 2, 3] {'name': 'bushaoxun', 'age': 23}
二、函数参数详解
位置参数
def add(x,y):  # x,y 形式参数
    print(x+y)
add(1,2)  #传值时,实参与形参一一对应
#执行结果
3
默认参数
def wpic(name,age,sex="male"):
    print(name)
    print(age)
    print(sex)
wpic("bushaoxun",32) # 不传值就用默认的
wpic("shaoxun",33,"男") # 传值就用新的值
#执行结果 
bushaoxun
32
male
shaoxun
33
男
关键字参数
关键字参数是赋值操作,即形参=实参。关键字参数一定要写在位置参数之后
def wpic(name,age,sex="male"):
    print(name)
    print(age)
    print(sex)
wpic("shaoxun",sex="男",age=33)  #关键字参数可以不按照顺序赋值
#执行结果
shaoxun
33
男
参数组
*args ,可以接受多个可变参数
def test(*args):
    print(args)  # args接受的是元组
test(1,2,367,94,56)
#执行结果
(1, 2, 367, 94, 56)  # 执行结果,传入的可变参数转换为元组
a = [1,23,34,4,5]
def test(*args):
    print(args)
test(*a) # *a 表示把 a 这个列表作为可变参数传进去
#执行结果
(1, 23, 34, 4, 5)
**kwargs,可接受多个关键字参数,在函数内部转换为字典
def test(**kwargs):
    print(kwargs)    #函数内部转换为字典
test(name="bushaoxun",age=32) #传入多个关键字参数
#执行结果
{'name': 'bushaoxun', 'age': 32}
a = {"name":"bushaoxun","age":23}
def test(**kwargs):
    print(kwargs)
test(**a)  # **a 表示把 a 这个字典作为关键字参数传进去
# 执行结果
{'name': 'bushaoxun', 'age': 23}
函数参数书写规范
- 参数定义的顺序必须是:位置参数、默认参数、可变参数(*.args)、命名关键字参数(必须指定关键字,* 开头)和关键字参数(**kwargs)。
- 传入参数时,关键字参数一定要在位置参数之后
三、局部变量与全局变量
- 在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。(子程序指的是函数或方法)
- 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
- 当全局变量与局部变量同名时:
- 在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
四、递归函数、高阶函数、嵌套函数、匿名函数
递归函数:一个函数在内部调用自身本身,这个函数就是递归函数。
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
def test(n):
    if str(n).isdigit():
        print(n)
        if int(n/2) == 0:
            return n
        return test(int(n/2))
    else:
        print("参数应该是一个 int 类型")
test(45)
#执行结果
45
22
11
5
2
1
高阶函数:
- 一个函数就可以接收另一个函数作为参数
- 一个函数可以返回一个函数
def add(x,y):
    print(x+y)
def test(x,y,z):
    z(x,y)
test(2,4,add) # 一个函数接受另一个函数为参数,函数即变量
#执行结果
6
def add(x,y):
    print(x+y)
print(add)
def test(x,y,z):
    z(x,y)
    return z
print(test(2,4,add)) # 执行完后返回 z 这个函数名,也就是内存地址,函数体的门牌号
#执行结果
<function add at 0x0000021E8A1C3E18>
6
<function add at 0x0000021E8A1C3E18>
嵌套函数:
在一个函数中定义了另外一个函数
def test():
    name = "bushaoxun"
    print("第一个函数")
    def test1():
        print(name)
    test1() #必须在第一个函数内调用,负责外部无法调用此函数
test()
#执行结果
第一个函数
bushaoxun
匿名函数
匿名函数就是不需要显式的指定函数名,可以通过变量赋值的方式指定函数名
lambda n:n*n # n 是传入的参数, n**n 是要 return 返回的值
a = lambda n:n*n
print(a(24))
#执行结果
576
# 结合其他函数使用匿名函数
a = lambda n:n*n
print(a(24))
result = map(a,list(range(5))) # python 3 中 map() 函数返回迭代器
print(result)
for i in result:
    print(i)
#执行结果
576
<map object at 0x0000020DAD0EC128>  #迭代器
0
1
4
9
16
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号