Python函数
Python函数
函数概述
函数就是 Python 程序的重要组成单位,一个 Python 程序可以由很多个函数组成。函数是组织好的,可重复使用的,用来实现单一或相
关联功能的代码段,函数能提高应用的模块性,和代码的重复利用率。
我们已经知道Python提供了许多内置函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
在本章节我们重点来讲解如何自定义函数,以及如何定义和使用函数。
函数定义
函数概述
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号( )。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法格式:
def 函数名(参数列表):
方法体
[return [返回值]]
详细说明
函数名:
从语法角度来看,函数名只要是一个合法的标识符即可,从程序的可读性角度来看,函数名应该由一个或多个有意义的单词
连缀而成,每个单词的字母全部小写,单词与单词之间使用下画线分隔。
形参列表:
用于定义该函数可以接收的参数,形参列表由多个形参名组成,多个形参名之间以英文逗号( ,)隔开。
一旦在定义函数时指定了形参列表,调用该函数时就必须传入到对应的参数值,谁调用函数,谁负责为形参赋值。
返回值:
如果不显示写
return
关键字,则函数返回None
,如果显示写return
则返回对应的结果。
定义函数类型
无参数函数
def fun(): print("python") fun()
无参数函数
def fun(age): #age称之为形式参数 print("年龄:", age) fun(23) # 23称之为实际参数
有返回值函数
def fun(age): return age fun(23)
为函数提供文档
我们可以给函数编写帮助文档,利用help()函数来查看指定函数的使用信息。
help(len) # 查看 len函数的用法
只要把一段字符串放在函数声明之后、函数体之前,这段字符串将被作为函数的部分,这个文档就是函数的说明文档
def getMax(x, y):
"""
求两数最大值,需要传入两个参数
:param x: 第一个值
:param y: 第二个值
:return: 返回最大值
"""
res = x if x > y else y
return res
help(getMax) # 使用help函数查看
多个返回值
如果程序需要有多个返回值,可直接返回多个值,然后一一对应去接收。
如果Python 函数直接返回多个值, Python 会自动将多个返回值封装成元组。
函数参数
概述
Python中函数的参数名不是无意义的, Python允许在调用函数时通过名字来传入参数值,因此,Python函数的参数名应该具有更好的语
意化。程序可以立刻明确传入函数的每个参数的含义。
在定义 Python 函数时可定义形参 ,这些形参的值要等到调用时才能确定下来,由函数的调用者负责为形参传入参数值。
简单来说,就是谁调用函数,谁负责传入参数值。在Python中函数的参数有很多种传参的形式,比如位置参数、关键字参数、默认值参
数、参数收集、其中参数收集也分为正向参数收集和逆向参数是收集。
位置参数
按照 形参位置 传入的参数被称为 位置参数 ,如果使用位置参数方式来传入参数值,必须按照定义函数时指定的顺序来传入参数值。
def getValue(a, b):
print(a, b)
# 按照位置传参
getValue(2, 5)
关键字参数
如果根据 参数名来 传入参数值,则无须遵守定义形参的顺序,这种方式被称为 关键字参数 。
def getValue(a, b):
print(a, b)
# 关键字参数 传参
getValue(a=2, b=5)
# 位置可以交换
getValue(b=2, a=5)
# 部分使用位置参数,部分使用关键字参数
getValue(2, b=5)
# 关键字参数必须 在最后
# getValue(a=2, 5)
默认参数值
在某些情况下,程序需要在定义函数时为一个或多个形参指定默认值,这样在调用函数时就可以省略为该形参传入参数值,而是直接使用
该形参的默认值。
def name_fun(name='python', age=23):
print("名字是:" + name)
print("年龄是:", age)
name_fun() # 全部使用默认参数
name_fun("张三") # 只有age使用默认参数
name_fun("李四", 24) # 都不使用默认参数
注意,python要求带默认值的参数,应该定义在形参列表的最后,如果默认值参数放在参数列表首位则会报错。
def fun(name, age=23):
print(name)
print(age)
fun("zs")
参数收集
正向参数收集
Python 允许在形参前面添加一个星号或者两个星号,这样就意味着该参数可接收多个参数值,如果使用一个星号则多个参数值被当成元
组传入,如果使用两个星号则多个参数值被当成字典传入,这就是 正向参数收集 ,而且传入的参数个数是可以改变的。
def test(num, *info):
print(num)
print(info)
print(type(info))
test(5, "python", "函数")
注意:Python要求一个函数最多只支持一个 参数收集 的形参。
如果参数收集放在形参首位,则后续实参必须使用关键字参数传递。
def test(*info, num):
print(num)
print(info)
print(type(info))
test("python", "函数", num=5)
如果参数前面添加两个星号,则会把参数值当作字典处理。
def test(x, y, *info, **dict1):
print(x, y)
print(info)
print(dict1)
test(1, 2, "python", "函数", a=77, b=78)
逆向参数收集
所谓 逆向参数收集 ,指的是在程序己有列表、元组、 字典等对象的前提下,把它们的元素拆开后 传递 给函数的参数,
逆向参数收集 需要在传入的列表、元组参数之前加一个星号,在字典之前添加两个星号。
def test(a, b, age, name):
print(a, b)
print(age, name)
listValue = [1, 2]
dictValue = {"name": "zs", "age": 23}
test(*listValue, **dictValue)
注意:形式参数的名字要和字典的键的名字一致。
函数参数传递机制
按值传递
所谓值传递,就是值传递,就是将参数的副本,就是复制品传入函数中, 而参数本身不会受任何影响 。
def test(a):
a = 2
print(f"test函数内的a:{a}")
a = 1
test(a)
print(f"函数外的a:{a}")
方法内部修改的只是复制的那一个副本,对于方法外的a本身的数值,是没有任何影响的。
按值传递另一种情况
按值传递另一种情况可以理解为按引用传递,引用就是地址,地址也是一份变量值,所以也算值传递。
所谓引用传递,就是把引用,也就是地址复制一份,然后传入函数中, 而参数本身是会受任何影响的。
def test(listValue):
listValue[0] = 20
print(f"函数内的列表第一个元素值是:{listValue[0]}")
listValue = [10]
test(listValue)
print(f"函数外的列表第一个元素值是:{listValue[0]}")
注意:Python中列表和元组和字典都是把存储数据的空间的地址复制一份传递给了函数,所以函数内或者外修改的值等同于修改同一份。
变量作用域
在程序中定义一个变量时,这个变量是有作用范围的,变量的作用范围被称为它的作用域。
根据定义变量的位置,变量分为两种:
局部变量
- 在函数中定义的变量,包括参数,都被称为局部变量。
全局变量
在函数外面、全局范围内定义的变量, 被称为全局变量。
x = 100 y = 200 def test(): age = 20 print(age) # 20 print(globals()) globals()["x"] = 1000 # 访问全局变量 print(x) # 300 y = 2000 print(y) # 访问局部变量 print(locals()['y']) # 访问局部变量 print(globals()['y']) # 访问全局变量 test()
实际上,Python提供了如下两个工具函数来获取指定范围内的“变量字典”:
globals():
- 该函数返回全局范围内所有变量组成的 变量字典 。
locals():
- 该函数返回当前局部范围内所有变量组成的 变量字典 。
注意:在使用 globals() 和 locals() 访问全局变量的“变量字典”时,将会看到程序输出 “变量字典“ 默认包含了很多变量,这些都是 Python
程序内置的,我们可以忽略。
函数高级
使用函数变量
Python 函数也是一种值,所有函数都是 function 对象,这意味着可以把函数本身赋值给变量,就像把整数、浮点数、列表、元组赋值给
变量一样。当把函数赋值给变量之后,接下来程序也可通过该变量来调用函数。
import math
def area(r):
print(math.pi * math.pow(r, 2))
getArea = area
area(2)
getArea(2)
# 查看变量类型
print(type(area))
print(type(getArea))
函数作为函数形参
有时候需要定义一个函数, 该函数的大部分计算逻辑都能确定,但某些处理逻辑暂时无法确定,这意昧着某些程序代码需要动态改变,
如果希望调用函数时能动态传入这些代码,那么就需要在函数中定义函数形参,这样即可在调用该函数时传入不同的函数作为参数,
从而动态改变这段代码。
def test(e):
e(100)
def fun(n):
print(n)
test(fun)
使用函数作为返回值
就是一个函数的返回值是另一个函数,函数内部定义的函数,也是局部函数。
def test():
def fun(n):
print(n)
return fun
result = test()
result(10)
ambda表达式
概述
在 Python 中,
lambda
函数(也称为匿名函数)是一种创建小型、临时函数的简洁方式。与使用
def
关键字定义的标准函数不同,
lambda
函数没有名字,并且它们只能包含一个表达式。
lambda
函数的语法非常紧凑,非常适合用于需要简短函数的地方。
在 lambda 关键字之后、冒号左边的是参数列表,可以没有参数,也可以有多个参数 如果有多个参数, 需要用逗号隔开,
冒号右边是该 lambda 表达式的返回值。
result = lambda x, y : x + y
实际上, lambda 表达式的本质就是匿名的、单行函数体的函数。因此, lambda 表达式可以写成函数的形式。