函数详解(自动化运维-4)

一、函数的基本语法和特性

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 

特性:

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

语法定义

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}

 函数参数书写规范

  1. 参数定义的顺序必须是:位置参数、默认参数、可变参数(*.args)、命名关键字参数(必须指定关键字,* 开头)和关键字参数(**kwargs)。
  2. 传入参数时,关键字参数一定要在位置参数之后

三、局部变量与全局变量

  1. 在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。(子程序指的是函数或方法)
  2. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
  3. 当全局变量与局部变量同名时:
  4. 在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

四、递归函数、高阶函数、嵌套函数、匿名函数

递归函数:一个函数在内部调用自身本身,这个函数就是递归函数。

递归特性:

    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

高阶函数:

  1. 一个函数就可以接收另一个函数作为参数
  2. 一个函数可以返回一个函数
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

 

posted @ 2018-03-26 17:49  步绍训  阅读(148)  评论(0)    收藏  举报