zoukankan      html  css  js  c++  java
  • Python运维开发之路《函数》

    函数 

      函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

      函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

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

      特性:

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

    定义一个函数

      语法定义:

    1 def sayhi():#函数名
    2     print("Hello, I'm nobody!")
    3  
    4 sayhi() #调用函数

      实例:

    >>> def hello() :
       print("Hello World!")
    
       
    >>> hello()
    Hello World!
    >>> 

      带参数:

    #下面这段代码
    a,b = 5,8
    c = a**b
    print(c)
     
     
    #改成用函数写
    def calc(x,y):
        res = x**y
        return res #返回函数执行结果
     
    c = calc(a,b) #结果赋值给c变量
    print(c)

    函数参数和环境变量

    参数

      默认参数:

      位置参数:

      形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

      实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

      实例图:

      

    默认参数

      定义:调用函数时,如果没有传递参数,则会使用默认参数。

      默认参数必须放到非默认参数(位置参数)的右面;

     1 def sayHi(name,age,nationality='CN'):
     2     print("Hello,I'm %s !"%name,age,nationality)
     3 
     4 sayHi('lain','24')           #默认显示国籍为'CN'
     5 sayHi('liha','22','USA')    #修改默认国籍为'USA'
     6 
     7 
     8 结果:
     9 Hello,I'm lain ! 24 CN
    10 Hello,I'm liha ! 22 USA

    指定参数

      指定参数必须放在位置参数的右面;

    1 def sayHi(name,age,nationality='CN'):
    2     print("Hello,I'm %s !"%name,age,nationality)
    3 
    4 sayHi('lain',nationality='JP',age=24)
    5 sayHi('liha',age=22,nationality='USA')
    6 
    7 运行结果:
    8 Hello,I'm lain ! 24 JP
    9 Hello,I'm liha ! 22 USA

    非固定参数(不定长参数)

      一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名;

      命名规范*args,**kwargs

      元组形式:加一个星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组

     1 def stu_register(name, age, country, course,*heh):
     2     print("----注册学生信息------")
     3     print("姓名:", name)
     4     print("age:", age)
     5     print("国籍:", country)
     6     print("课程:", course)
     7     print("爱好:",*heh)
     8 
     9 
    10 stu_register("张三", 22, "CN", "Python_devops",'妹纸','聊天')
    11 stu_register("李四", 24, "CN", "Linux","玩蛋")
    12 stu_register("王三炮", 25, "CN", "Oracle",'LOL')
    13 
    14 执行结果:
    15 ----注册学生信息------
    16 姓名: 张三
    17 age: 22
    18 国籍: CN
    19 课程: Python_devops
    20 爱好: 妹纸 聊天
    21 ----注册学生信息------
    22 姓名: 李四
    23 age: 24
    24 国籍: CN
    25 课程: Linux
    26 爱好: 玩蛋
    27 ----注册学生信息------
    28 姓名: 王三炮
    29 age: 25
    30 国籍: CN
    31 课程: Oracle
    32 爱好: LOL

      字典形式:加两个星号(**)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空字典

     1 def stu_register(name, age, country, course,*heh,**hah):
     2     print("----注册学生信息------")
     3     print("姓名:", name)
     4     print("age:", age)
     5     print("国籍:", country)
     6     print("课程:", course)
     7     print("爱好:",heh,hah)
     8 
     9 
    10 stu_register("张三", 22, "CN", "Python_devops",'妹纸','聊天',stuid='134123',fee=4000)
    11 stu_register("李四", 24, "CN", "Linux","玩蛋")
    12 stu_register("王三炮", 25, "CN", "Oracle",'LOL')
    13 
    14 执行结果:
    15 ----注册学生信息------
    16 姓名: 张三
    17 age: 22
    18 国籍: CN
    19 课程: Python_devops
    20 爱好: ('妹纸', '聊天') {'stuid': '134123', 'fee': 4000}
    21 ----注册学生信息------
    22 姓名: 李四
    23 age: 24
    24 国籍: CN
    25 课程: Linux
    26 爱好: ('玩蛋',) {}
    27 ----注册学生信息------
    28 姓名: 王三炮
    29 age: 25
    30 国籍: CN
    31 课程: Oracle
    32 爱好: ('LOL',) {}

    递归函数

      定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

      递归特性:

      1. 必须有一个明确的结束条件

      2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

      3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是   无限的,所以,递归调用的次数过多,会导致栈溢出)

     1 data = range(0,1000000)
     2 
     3 def  digui(data,find):
     4     if len(data) > 0:
     5         middle_pos = int(len(data)/2)
     6         if data[middle_pos] == find:
     7             print('find_name:',find)
     8         elif data[middle_pos] < find:
     9             print('33[31;1m 右边的值:%s33[0m',data[middle_pos+1:])
    10             digui(data[middle_pos+1:],find)
    11         else:
    12             print('33[32;1m 左边的值:%s33[0m',data[0:middle_pos])
    13             digui(data[0:middle_pos],find)
    14     else:
    15         print('没有找到!')
    16 
    17 digui(data,451232)

    环境变量

      1.函数外声明的是全局变量,函数内声明的是局部变量;

      2.全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序;

      3.当全局变量与局部变量同名时:

        在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

      4.正常情况下,局部环境变量无法修改全局变量;可以使用global命令:

     1 login_status=True
     2 def login():
     3     #global login_status
     4     login_status=False
     5     if login_status==True:
     6         print('login_status is True')
     7     else:
     8         print('login_status is False')
     9 
    10 login()
    11 print(login_status)
    12 
    13 运行结果:
    14 #注释global
    15 login_status is False
    16 True
    17 #使用global
    18 login_status is False
    19 False

    函数返回值  

      要想获取函数的执行结果,就可以用return语句把结果返回

      注意:

    1. 一旦函数经过调用并开始执行,那函数外部的程序,就无法再控制函数的执行过程,只能等待函数执行结果;所以return语句代表着函数的结束

    2. 如果未在函数中指定return,那这个函数的返回值为None

    匿名函数

      匿名函数lambda就是不需要显式的指定函数

    1 #非匿名函数
    2 def calc(x,y):
    3     runturn x*y
    4 print(calc(3,4))
    5 
    6 #匿名函数
    7 calc = lambda x,y:x*y
    8 print(calc(3,4))

       匿名函数搭配map()方法使用

     1 def calc(n):
     2      return n*n
     3 
     4 data = map(calc,range(10))
     5 
     6  for i in data:
     7     print(i)
     8 
     9 ======================
    10 data = map(lambda n:n*n,range(10))
    11 print(data)
    12 
    13 data = map(lambda n:n*2,range(10))
    14 print(data)
    15 
    16 for i in data:
    17     print(i)
    18 
    19 =======================
    20 data = map(lambda n:n*2 if n>5 else n,range(10))
    21 print(data)
    22 
    23 for i in data:
    24     print(i)

    高阶函数

      变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    1 def add(x,y,f):
    2     return f(x) + f(y)
    3 
    4 res = add(3,-6,abs)
    5 print(res)
    6 
    7 #x,y表示形参
    8 #f表示内置函数abs

    本文来自博客园,作者:白日梦想家Zz,转载请注明原文链接:https://www.cnblogs.com/zzlain/p/6033059.html

  • 相关阅读:
    理解MySQL——索引与优化
    ArrayList vs LinkedList vs Vector
    Java集合框架的接口和类层次关系结构图
    Java集合的10个最常见问题
    Mysql 中的事件//定时任务
    Mysql中的函数
    Mysql中的触发器
    Mysql中的存储过程
    Oracle数据库表的一些宏处理
    Oracle查询和过滤重复数据
  • 原文地址:https://www.cnblogs.com/zzlain/p/6033059.html
Copyright © 2011-2022 走看看