zoukankan      html  css  js  c++  java
  • python3入门之函数

    相信大家学习过其他语言,懂得函数的作用。简单的说函数最好的作用就是可以使程序变得懒惰。python作为后起之秀,当然也会拥有函数这个有用的东西;

    创建函数

    使用def语句即可创建函数,如创建一个用来生成指定边界的斐波那契数列的函数:

     #!/usr/bin/env python3                                                           
        def fib(n):#使fibonacci数列到达n                                                 
            '打印fibonacci数列到n'                                                       
            a,b=0,1                                                                      
            while a<n:                                                                   
                print(a,end=' ')                                                         
                a,b=b,a+b                                                                
        fib(20)   
    0 1 1 2 3 5 8 13    
    

    关键字 def 引入了一个函数 定义 。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。

    有关事项详解:

    文档化函数

    函数体的第一行语句可以是可选的字符串文本,这个字符串是函数的文档字符串,或者称为 docstring 。使用如下方式可以查看:

    print(fib.__doc__)
    打印fibonacci数列到n
    

    参数的传递

    函数 调用 会为函数局部变量生成一个新的符号表。 确切的说,所有函数中的变量赋值都是将值存储在局部符号表。 变量引用首先在局部符号表中查找,然后是包含函数的
    局部符号表,然后是全局符号表,最后是内置名字表。 因此,全局变量不能在函数中直接赋值(除非用 global 语句命名),尽管他们可以被引用。
    函数引用的实际参数在函数调用时引入局部符号表,因此,实参总是 传值调用 (这里的 值 总是一个对象 引用 ,而不是该对象的值)。 1 一个函数被另一个函数调用时,
    一个新的局部符号表在调用过程中被创建。

    函数名可以赋予其他名字

    函数名可以重命名:

    f=fib
    f(100)
    0 1 1 2 3 5 8 13 21 34 55 89
    

    可能有人误会说fib()函数没有返回值,千万注意这里使用的是函数名,没有使用函数调用;事实上fib()确实返回了一个空值,未加return语句返回的时None;可以使用下方法查看:

    print(fib(10))
    0 1 1 2 3 5 8 None
    

    深入理解python3函数定义

    在python中,你也可以定义包含若干参数的函数,这里有三种可用的形式,可以混合使用:

    默认参数值:

    默认参数的定义方法如下:

    def f(a,b,x=3,y=5):                                                              
         '测试默认参数'                                                               
        print(a,b,x,y)                                                               
    

    上面的函数中参数a和b是必要参数,而参数x和y是可选参数,有自己的默认值;
    这个函数可以通过几种不同的方式调用:
    只给出必要参数: f(1,2)
    给出一个可选的参数: f(1,2,4)
    给出所有参数: f(1,2,4,6)
    注意:
    默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)
    传给它的参数:

    def f(a, L=[]):
        L.append(a)
        return L
    print(f(1))
    print(f(2))
    print(f(3))
    #输出
    [1]
    [1, 2]
    [1, 2, 3]
    

    如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数:

    def f(a, L=None):
        if L is None:
            L = []
        L.append(a)
        return L
    

    关键字参数:

    有些时候函数的参数顺序是很难记忆的,为了让事情简单些,可以在调用时提供参数的名字:

    def f(a,b,x=3,y=5):                                                              
         '测试关键字参数'                                                             
          print(a,b,x,y)                                                               
      #普通调用                                                                        
       f(1,2)                                                                           
      #关键字调用                                                                      
      f(a=1,b=2,y=6)                                                                       
      f(1,2,y=3) 
    #输出
    1 2 3 5
    1 2 3 6
    1 2 3 3
    

    注意:当使用了关键字后必须一直使用不然会报错:
    比如下:
    f(a=1,2)
    SyntaxError: non-keyword arg after keyword arg

    可变参数列表:

    可以让函数调用可变个数的参数,这些参数被包装进一个元组或者字典。
    可变参数定义方式:只需在参数前面加上×号,参数被包装在元祖中

     def print_params(title,*params):                                                 
          print(title)                                                                 
          print(params)                                                                
    

    可以和普通参数联合使用,×号收集的时其余的位置参数如: print_params("peace",23,170) 。如果不提供任何收集的元素,params时个空元祖:() 如: print_params("pp")
    同样还可以处理关键字参数,定义如下:只需在关键字参数前面加上××号,被包装在字典中;

    def print_params(title,**params):                                                 
          print(title)                                                                 
          print(params)  
    

    调用时必须注明关键字参数。可以这样调用:
    print_params("peace",age=23,high=170)
    print_params("pp")

    参数列表的分拆

    与可变参数刚好相反,
    当你要传递的参数已经是一个列表,但要调用的函数却接受分开一个个的参数值。这时候你要把已有的列表拆开来
    你可以在调用时加一个×操作符来自动把参数列表拆开:比如range():

    >>> list(range(1,10))
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> args=[1,10]
    >>> list(range(*args))
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> 
    

    以同样的方式,可以使用 ** 操作符分拆关键字参数为字典:

    Lambda 形 式

    出于实际需要,有几种通常在函数式编程语言例如 Lisp 中出现的功能加入到了 Python。通过 lambda 关键字,可以创建短小的匿名函数。这里有一个函数返回它的两个参数的和: lambda a, b: a+b 。 Lambda 形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda 形式可以从外部作用域引用变量:

    def fun(n):                                                                      
          '下面x是参数,x+n是返回值'                                                   
          return lambda x: x+n                                                         
     #f接收lambda返回的函数                                                           
     f=fun(10)                                                                        
     print(f(0))                                                                      
     print(f(10)) 
    #输出:
    10
    20
    
    

    相关链接:

    python3入门之类
    python3入门之函数
    python3入门之循环
    python3之if语句
    python3入门之赋值语句介绍
    python3入门之print,import,input介绍
    python3入门之set
    python3入门之字典
    python3入门之字符串
    python3入门之列表和元组
    python3入门之软件安装
    python3爬虫之入门和正则表达式

  • 相关阅读:
    Flash特效 嘿嘿
    惨,被骗了20年
    “不允许对64位应用程序进行修改”的解决方法 “Changes to 64bit applications are not allowed.”
    清除Sql Server数据库日志
    .Net 序列化(去除默认命名空间,添加编码)
    【Vegas原创】X connection to localhost:11.0 broken (explicit kill or server shutdown)解决方法
    【Vegas原创】通过WMIC命令远程打开远程计算机的远程桌面(Remote Desktop)功能
    【Vegas原创】ORA12638: 身份证明检索失败的解决办法
    【Vegas原创】SQL Server 阻止了对组件 'SQL Mail XPs' 的 过程'sys.xp_sendmail' 的访问的解决方法
    【Vegas原创】获取SQL Server处理语句的时间(毫秒)
  • 原文地址:https://www.cnblogs.com/onepeace/p/4786804.html
Copyright © 2011-2022 走看看