zoukankan      html  css  js  c++  java
  • day3-函数介绍

    一 概述

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

    特性:

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

    二 函数定义

    def test():  #定义函数名
        print("Hello,I'm nobody!")  #代码块或逻辑处理
        return 0  #定义返回值
    

     可以带参数

    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 stu_register(name,age,country,course):
        print("注册学生信息".center(20,'-'))
        print("姓名:", name)
        print("age:", age)
        print("国籍:", country)
        print("课程:", course)
    
    stu_register("liuyang",22,'CN',"python_devops")
    stu_register("liuliu",21,'CN',"linux")
    

    发现country 这个参数 基本都是“CN”,就像我们在网站上注册用户,像国籍这种信息,不填默认就会是中国,这就是通过默认参数实现的。

    把country变成默认参数:

    def stu_register(name,age,course,country="CN"):
    

     这样,这个参数在调用时不指定,默认就是CN,指定了的话,就是你指定的值。

    2. 关键字参数

    正常情况下,给函数传参数要按顺序,不按顺序就可以用关键字参数,只需指定参数名即可 ,但关键字参数必须放在位置参数之后

    stu_register(age = 22,name='xiaoming',course="linx")
    

     3. 非固定参数

    若你的参数在定义时不确定用户想要传入多少个参数,就可以使用非固定参数

    *args(非固定位置参数)

    def stu_register1(name,age,*args): # *args 会把传入的参数变成一个元组形式
        print(name,age,args)
    
    stu_register1("xiaohu",33)
    stu_register1("xiaohu",33,"a","b","c","d")   #直接传入字符值
    stu_register1("xiaohu",33,*("a","b","c","d"))   # *("a","b","c","d") *元组的方式传入值
    
    #输出
    xiaohu 33 ()   #后面 ()就是args ,只是因为没有传值,所以为空
    xiaohu 33 ('a', 'b', 'c', 'd')  
    xiaohu 33 ('a', 'b', 'c', 'd')
    

     **kwargs(非固定关键字参数)

    def stu_register1(name,age,*args,**kwargs): # **kwargs会把多传入的参数变成一个dict形式
        print(name,age,args,kwargs)
    
    #输出
    stu_register1("lili",33,4,5,6,7,sex="Male")   # set = "male" 关键字的方式传入
    stu_register1("lili",33,4,5,6,7,**{"sex":"Male"})  # **{"sex":"Male"},**字典的形式传入
    

     4.  局部变量

    name = "Alex Li"
    
    def change_name(name):
        print("before change:",name)
        name = "金角大王,一个有Tesla的男人"
        print("after change",name)
    
    
    change_name(name)
    print("在外面看看name改了吗?",name)
    
    #输出
    before change: Alex Li
    after change 金角大王,一个有Tesla的男人
    在外面看看name改了吗? Alex Li
    

     全局与局部变量

    在子程序中定义的变量成为局部变量,在程序的一开始定义的变量称为全局变量。

    全局变量作用于是整个程序,局部变量作用域是定义该变量的子程序。

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

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

    三 返回值

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

    1. 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,也可以理解为return语句代表着函数的结束

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

    四 递归

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

    def calc(n):
        print(n)
        if int(n/2) ==0:
            return n
        return calc(int(n/2))
     
    calc(10)
     
    输出:
    10
    5
    2
    1
    

     递归特性:

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

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

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

    大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html

    五 匿名函数

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

    #这段代码
    def calc(n):
        return n**n
    print(calc(10))
    
    #换成匿名函数
    calc = lambda n:n**n
    print(calc(10))
    

     六 高阶函数

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

    def add(x,y,f):
        return f(x)+f(y)
    
    res = add(3,-6,abs)
    print(res)
    
  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/Easonlou/p/8269871.html
Copyright © 2011-2022 走看看