函数

函数

1 函数的定义

在编程中,我们经常要调用相同或者类似的操作,这些相同或者类似的操作是由同一段代码完成的,而函数的出现,可以帮助我们避免重复编写这些代码。函数的作用就是把相对独立的某个功能抽象出来,使之成为一个独立的实体。

Python在全世界被广泛使用的一个原因,就是Python中有大量的内置函数,这些内置函数可以帮助我们快速构建各种场景的网站。

定义一个函数只要以 "def" 开头即可。

定义好函数之后,只表示这个函数封装了一段代码而已,如果不主动调用函数,函数是不会主动执行的。

定义函数的格式如下:

def function_name(arg1, arg2):
	function body
	return value

函数名(function_name):和Python中其它的标识符命名规则相同,有效的函数名以字母或下划线开头,后面可以跟字母、数字或下划线,函数命名应以能够反映函数功能为准则;Python中的函数名区分大小写,字母相同但大小写不同的函数是不同的。

函数参数(arg1, arg2):调用一个函数时可以传递的数据,分为形参和实参;参数可以有一个或多个,也可以没有。

函数体(function body):任何有效的代码都可以出现在函数体中,函数体中的代码需要缩进四个空格。

函数返回值(return value):函数执行完成后返回的值;也可以不返回任何内容,不返回内容可视为返回 "None" 。

函数的定义
print('定义函数')

def say_hello(name):
    print('hello', name)

say_hello('python')  # hello python
say_hello('人工智能')  # hello 人工智能
say_hello(1024)  # hello 1024
执行结果如下:
定义函数
hello python
hello 人工智能
hello 1024

2 函数的参数

对于设置参数的函数,当调用函数时需要向函数传递参数,被传入的参数称为实参,而函数定义时的参数称为形参。

Python中函数的参数可以分成必须参数、关键字参数、默认参数、可变参数和组合参数。

2.1 必须参数

必须参数,顾名思义就是函数定义的参数在调用时必须传入,并且在调用时传入的参数的数量和顺序必须和定义时的参数保持一致。

必须参数
print('必须参数')

def two_arg_function(arg1, arg2):
    print('第一个参数', arg1)
    print('第二个参数', arg2)

two_arg_function(10, '我们')  # 传入的参数数量不能多也不能少,否则会报错
执行结果如下:
必须参数
第一个参数 10
第二个参数 我们
2.2 关键字参数

使用关键字参数可以不按函数定义时的参数的顺序来调用函数,Python解释器能够根据函数定义时的参数名来匹配参数。

关键字参数
print('关键字参数')

def key_arg_function(name, age):
    print('姓名:', name)
    print('年龄:', age)

key_arg_function(name='张三', age=18)  # 按顺序传递参数
key_arg_function(age=20, name='李四')  # 不按顺序传递参数
执行结果如下:
关键字参数
姓名: 张三
年龄: 18
姓名: 李四
年龄: 20
2.3 默认参数

在定义函数时我们可以给参数添加默认值,如果调用函数时没有传入参数,函数就会使用默认值。

注意,默认参数必须定义在参数列表的最后,在默认参数之后不能再定义必须参数,否则会报错。

默认参数
print('默认参数')

def default_arg_function(name, age=18):
    print('姓名:', name)
    print('年龄:', age)

default_arg_function(name='阿飞', age=25)  # 给参数age赋予一个值
default_arg_function('小米')  # 使用age的默认值18
执行结果如下:
默认参数
姓名: 阿飞
年龄: 25
姓名: 小米
年龄: 18
2.4 可变参数

在某些情况下,我们不能在定义函数的时候就确定参数的数量和内容,这时候就可以使用可变参数。

可变参数在声明时不会命名。

可变参数的格式如下:

some_function(*args, **kwargs):
	function body
可变参数
print('*args')

def variable_arg(*args):
    print(args)

variable_arg()
variable_arg(1, 2)
variable_arg('Hello 人工智能')
# '*args'参数获取到的是一个元组

print('---------')
print('**kwargs')

def variable_kwarg(**kwargs):
    print(kwargs)

variable_kwarg()
variable_kwarg(name='人工智能')
# '**kwargs'参数获取到的是一个字典,所以在调用函数时必须使用关键字参数的方式来传递参数
执行结果如下:
*args
()
(1, 2)
('Hello 人工智能',)
---------
**kwargs
{}
{'name': '人工智能'}

