zoukankan      html  css  js  c++  java
  • day3 函数

     
    函数
      位置参数一定要在前面 
      形参和实参
      位置参数
      关键词参数
      函数默认参数
        默认参数特点:调用函数的时候,默认参数非必传   
      参数组
      局部变量
     

    特性:

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

    定义一个函数:

    • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
    • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
    • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    • 函数内容以冒号起始,并且缩进。
    • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None
    def func_test():
        print("I'm a function.")
    
    func_test()
    func_test()
    func_test()

    C:Userscongcong.duAppDataLocalProgramsPythonPython35python.exe C:/Users/congcong.du/PycharmProjects/test/day3/func.py
    I'm a function.
    I'm a function.
    I'm a function.

    2.函数参数

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

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

    def func_test(x,y):#x,y为形参
        res = x+y
        return res
    z = func_test(2,4) #2,4为x,y的实参
    print(z)

    3.默认参数

    def test(x,y,z=9):
        print(x)
        print(y)
        print(z)
        print("------------")
    
    test(1,2,3) #位置参数
    test(1,z=8,y=2)#位置参数一定要在关键字参数前面
    test(1,2) #默认参数特点:调用函数的时候,默认参数非必传

    C:Userscongcong.duAppDataLocalProgramsPythonPython35python.exe C:/Users/congcong.du/PycharmProjects/test/day3/func.py 1 2 3 ------------ 1 2 8 ------------ 1 2 9 ------------

    4.参数组*args,传字典 **kwargs

    #参数组
    #若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数。 #*args 接收位置参数,不接受关键字参数,转化为元组 def test1(name,*args): print(name) print(args) test1("alex",1,2,3,4,5,5)

    C:Userscongcong.duAppDataLocalProgramsPythonPython35python.exe C:/Users/congcong.du/PycharmProjects/test/day3/func.py
    alex
    (1, 2, 3, 4, 5, 5)

    print("=========字典=======")
    #传字典 **kwargs :将关键字参数,转换为字典的方式
    def test2(**kwargs):
        print(kwargs)
        print(kwargs["name"])
    test2(name="alex",age=8,sex="man")
    test2(**{'age': 8, 'name': 'alex', 'sex': 'man'})
    
    
    #混和
    def test3(name,age=18,**kwargs):
        print(name)
        print(age)
        print(kwargs)
    test3("alex", sex="man")
    test3("alex",1,sex="man",hobby="tsl")
    test3("alex",sex="man",hobby="tsl",age=1)
    
    print("---------------------")
    
    def test4(name,age=18,*args,**kwargs):
        print(name)
        print(age)
        print(args)
        print(kwargs)
    test4("alex",34,1,2,3,sex="man", hobby="tsl") #关键字参数,一定要在最后一个位置参数后main
    test4("alex",age=34,sex="man",hobby="tsl")

    5.局部变量

    局部变量只在他的作用域内其起作用,也可以声明为全局变量,不过因为写代码长的时候随便声明可能会乱,所以不推荐。

    def change_name(name):
        print("before change:",name)
        name = "里面的局部变量"
        print("after change:", name)
    name=('外面的全局变量')
    change_name(name)
    print("在外面看看name改了么?",name)
    '''
    before change: 外面的变量
    after change 里面的变量
    在外面看看name改了么? 外面的变量
    '''
    print("===========全局/局部变量=======")
    sex = "m"
    def test5(n):
        #global age #如果要在函数内改全局变量,用global声明
        sex = "g" #局部变量改不了全局的变量
        print("before change:", n,sex)
        n = "Alex Li" #这个函数就是这个变量的作用域
        age = 20
        print("after change:", n,age,sex)
    name = "alex"
    test5(name)
    #print(name,age,sex)   #age局部变量不能在函数外使用
    print(name,sex)

    函数内是可以修改全局列表的

    print("======函数修改列表====")
    names = ["alex","jack","rain"]
    def change_list():
        names[0]= "ALEX"
        print(names)
    change_list()
    print(names)

    6.递归函数

    #函数内部调用自己。
    #1.必须有一个明确的结束条件,最大递归次数999. #2.每次进入更深一层递归时,问题规模相比上次递归应有减少 #3.效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
    print("========递归函数=========")
    #函数内部调用自己。1.必须有一个明确的结束条件,最大递归次数999.
    #2.每次进入更深一层递归时,问题规模相比上次递归应有减少
    #3.效率不高
    def test6(n):
        print(n)
        if int(n/2) > 0:
            return test6(int(n/2))
        print("-->",n)
    
    test6(10)

    6.高阶函数

    print("========高阶函数=========")
    #变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
    #abs 转化为正数的函数
    def add(x,y,f):
        return f(x)+f(y)
    
    res = add(3,-6,abs)
    print(res)
  • 相关阅读:
    最小生成树之算法记录【prime算法+Kruskal算法】【模板】
    [LC] 90. Subsets II
    [LC] 19. Remove Nth Node From End of List
    [LC] 125. Valid Palindrome
    [LC] 127. Word Ladder
    [LC] 102. Binary Tree Level Order Traversal
    [LC] 5. Longest Palindromic Substring
    [LC] 167. Two Sum II
    [LC] 437. Path Sum III
    [LC] 94. Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/dcc001/p/5754263.html
Copyright © 2011-2022 走看看