Python5

函数

1、函数的定义

def 函数名( [形参列表] ):

      函数体

      return [expression]

注意:

(1)采用def关键字定义函数。

    (2)即使该函数不需要接收任何参数,也必须保留一对空的圆括号。

    (3)括号后面的冒号必不可少。

    (4) 函数体相对于def 关键字必须保持一定的空格缩进。

2、函数递归调用

函数的递归调用是函数调用的一种特殊情况,函数调用自己,自己再调用自己,自己再调用自己,...,当某个条件得到满足的时候就不再调用了,然后再一层一层地返回直到该函数第一次调用的位置。

3、函数参数

函数定义时圆括弧内是使用逗号分隔开的形参列表(parameters),函数可以有多个参数,也可以没有参数,但定义和调用时一对圆括弧必须要有,表示这是一个函数并且不接收参数。

调用函数时向其传递实参(arguments),根据不同的参数类型,将实参的引用传递给形参。

定义函数时不需要声明参数类型,解释器会根据实参的类型自动推断形参类型。

4、位置参数

位置参数(positional arguments)是比较常用的形式,调用函数时实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同。

>>> def demo(a, b, c):

    print(a, b, c)

>>> demo(3, 4, 5)                  #按位置传递参数

3 4 5

>>> demo(3, 5, 4)

3 5 4

>>> demo(1, 2, 3, 4)                #实参与形参数量必须相同

TypeError: demo() takes 3 positional arguments but 4 were given

5、默认值参数

在调用带有默认值参数的函数时,可以不用为设置了默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,当然也可以通过显式赋值来替换其默认值。在调用函数时是否为默认值参数传递实参是可选的。

需要注意的是,在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误。

6、关键参数

关键参数主要指调用函数时的参数传递方式,与函数定义无关。通过关键参数可以按参数名字传递值,明确指定哪个值传递给哪个参数,实参顺序可以和形参顺序不一致,但不影响参数值的传递结果,避免了用户需要牢记参数位置和顺序的麻烦,使得函数的调用和参数传递更加灵活方便。

>>> def demo(a, b, c=5):

    print(a, b, c)

>>> demo(3, 7)

3 7 5

>>> demo(a=7, b=3, c=6)

7 3 6

>>> demo(c=8, a=9, b=0)

9 0 8

7、可变长度参数

可变长度参数主要有两种形式:在参数名前加1个*或2个**

*parameter用来接收多个位置参数并将其放在一个元组中

**parameter接收多个关键参数并存放到字典中

*parameter的用法

>>> def demo(*p):

    print(p)

>>> demo(1,2,3)

(1, 2, 3)

>>> demo(1,2)

(1, 2)

>>> demo(1,2,3,4,5,6,7)

(1, 2, 3, 4, 5, 6, 7)

**parameter的用法

>>> def demo(**p):

    for item in p.items():

        print(item)

>>> demo(x=1,y=2,z=3)

('y', 2)

('x', 1)

('z', 3)

8、传递参数时的序列解包

传递参数时,可以通过在实参序列前加一个星号将其解包,然后传递给多个单变量形参。

>>> def demo(a, b, c):

    print(a+b+c)

>>> seq = [1, 2, 3]

>>> demo(*seq)

6

>>> tup = (1, 2, 3)

>>> demo(*tup)

6


如果函数实参是字典,可以在前面加两个星号进行解包,等价于关键参数。

>>>def demo(a, b, c):

    print(a+b+c)

>>>dic = {'a':1, 'b':2, 'c':3}

>>>demo(**dic)

6

>>>demo(a=1, b=2, c=3)

6

>>>demo(*dic.values())

6

9、变量作用域

变量起作用的代码范围称为变量的作用域,不同作用域内变量名可以相同,互不影响。

在函数内部定义的普通变量只在函数内部起作用,称为局部变量。当函数执行结束后,局部变量自动删除,不再可以使用。

局部变量的引用比全局变量速度快,应优先考虑使用。

全局变量可以通过关键字global来定义。这分为两种情况:

一个变量已在函数外定义,如果在函数内需要为这个变量赋值,并要将这个赋值结果反映到函数外,可以在函数内使用global将其声明为全局变量。

如果一个变量在函数外没有定义,在函数内部也可以直接将一个变量定义为全局变量,该函数执行后,将增加一个新的全局变量。

如果局部变量与全局变量具有相同的名字,那么该局部变量会在自己的作用域内隐藏同名的全局变量。

>>> def demo():

    x = 3        #创建了局部变量,并自动隐藏了同名的全局变量

>>> x = 5

>>> x

5

>>> demo()

>>> x            #函数执行不影响外面全局变量的值

5

lambda表达式可以用来声明匿名函数,也就是没有函数名字的临时使用的小函数,尤其适合需要一个函数作为另一个函数参数的场合。也可以定义具名函数。

lambda表达式只可以包含一个表达式,该表达式的计算结果可以看作是函数的返回值,不允许包含复合语句,但在表达式中可以调用其他函数。


>>> data = list(range(20))           #创建列表

>>> data

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> import random

>>> random.shuffle(data)             #打乱顺序

>>> data

[4, 3, 11, 13, 12, 15, 9, 2, 10,6, 19, 18, 14, 8, 0, 7, 5, 17, 1, 16]

>>> data.sort(key=lambda x:x)       #和不指定规则效果一样

>>> data

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

你可能感兴趣的:(Python5)