函数

定义

>>> def add(a, b):
...     return a + b
# f.py
def f(param):
    print(param)

if __name__ == '__main__':
    f('Hello Python Function')

# RUN
bovenson@ThinkCentre:~/Git/notes/Python/Code/LearnPythonCode/function$ python3 f.py 
Hello Python Function

嵌套

# nest.py 
def f(param):
    def inner(parami):
        print('Inner: ', parami)
    print(param)
    inner('HI')


if __name__ == '__main__':
    f('Hello Python Function')
    # f.inner('Hello Inner')    # ERROR: AttributeError: 'function' object has no attribute 'inner'
bovenson@ThinkCentre:~/Git/notes/Python/Code/LearnPythonCode/function$ python3 nest.py 
Hello Python Function
Inner:  HI

调用

传参

可使用的正式参数类型:

  • 必需参数

    • 必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

  • 关键字参数

    • 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

    • 使用关键字参数允许函数调用时参数的顺序与声明时不一致,Python 解释器能够用参数名匹配参数值。

  • 默认参数

    • 调用函数时,如果没有传递参数,则会使用默认参数

  • 不定长参数

    • 可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。

匿名函数

  • python 使用 lambda 来创建匿名函数

语法

示例

变量作用域

  • L (Local) 局部作用域

  • E (Enclosing) 闭包函数外的函数中

  • G (Global) 全局作用域

  • B (Built-in) 内建作用域

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:

全局变量和局部变量

  • 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域

  • 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中

global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

修改全局变量 num:

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字:

最后更新于

这有帮助吗?