最新消息:发现真没时间折腾VPS,最近又换了个空间。呵呵

Python学习(8) 函数

与其它非动态语言不同,在Python中函数也是一个对象其对象名为函数名,可以返回一个函数,也可以把函数当成一个参数传递。这个跟JavaScript里的函数有些像(PHP5.3开始也支持匿名函数)。正因为函数是一个以函数名为名的对象,所以同一阶层不要定义同名函数,因为后面的函数会覆盖前面的。

函数定义方法

Python中,函数可以直接定义在模块里,也可以定义到类里。

如下代码

Python
def function1():
    print('function1')

class class1:
    def classFunction1():
        print('classFunction1')

function1()
class1.classFunction1()

函数变量的作用域

Python变量的作用域可以分成三点来说明,第一是不加修饰的变量,第二是以nonlocal修饰的变量,第三是以global修饰的变量。

先介绍不加修饰的变量,对于这种变量,内部函数是不能修改外部的变量值的,如果有赋值语句,是指在内部新建一个变量。其变量查找方法是由内而外的。
如下代码、innerFunc里重新定义了valueA的值,然后向上层找到valueB,在最上层找到valueC。但它没有改变上层ValueA的值。

Python
valueA = 1
valueB = 2
valueC = 3

print('out before: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

def func():
    valueA = 11
    valueB = 12

    print('func before: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

    def innerFunc():
        valueA = 21
        print('innerFunc: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

    innerFunc()

    print('func after: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

func()

print('out after: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

# 输出结果
# out before: valueA: 1, valueB: 2, valueC: 3
# func before: valueA: 11, valueB: 12, valueC: 3
# innerFunc: valueA: 11, valueB: 22, valueC: 3
# func after: valueA: 11, valueB: 12, valueC: 3
# out after: valueA: 1, valueB: 2, valueC: 3

下面再介绍nonlocal,nonlocal的查找方式和不加修饰的变量一样,也是从内而外查找,所不同的是以nonlocal修饰的变量不会在内存新建变量,而是直接修改查找到的值。还有就是nonlocal不能绑定模块共通变量。
如下代码,第四行nonlocal value在模块变量里有,但是nonlocal不能绑定模块共通变量,所以会提示找不到变量。
innerFunc和innerSecFunc里对valueA和valueB的修改会反映到func函数里的变量里。

Python
value = 1

def func():
    # nonlocal value # Error
    valueA = 1
    valueB = 2
    valueC = 3

    print('func before: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

    def innerFunc():
        nonlocal valueA
        valueA = 11
        print('innerFunc before: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

        def innerSecFunc():
            nonlocal valueA, valueB
            valueA = 21
            valueB = 22
            print('innerSecFunc: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

        innerSecFunc()

        print('innerFunc after: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

    innerFunc()

    print('func after: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

func()

# 输出结果
# func before: valueA: 1, valueB: 2, valueC: 3
# innerFunc before: valueA: 11, valueB: 2, valueC: 3
# innerSecFunc: valueA: 21, valueB: 22, valueC: 3
# innerFunc after: valueA: 21, valueB: 22, valueC: 3
# func after: valueA: 21, valueB: 22, valueC: 3

以global修饰的变量,如果模块变量里有,则使用其变量,如果没有,则新建一个模块共通变量。因为nonlocal不能绑定模块共通变量,所以在申明了global变量的范围内,再用nonlocal修饰同一个变量名会出错。
如下代码,func里valueA在模块共通变量,会直接修改其值,valueC没有,会添加一个valueC的变量。但在innerFunc里,因为外层的valueA是模块共通变量,所以会出错。

Python
valueA = 1
valueB = 2

print('all before: valueA: {}, valueB: {}'.format(valueA, valueB))

def func():
    global valueA, valueC
    valueA = 11
    valueC = 13

    print('func before: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

    def innerFunc():
        # nonlocal valueA #Error
        pass

    innerFunc()

    print('func after: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

func()

print('all after: valueA: {}, valueB: {}, valueC: {}'.format(valueA, valueB, valueC))

# 输出结果
# all before: valueA: 1, valueB: 2
# func before: valueA: 11, valueB: 2, valueC: 13
# func after: valueA: 11, valueB: 2, valueC: 13
# all after: valueA: 11, valueB: 2, valueC: 13

函数参数

Python的函数参数比较多样,可以指定必须参数,也可以指定默认值,还支持不定参数。参数的定义顺序如下:
必须先定义必须参数,然后是不定长列表、元组参数,再然后是默认参数,最后是不定长字典参数。
调用函数时,支持解码列表,字典,元组。也支持直接用Key指定参数名。调用时,带*号的参数要放到后面。

如下代码:

Python
# 必须参数
def func1(value1, value2):
    print("value1: {}, value2: {}".format(value1, value2))

func1('Test', 'One'); # value1: Test, value2: One

func1(value2 = 'One', value1 = 'Test'); # value1: Test, value2: One

# 默认参数
def func2(value = 1):
    print("func2: {}".format(value))

func2();  # func2: 1
func2('Test');  # func2: Test

# 不定长列表,元组参数
def func3(*value):
    print("func3: {}".format(value))

func3();  # func3: ()
func3(1, 2);  # func3: (1, 2)
func3(*(1, 2)); # func3: (1, 2)
func3(*[1, 2]); # func3: (1, 2)

# 不定长字典参数
def func4(**value):
    print("func4: {}".format(value))

func4();  # func4: {}
func4(value = 1); # func4: {'value': 1}
func4(**{'value1': 1, 'value2':2}); # func4: {'value2': 2, 'value1': 1}

# 参数顺序
# 必须先定义必须参数,然后是不定长列表、元组参数,再然后是默认参数,
# 最后是不定长字典参数
def func5(value1, *value2, value3 = '2', **value4):
    print("value1: {}, value2: {}, value3: {}, value4: {}"
            .format(value1, value2, value3, value4))

func5(1, *(1, 2), value3 = '3', **{'valueA': 1, 'valueB':2})
# value1: 1, value2: (1, 2), value3: 3, value4: {'valueB': 2, 'valueA': 1}

lambda函数定义

lambda函数其实就是匿名函数,在处理一些简单的运算什么的时候还是比较适用的。
如下代码:

Python
value = [[1, 2], [3, 4]]
func = (lambda x, y : x ** 2 + y ** 2)
for v in value:
    print(func(*v))

listV = list(map(lambda x : x + 1, [1, 2, 3]))
print(listV)

转载请注明:宇托的狗窝 » Python学习(8) 函数

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址