3 函数的变量作用域

被赋值的变量不是在哪里都可以使用的,如何定义变量决定了变量可以在哪里被使用。

Python中变量赋值的位置决定了哪些范围的对象可以访问这个变量,这个范围就被称为作用域。

Python中有两种最基本的变量作用域:局部变量和全局变量。

3.1 局部变量

一般情况下,在函数内赋值的变量,不做特殊声明的都是局部变量。

局部变量的作用域是局部的,在当前函数赋值则只能在当前函数使用。

函数定义时的参数也是局部变量,只能在函数体内被访问,超出函数体就不能正常执行。

局部变量
print('局部变量')

def local_variable1():
    x = 'hello'
    print(x)  # 此句代码如果写在函数体外,则会报错,因为这里的x定义在函数体内,是局部变量

local_variable1()


def local_variable2(x):
    print(x)  # 此句代码如果写在函数体外,一样会报错,因为参数也是局部变量

local_variable2(10)
执行结果如下:
局部变量
hello
10
3.2 全局变量

在函数外赋值的变量就是全局变量,全局变量可以在整个程序范围内被访问。

函数体内的重新赋值的相同变量名,并不会改变函数体外的全局变量;因为在函数体内定义一个相同的变量名,其实是创建了一个新的变量,只是名字与函数体外的相同。

如果要在函数体内对全局变量进行修改,一定要使用 "global" 关键字。

全局变量
print('全局变量')

x = 'Hello Python'

def global_variable1():
    print(x)  # 这里输出的是全局变量x的值

global_variable1()


def global_variable2():
    x = 10
    print(x)  # 这里输出的是函数体内的局部变量x的值

global_variable2()


def global_variable3():
    global x
    x = 'Hi 人工智能'
    print(x)

global_variable3()
print(x)  # 验证全局变量的值是否改变
执行结果如下:
全局变量
Hello Python
10
Hi 人工智能
Hi 人工智能

4 函数的返回值

想要获取函数中的局部变量,可以使用 "return" 关键字返回。

函数没有return,赋值会得到 "None" ;函数有return但没有返回值,赋值也会得到 "None" ;函数既有return又有返回值,就可以通过赋值的方式获取函数的返回值。

Python中函数的返回值可以返回不止一个值;有多个返回结果时,Python会返回一个元组。

函数的返回值
print('返回值')

def ret():
    x = '局部变量'
    return x  # 返回x的值

result = ret()
print(result)

print('---------')

def no_return():
    print('没有return')

def no_return_value():
    print('有return没有返回值')
    return

def has_return():
    print('有return有返回值')
    x = 'has return value'
    return x

result1 = no_return()
print(result1)  # 输出None

result2 = no_return_value()
print(result2)  # 输出None

result3 = has_return()
print(result3)  # 输出has return value

print('---------')
print('多个返回值')

def multi_return_value():
    r1 = '第一个返回值'
    r2 = '第二个返回值'
    r3 = '第三个返回值'
    return r1, r2, r3

result = multi_return_value()
print(result)
执行结果如下:
返回值
局部变量
---------
没有return
None
有return没有返回值
None
有return有返回值
has return value
---------
多个返回值
('第一个返回值', '第二个返回值', '第三个返回值')

5 Lambda表达式

Lambda表达式也称作匿名函数。通常在需要一个函数、但又不想费神去命名它的时候,就可以使用匿名函数。

Lambda表达式的格式如下:

lambda 参数名:返回值

以 "lambda" 开头,表示这个是lambda表达式;之后的内容由 ":" 分为两部分, ":" 左边的是函数的参数, ":" 右边的是要返回的值;lambda表达式不需要用 "return" 关键字返回内容,函数会默认返回 ":" 右边的值。

lambda表达式可以赋值给变量。

lambda表达式一般在两种情况下使用:

​ (1)程序只执行一次,不需要定义函数名,使用lambda表达式方便定义,并且节省了内存中变量的定义;

​ (2)在某些函数中必须以函数作为参数,但是函数本身十分简单而且只在一处使用。

lambda表达式
print('lambda表达式')
f = lambda x, y: x + y  # x, y为参数;x + y为返回值
z = f(1, 2)  # 传递两个实参
print(z)
执行结果如下:
lambda表达式
3
posted @ 2021-01-11 23:10  南城_以南  阅读(165)  评论(0编辑  收藏  举报