Python3快速入门(五)——Python3函数

一、函数定义

1、函数定义

Python 定义函数使用 def 关键字,一般格式如下:

def function_name(parameter_list):
    pass

默认情况下,参数值和参数名称按函数声明中定义的顺序进行匹配。
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串描述函数说明。
函数内容以冒号起始,并且进行缩进。
函数的定义示例如下:

def add(x, y):
    result = x + y
    return result

2、函数的返回值

函数使用return [表达式] 结束函数,返回一个或多个值给调用方。不带表达式的return相当于返回 None。

def get_fruits():
    apple = "Apple"
    banana = "Banana"
    orange = "Orange"
    return apple, banana, orange

a,b,c = get_fruits()
print(a, b, c)

二、函数调用

1、函数调用

函数定义只给了函数一个名称,指定了函数里包含的参数和代码块结构。
函数调用直接使用定义的函数名称以及传递相应的参数进行调用。

2、函数调用的递归限制

Python默认设置了函数的最大递归调用次数,开发者可以直接进行设置。设置方法如下:

#!/usr/bin/python3

import sys

sys.setrecursionlimit(100) # 设置最大递归次数为100

三、函数参数

1、必须参数

必须参数是函数调用时必须传递的参数。

#!/usr/bin/python3

def add(x, y):
    result = x + y
    return result

add(3, 2)

2、关键字参数

关键字参数用于函数调用时,使用形式参数关键字将实际参数赋值给函数的相应形式参数,函数调用过程中传递实际参数顺序可以与形式参数顺序不匹配,但所有的必须参数必须被赋值。

#!/usr/bin/python3

def add(x, y):
    result = x + y
    return result

add(y=2, x=3)

上述代码中,add函数的调用传递的实际参数通过指定关键字参数实际指定相应的形式参数,不必按照形式参数顺序匹配,但必须参数都必须被传递。

3、默认参数

函数在定义过程中可以为指定参数默认的值,并且必须参数必须放在默认参数的左侧。

#!/usr/bin/python3

def print_student(name, gender="男", age=28):
    print(name)
    print(gender)
    print(age)

print_student("Bauer", "男", 30)
print_student("Lee")
print_student("Lisa","女")

print_student(age=30, name="Bob")

函数调用时,可以使用关键字参数对形式参数进行赋值,默认参数可以缺省,但必须参数必须被赋值,必须参数可以使用关键字参数赋值。如果必须参数不使用关键字参数,则必须参数必须严格按照函数定义的顺序传递,其默认参数可以使用关键字参数选择性赋值,没有使用关键字参数传递的默认参数将使用默认值。

4、可变参数

可变参数通过使用*修饰形式参数定义可变参数。
函数定义时,可以定义可变参数,在函数调用时传递可变的多个实际参数。

#!/usr/bin/python3

def add(*args):
    result = 0;
    for x in args:
        result += x
    return result

c = add(1, 2, 3, 4)
print(c)
c = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(c)
tup1 = 1, 2, 3, 4
c = add(*tup1) # 传入序列
print(c)
list1 = [1, 2, 3]
c = add(*list1)
print(c)

对应定义了可变参数的的函数,如果需要传入序列作为实际参数,需要在序列前加*
如果函数定义时有可变参数和默认参数,函数调用时可以使用关键字参数用于指定默认参数。

#!/usr/bin/python3

def add(x, *args, y=100):
    result = x + y;
    for i in args:
        result += i
    return result

c = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) # 155
print(c)
c = add(1, 2, 3, 4, 5, 6, 7, 8, 9, y=10) # 55
print(c)

Python中,如果函数定义时可变参数放在默认参数的左侧,则默认参数需要使用关键字参数显式指定。

5、关键字可变参数

关键字可变参数通过使用**修饰形式参数定义,关键字可变参数为字典类型,关键字可变参数属于可选参数。

#!/usr/bin/python3

def average_score(**args):
    result = 0;
    for key, value in args.items():
        result += value
        print(key + ": ", value)
    result = result / len(args)
    print("Average score is ", result)
    return result

book = {"Bauer": 90, "Bob": 100, "Lisa": 70, "Lee": 100}
average_score(**book)
average_score(Bauer=100, Lisa=70, Lee=100)

函数调用时,关键字可变参数可以传递多个键值对,页可以直接传递dictionary类型变量,此时需要使用**修饰字典变量。

四、匿名函数

python 使用 lambda表达式来创建匿名函数,函数定义如下:
lambda [arg1 [,arg2,.....argn]]:expression
Lambda表达式定义的匿名函数的函数体不是一个代码块,因此,仅能在lambda表达式中封装有限的逻辑。
Lambda表达式拥有自己的命名空间,且不能访问自有参数列表外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

sum = lambda arg1, arg2: arg1 + arg2;

# 调用sum函数
print(sum(10, 20))
print(sum(20, 20))

五、变量作用域

程序的所有的变量并不是在任何位置都可以访问的,访问权限决定于变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。
定义在函数内部的变量拥有局部作用域,定义在函数外的拥有全局作用域,代码块内部局部变量会覆盖全局变量,在局部作用域内修改全局变量的值时,需要使用global关键字对相应全局变量进行声明,表明本作用域内使用的是全局变量。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

base = 100

def sum(*args):
    global base
    base = 0
    result = 0;
    for i in args:
        result += i
    return result + base;

c = sum(1,2,3,4,5,6,7,8,9,10)
print(c) # 55
print(base) # 0