AI智能
改变未来

Python: 函数

目录

  • 1. 不定长参数
  • 2. 函数的返回值
  • 3. 文档字符串
  • 4. 函数作用域
  • 4.1 作用域的定义
  • 4.2 全局作用域
  • 4.3 函数作用域
  • 5. 命名空间
  • 6. 递归函数
    • 6.1 基线条件
    • 6.2 递归条件

    1. 不定长参数

    • 在定义函数的时候,可以在形参前面加一个*,这样的形参会将所有的实参保存为元组。
    def fn(*a):print(a)fn(1,2,3,4,5)

    执行的结果:
    (1,2,3,4,5),所以形参接收到的实参保存为元组。

    • 带*号的形参只能有⼀个,可以和其他参数配合使⽤
      例如:
    def fn(a,*b,c):print(\'a =\',a)print(\'b =\',b)print(\'c =\',c)fn(1,2,3,4,c=5)

    执行结果如下:
    a = 1
    b = (2, 3, 4)
    c = 5
    a 是位置参数,c是关键字参数,剩下的*b是不定长参数。

    • *形参只能接受位置参数,不能接受关键字参数,如果传入关键字,会报错:SyntaxError: positional argument follows keyword argument
    • **形参可以接收其他的关键字参数,它会将这些参数统⼀保存到字典当中。字 典的key就是参数的名字,字典的value就是参数的值
      例如:
    def fn(**d):print(d,type(d))fn(a=1,b=2,c=3)

    执行结果:
    {‘a’: 1, ‘b’: 2, ‘c’: 3} <class ‘dict’>,可见**这个形参将关键字保存为了字典中的key,将关键字的值保存为了字典中的value

    • **形参只有⼀个,并且必须写在所有参数的后⾯, 否则会报错:SyntaxError: invalid syntax

    2. 函数的返回值

    • 返回值就是函数执⾏以后返回的结果
    • 通过return来指定函数的返回值
    • return后⾯可以跟任意对象,返回值甚⾄可以是⼀个函数
    • return一旦执行,函数自动结束
      例如:
    def fn():for i in range(5):if i == 3:returnprint(i)print(\'循环执行完毕\')fn()

    执行结果:
    0
    1
    2
    由此可见,print(\’循环执行完毕’)这条语句并未得到执行,原因return后面的print(i)执行完毕后,函数已经结束。

    • 如果仅仅写一个return 或者没有写return 相当于 return None

    3. 文档字符串

    • help() 可以查询Python中内置海曙的使用方法,语法是:help(函数对象)
      例如:
    help(print)

    执行结果:
    print(…)
    print(value, …, sep=’ ‘, end=’\\n’, file=sys.stdout, flush=False)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file: a file-like object (stream); defaults to the current sys.stdout.
    sep: string inserted between values, default a space.
    end: string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.
    由此可见,通过help()函数,我们将print()函数的用法及说明调用出来。

    • 除内置函数外,我们自定义的函数也可用help,这是help()函数会返回我们对自定义函数的说明,即文档字符串。
      例如:
    def guide():\'\'\'这个函数是说明help()函数对自定义函数的使用说明\'\'\'returnhelp(guide)

    执行结果:
    Help on function guide in module main:

    guide()
    这个函数是说明help()函数对自定义函数的使用说明
    由此可见,文档字符串中的内容,可以通过help()函数调用出来,让我们看到自定义函数guide()的说明。

    4. 函数作用域

    4.1 作用域的定义

    作⽤域(scope)指的是变量⽣效的区域,在Python中有两种作用域,一种是全局作用域,一种是函数作用域

    4.2 全局作用域

    • 全局作⽤域在程序执⾏时创建,在程序执⾏结束时销毁
    • 所有函数以外的区域都是全局作⽤域
    • 在全局作⽤域中定义的变量,都是全局变量,全局变量可以在程序的 任意位置进行访问当然包括函数
      例如:
    a = 10def fn():print(\'函数内部:\',\'a =\',a)fn()print(\'函数外部:\',\'a =\',a)

    执行结果:
    函数内部: a = 10
    函数外部: a = 10
    由此可见,在全局定义的变量,函数外部和函数内部都可以使用。

    4.3 函数作用域

    • 函数作⽤域在函数调⽤时创建,在调⽤结束时销毁
    • 函数每调⽤⼀次就会产⽣⼀个新的函数作⽤域
    • 在函数作⽤域中定义的变量,都是局部变量,它只能在函数内部被访问。
      例如:
    def fn():a = 10print(\'函数内部:\',\'a =\',a)fn()print(\'函数外部:\',\'a =\',a)

    执行结果如下:

    函数内部: a = 10
    Traceback (most recent call last):
    File “C:/Users/Robin Ding/PycharmProjects/pythonProject1/temp.py”, line 7, in
    print(‘函数外部:’,‘a =’,a)
    NameError: name ‘a’ is not defined
    由此可见,a=10在函数内部定义的,就只能在函数内部使用 ,所以函数内部a=10的结果是有的,但是在全局当中,并不知道a这个变量,所以有报错:NameError: name ‘a’ is not defined

    • 如果函数中有函数,那么子函数的变量只能作用于它以及它的子函数,而不能作用域它的母函数
      例如:
    def fn():a = 10print(\'函数内部:\',\'a =\',a)def fn1():a = 20print(\'子函数内部:\',\'a=\',a)return fn1()fn()

    执行结果如下:
    函数内部: a = 10
    子函数内部: a= 20
    由此可见,子函数内部定义的变量,并不影响母函数。

    • 函数内部中改变全局变量的方法,用global语句来申明变量
      例如:
    a = 10def fn():global aa = 20print(\'函数内部:\',\'a =\',a)fn()print(\'函数外部:\',\'a =\',a)

    执行结果:
    函数内部: a = 20
    函数外部: a = 20
    对比4.3中的第一个示例,可以知道,通过global语句,函数内部赋值的变量a改变了a这个变量的在全局中的值

    5. 命名空间

    • 命名空间实际上就是⼀个字典,是⼀个专⻔⽤来存储变量的字典
    • locals()⽤来获取当前作⽤域的命名空间
    • 如果在全局作⽤域中调⽤locals()则获取全局命名空间,如果在函数作⽤域中 调⽤locals()则获取函数命名空间
    • 返回值是⼀个字典

    6. 递归函数

    • 递归函数是解决问题的一种方式,它和循环非常像
    • 它的整体思想是将一个大的问题分解文一个一个小问题,当无法分解时,再去解决问题。
    • 递归函数就是自己调用自己
    • 递归函数有两个条件,一个是基线条件,一个是递归条件

    6.1 基线条件

    • 问题能被分解到的最小问题,当满足该条件,递归函数就停止。

    6.2 递归条件

    • 将问题继续分解的条件
      例如:下题通过递归的方法,求任意数的乘阶
    def fn(n):if n == 1:             # 基线条件return 1return n * fn(n-1)     # 递归条件print(fn(10))

    执行结果:
    3628800
    其中基线条件是,当n=1的时候,那么1的乘阶就是1。递归条件就是 n * fn(n-1)

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Python: 函数