• python成长之路【第三篇】:函数


    1、函数基础
      函数是python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构。
      函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件。
      函数用于将相关功能打包并参数。
      python中可以创建4种函数:
        全局函数:定义在模块中
        局部函数:嵌套于其他函数中
        lambda函数:表达式
        方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用
      Python提供了很多内置函数。

      注意:有两种方式可以查看Python的内置函数。

        1、https://docs.python.org/3/library/functions.html

        2、交互式模式下:help(__builtins__)

    2、创建函数
    语法:
      def functionName(parameters):
        suite

    一些相关的概念:
      def是一个可执行语句。因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其他语句,例如if或while中。
      def创建了一个对象并将其赋值给一个变量名(即函数名)。
      return用于返回结果对象,其为可选;无retrun语句的函数自动返回None对象。返回多个值时,彼此间使用逗号分隔,且组合为元组形式返回一个对象。
      def语句运行之后,可以在程序中通过函数后附加括号进行调用。

      2.1、文档化参数
      如果想要给函数写文档,让其他使用该函数人能理解的话,可以加入注释(以#开头)。另外一个方式就是直接写上字符串。这类字符串在其他地方可能会非常有用,比如在def语句后面(以及在模块或者类的开头)。如果在函数的开头写下字符串,它就会作为函数的一部分进行存储,这称为文档字符串。

      示例:

    def square(x):
    'Calculates the square of the number x.'
    return x*x

      文档字符串可以按如下方式访问:
        square.__doc__
      注意:__doc__是函数属性。属性中的双下划线表示它是个特殊属性。

      

      2.2、参数传递:参数的传递是通过自动将对象赋值给本地变量实现的。

      

      不可变参数通过"值"进行传递:
        在函数内部改变形参的值,只是让其引用了另一个对象。
      可变参数通过"指针"进行传递:
        在函数内部改变形参的值,将直接修改引用的对象。

      有两种方式可避免可变参数被函数修改:
        直接传递可变对象的副本:testFunc(A,B[:])
        在函数内部创建可变参数的副本:B=B[:]

    示例:
    	可变参数:
    	>>> l1 = [1,2,3]
    	>>> def f1(x):
    	...     x.pop()
    	...     print(x)
    	... 
    	>>> f1(l1)  #这里我们发现当调用函数f1时,会修改列表l1的值。是他们他们都是指向相同的引用。
    	[1, 2]
    	>>> l1
    	[1, 2]
    	
    	不可变:
    	>>> l1 = [1,2,3]
    	>>> def f1(x):
    	...     x.pop()
    	...     print(x)
    	... 
    	#注意我们这里调用参数的方法l1[:]相当于对列表l1做了一次全拷贝,所以他们没有指向相同的引用。
    	>>> f1(l1[:])
    	[1, 2]
    	>>> l1
    	[1, 2, 3]

      2.3、函数参数模型
      默认情况下,参数通过其位置进行传递,从左至右,这意味着,必须精确地传递和函数头部参数一样多的参数。但也可以通过关键字参数、默认参数或者参数容器等改变这种机制。
        位置参数:从左至右
        关键字参数:调用函数时,使用"name=value"的语法通过参数名进行匹配
        默认参数:定义函数时使用"name=value"的语法直接给变量一个值,从而传入的值可以少于参数个数
          def f1(x,y,z=9)
        可变参数:定义函数时使用*开头的参数,可用于收集任意多基于位置或关键字的参数
          def f1(*x):把收集到的结果都当成元组来识别
          def f1(**x):把收集到的结果都当成字典来识别
        可变参数解包:调用函数时,使用*开头的参数,可用于将参数集合打撒,从而传递任意多基于位置或关键字的参数

      注意:调用函数时,如果混用位置参数和关键字参数时,左侧先写所有位置参数,然后在写所有的关键字参数。
        定义函数时使用有默认值的参数时:形参放左边,有默认值的参数放右边。
        调用函数时使用可变参数要求:
          定义函数时使用*:收集位置参数
          定义函数时使用**:收集关键字参数

    示例:
    	可变参数,用于收集位置参数,返回结果为元组
    	>>> def f10(*x):
    	...     print(x)
    	... 
    	>>> m = 3
    	>>> n = 5
    	>>> o = 9
    	>>> f10(m)
    	(3,)
    	>>> f10(m,o)
    	(3, 9)
    	>>> 
    	
    	可变参数,用于收集关键字参数,返回结果为字典。
    	>>> def f11(**x):
    	...     print(x)
    	... 
    	>>> f11(x=1,y=5,z=9)
    	{'z': 9, 'x': 1, 'y': 5}
    	
    	可变参数解包:必须匹配
    	>>> l1 = ["Sun","Mon","Tus"]
    	>>> x,y,z = l1
    	>>> print(x,y,z)
    	Sun Mon Tus
    	
    	示例:
    	>>> l1 = ["Sun","Mon","Tus"]
    	>>> def f1(x,y,z):
    	...     print(x,y,z)
    	... 
    	>>> f1(*l1)
    	Sun Mon Tus

      2.4、函数作用域:
      Python创建、改变或查找变量名都是在名称空间中进行。
      在代码中变量名被赋值的位置决定了其能被访问到的范围。
      函数定了本地作用域,而模块定义了全局作用域。
        每个模块都是一个全局作用域,因此,全局作用域的范围仅限于单个程序文件。
        每次对函数的调用都会创建一个新的本地作用域,赋值的变量除非使用global声明为全局变量,否则均为本地变量。
        所有的变量名都可以归纳为本地、全局或内置的(由__builtins__模块提供)。

      

      函数变量作用域:LEGB原则

        作用域越小,优先级越多。

      

  • 相关阅读:
    go语言-值类型与引用类型
    MongoDB小东西
    2018年12月29日
    父进程结束,其子进程不会结束,会挂到init进程下
    python处理Windows平台上路径有空格
    python print 在windows上 出现 Bad file descriptor error
    docker私有镜像仓库搭建
    docker 在centos6 和centos7上的区别
    virtualbox 设置centos7 双网卡上网
    Centos6.6安装docker
  • 原文地址:https://www.cnblogs.com/wooya/p/5762074.html
Copyright © 2020-2023  润新知