python中的函数

来源:互联网 发布:2016网络诈骗事件 编辑:程序博客网 时间:2024/06/07 11:00

函数分类:

内置built_in:len、max、min、sum、abs......
自定义:
def 函数名(参数1,参数2,参数3,):
     注释
     函数体
函数名 指向 函数体,这一点和定义变量是一样的。

定义函数:

注意:定义阶段只检测语法,不执行。
定义函数的三种形式:
  • 定义无参函数 def func(): 不依赖外部参数(一般无返回值)
  • 2 定义有参函数 def func(x, y, z...) 函数的执行依赖外部参数(一般有返回值,即定义return。例如系统内建的函数len()
    如果不绑定返回值,用一次,python就回收内存。如果将返回值绑定一个变量,这样就将返回值保存下来了,可以重复使用多次,否则每次都调用函数来给出一个返回值,慢)

  • 3 定义空函数
    def func():

          pass

    空函数用途:构建程序

调用函数:

  • func () 调用函数的语句形式(不需要返回值的):调用函数时,先找函数名func,再()执行代码
  • res = func()
    print(res)

    调用执行函数的返回值
  • 函数return返回值
    几种形式:
    1 不写return,默认return None
    2 返回值没有类型限制:int、str、dict、、、
    3 返回多个值,元组形式:
     return(元素1、元素2),python中不加括号也默认返回元组

    return的效果:终止函数的执行。因此return只能执行一次(返回一次值)。可以通过if多分支return多种值。

函数的参数:

python弱类型语言,函数可以传入任何参数:
形参与实参(形参相当于变量名,实参相当于变量值)
在函数调用时,形参绑定实参,才开始占用内存。
  • 位置参数:按照从左到右的顺序依次定义的参数:
    按位置定义的形参,必须被传值,多一个不信,少一个也不信;

    按位置定义的实参,必须与形参一一对应。
  • 关键字参数:实参在定义时,按key=value形式定义。打破位置限制。
    注意(语法要求):

    位置实参和关键字实参可以同时使用;
    位置实参必须在关键字实参的前面;
    位置形参不能被重复传值
  • 默认参数:def func(x, y=10) 函数定义阶段,为形参赋值
    注意 :

    默认参数必须放在位置形参后面(语法要求) ;
    值经常变化的需要定义为位置形参;
    值大多数情况下不变,定义为默认参数更好;
    默认参数通常定义为不可变类型;
    默认参数只在定义时被赋值一次
  • 可变长参数(实参个数可变):
    • *将多余的实参接收,转为元组,赋值给args保存下来
      按位置定义的可变长度的实参:*接收位置参数
    • 按关键字的实参:**接收关键字参数
      **将多余的关键字实参接收,转为字典,赋值给kwargs,以字典的方式保存下来


      可接受任意形式,任意长度的参数 :


  • 命名关键字参数:
    定义在*后的形参:必须被传值(否则报错),而且要求实参必须是以关键字的方式来传值;命名关键字参数也可以定义默认值。
    应用:用户登录指定输入项:
  • 几种形参的位置排列:
    位置形参,默认参数,*args, 命名关键字参数,**kwargs

名称空间与作用域:

  • 名称空间(namespace):存放名字与值的绑定关系(python中用字典存)
    • 内置名称空间:python解释器自带的名字,解释器启动,就会生成该空间 e.g. print、abs、sum、......
    • 全局名称空间:文件级别定义的名字,执行python文件时产生该空间,文件执行完了,全局失效。非局部名称空间的都是。
    • 局部名称空间:定义在函数内部的名字,局部名称空间只有在函数调用时生效,调用结束,失效。
    • 三者的加载顺序:内置=》全局=》局部
    • 取值顺序:局部 =》全局=》内置 (从当前级往上级找),即函数调用时,先找函数内的局部名称空间,如果局部没有,就从全局找,最后从内置找
  • 作用域:
    • 全局作用域:内置名称空间和全局名称空间中存的名字的作用范围为全局,即在整个文件的任意位置都能被引用。
    • 局部作用域:局部名称空间中存的名字的作用范围;只在函数内部可以被引用。
    • 找名字(变量名)从作用域找。当前级别开始往上找:
      max = 20
      def func():
          max = 10
          print(globals())   # 打印全局作用域的名字
          print(locals())     # 打印局部作用域的名字
      func()  # 执行func函数
      运行结果是:
      {'__name__': '__main__', 'max': 20, 'func': <function func at 0x00000178CD86E9D8>}
      {'max': 10}
      以上结果,是在局部这一层开始找。第一个字典是全局作用域的名字,包括内置的名字和在全局自定义的名字 max 和 func 。第二个字典是局部作用域的名字,即在函数内定义的 max。
      全局的局部仍然是全局:

  • 关键字global和nonlocal:

    上面的语句执行后,字典、列表的内容都更改了,而salary仍然是1000。这是因为:
    列表和字典这类的可变类型,我们可以更改里面的元素。尽管如此,列表和字典的id和类型都没变,内存空间里的值变了。
    而这里定义的salary = 1000 是数字,不可变类型。在函数内容对其重新赋值,只能开辟新的内存空间,产生一个新的salary来存放这个值。
    如果想实现对不可变类型的全局修改,要在局部声明 global salary,让局部的那个变量成为全局变量。
    nonlocal 关键字:可以在局部的层级修改到上一层级变量的值,但是不改变全局的值。

    x = 100def func():    x = 55    def func2():        nonlocal x        x = 66    print(x)    func2()    print(x)func()print(x)
    结果如下:
    55
    66
    100

函数嵌套:

  • 函数嵌套定义:

    定义函数相当于定义变量,所以定义在函数内部的函数在外面看不到。更执行不到。
  • tips: 在python中,函数是第一类对象,指函数可以被当作数据传递:可被引用;可被当作函数的参数;func1可做func2函数的返回值(返回函数func1的内存地址;函数的内存地址后面加()就可以执行)可被当作容器类型的元素:这样我们可以将函数放在字典中,实现模块化编程。
  • 闭包函数:函数内部定义的函数。





原创粉丝点击