我们通常说的函数主要分为两大类,内置函数和自定义函数。
内置函数就是python自带的函数,可以直接调用。自定义函数就是我们开发者自己编写的函数。
我们分别来看一下这两类函数。
python内置了一些实现特定功能的函数叫内置函数,这些函数无需由使用者重新定义,可直接供开发者使用。下面是一些常用的内置函数:
函数名 | 功能描述 |
---|---|
abs (x) | 返回一个数的绝对值。 |
all (iterable) | 如果iterable的所有元素均为真值,则返回True。 |
any (iterable) | 如果iterable中至少有一个元素为真值,则返回True。 |
bin (x) | 将一个整数转换为二进制表示的字符串。 |
bool (x) | 将一个值转换为布尔值。 |
bytearray ([source[, encoding[, errors]]) | 创建一个可变的字节序列。 |
callable (object) | 检查对象是否可调用。 |
chr (i) | 返回一个整数i的Unicode字符。 |
classmethod (function) | 将一个方法转换为类方法。 |
delattr (object, name) | 删除对象的属性。 |
dict ([arg]) | 创建一个空字典。 |
dir ([object]) | 返回对象的属性列表。 |
divmod (x, y) | 返回商和余数。 |
enumerate (iterable, start=0) | 将一个可迭代对象组合为一个索引序列,加上对应值的迭代器。 |
eval (expression[, globals[, locals]]) | 执行一个字符串表达式,并返回表达式的值。 |
exec (object[, globals[, locals]]) | 执行存储在对象中的代码。 |
filter (function_or_none, iterable) | 过滤序列,返回一个迭代器。 |
float (x) | 将一个字符串或数字转换为浮点数。 |
format (value, format_spec) | 返回value的格式化表示。 |
frozenset (iterable) | 创建一个不可变的集合。 |
globals() | 返回当前全局符号表的字典。 |
hasattr (object, name) | 检查对象是否有给定的属性。 |
hash (object) | 返回对象的哈希值。 |
help (object) | 打印对象的文档字符串。 |
hex (x) | 将一个整数转换为十六进制表示的字符串。 |
id (object) | 返回对象的唯一标识符。 |
input (prompt=None) | 从标准输入读取一行并返回结果。 |
int (x, base=10) | 将一个数或字符串转换为整数。 |
isinstance (object, classinfo) | 检查对象是否是一个类的实例。 |
issubclass (class, classinfo) | 检查一个类是否是另一个类的子类。 |
iter (iterable) | 获取可迭代对象的迭代器。 |
len (s) | 返回对象的长度或项目数。 |
list (iterable) | 将一个可迭代对象转换为列表。 |
locals() | 返回当前局部符号表的字典。 |
map (function, iterable) | 对序列的每个元素应用一个函数,并返回结果列表。 |
max (iterable) | 返回序列中的最大项。 |
memoryview(obj) | 返回给定参数的内存查看对象。 |
min (iterable) | 返回序列中的最小项。 |
next (iterator[, default]) | 获取迭代器的下一个项目,否则返回default。 |
object | 创建一个新的对象实例。 |
oct (x) | 将一个整数转换为八进制表示的字符串。 |
open (file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) | 打开文件并返回文件对象。 |
ord © | 返回字符c的Unicode码点。 |
pow(x, y[, z]) | 返回x的y次幂,如果z存在,则再对结果进行z次幂的余数计算。 |
输出到标准输出设备的一个函数,可以同时输出多个对象,并可以通过参数控制输出的格式和内容。 | |
range(start, stop[, step]) | 生成一个数字序列,常用于for循环中生成迭代器。 |
repr(object) | 获取对象的官方字符串表示形式,通常用于调试和日志记录。 |
reversed(seq) | 返回一个反转的迭代器对象。 |
round(number[, ndigits]) | 四舍五入到小数点后n位。 |
set(iterable) | 创建一个集合对象,包含所有唯一的元素。 |
slice(start, stop[, step]) | 生成切片对象,用于切片操作。 |
sorted(iterable, key=None, reverse=False) | 对所有元素进行排序并返回排序后的列表。 |
staticmethod(function) | 将一个方法转换为静态方法。 |
str(object) | 将对象转换为字符串表示形式。 |
自定义函数是需要开发者自己编写的函数,函数的定义如下:
def 函数名([参数列表]):
函数体
def关键字:函数以def关键字开头,其后一定要空格,后跟函数名()和冒号。
函数名:用于标识函数的名称,遵循标识符的命名规则。
参数列表:参数之间用逗号分隔,可以为空,但是()不能省略。
函数体:是这个函数需要做的事情,由单行或多行程序代码组成,这个语句块的整体必须保持缩进。函数体中可以使用return关键字返回函数的结果。当然函数也可以没有返回结果。
当自定义的函数开发完成后我们就可以调用我们的自定义函数。调用方式为
函数名([参数列表])
比如我们定义了一个求和函数:
def sum_numbers(numbers):
total = 0
for number in numbers:
total += number
return total
接下我们就可以调用我们的函数了:
numbers = [1, 2, 3, 4, 5]
print(sum_numbers(numbers))
这里对参数做一下说明:
(1)定义函数时,参数表中的参数称为形式参数,也称形参。
(2)调用函数时,参数表中的参数称为实际参数,也称实参。
(3)调用函数的过程就是将实参传递给形参的过程。
根据不同的传递形式,函数的参数可分为:位置参数、关键字参数、默认参数、可变参数。我们分别来看下他们是如何使用的。
函数调用时,默认情况下,实参将按照位置顺序传递给形参。例如一下求和函数(求x+y的值)
def sum_number(x, y):
return x + y
当我们传参时,按照如下调用方式:
sum_number(10,20)
此时的位置传递的意思就是实参10传给形参x,实参20传给形参y。
简单来说就是要按照函数中定义的名称来传递参数。还是以我们刚才的函数为例:
def sum_number(x, y):
return x + y
那么该如何来进行关键字传参呢,只需要传参时带上形参的名字即可。看下面两个例子:
sum_number(a=10,b=20)
sum_number(b=20,a=10)
因此我们可以看出这样一个结论:
调用函数时关键字参数出现的顺序,与它们在函数定义中出现的真正顺序可以没有任何关系。
def sum_number(x, y=100):
return x + y
这样我们就定义了一个默认参数y,此处需要注意的是默认参数的该位于函数定义中参数列表的末尾
我们调用时,如果想用y的默认值,只需要传入x的参数值即可。如下所示:
sum_number(10)
这样结果就是110(10+100=110)
当然我们也可以传入具体的值,这样默认值100就不会生效,而是使用我们自己传入的值,比如:
sum_number(10,20)
结果就是30(10+20=30)
函数定义时可以使用单星号* 和双星号** 来处理可变数量的参数。
单星号 :用于接收不定数量的位置参数,调用函数时传入的所有参数被接收后以元组形式呈现。
双星号 ** :用于接收不定数量的关键字参数,调用函数时传入的所有参数被接收后以字典形式呈现。
(1) 单星号*
还是以我们的求和函数为例:
def sum_number(*numbers):
total = 0
for number in numbers:
total += number
return total
我们定义了一个可变参数,这样我们调用的时候可以传多个参数。
sum_number(1, 2, 3,4)
sum_number(1, 2, 3, 4, 5)
我们分别调用了2次函数,传的参数也不一样。
(2) 双星号*
还是以我们的求和函数为例:
def sum_number(**numbers):
total = 0
for key, value in numbers.items():
total += value
return total
我们调用时
sum_number(a=1, b=2, c=3,d=4)
其实从代码里可以看到我们的实现方式不一样了,原因就是在于参数的呈现方式不一样,一个是元组,一个是字典。
既然我们知道**可变参数是以字典形式出现,那么我们就可以我们传入的关键字参数一起打印出来,我们换个例子来看下效果:
def printInfo(**info):
for key, value in info.items():
print(f"{key}: {value}")
我们调用函数:
printInfo(name="骑着蜗牛百米冲刺", age=99, city="qingdao")
这样输入的结果如下:
name: 骑着蜗牛百米冲刺
age: 99
city: qingdao
那么我们是不是可以这两种参数方式同时使用呢,答案是肯定的。我们来一起看一下一起使用的方式,
def printInfo(*args, **kwargs):
print("位置参数元组:", args)
print("关键字参数字典:", kwargs)
调用我们的函数
printInfo(1, "a", name="骑着蜗牛百米冲刺", age=99, city="qingdao")
输出结果如下:
位置参数元组: (1, 'a')
关键字参数字典: {'name': '骑着蜗牛百米冲刺', 'age': 99, 'city': 'qingdao'}
顾名思义,匿名函数就是指没有名字的函数。Python通过lambda关键字支持匿名函数,lambda函数可以接受任何数量的参数,但只能有一个表达式。格式如下:
lambda arguments: expression
其中arguments可以是多个参数(也可以是0个)。
还是以我们的求和函数为例:
sum =lambda x,y: x+y
调用匿名函数:
print(sum(1,2))
打印我们的程序结果为3(1+2)
在Python中,嵌套函数(也称为内部函数或闭包)是一种非常有用的特性,它允许你在一个函数内部定义另一个函数。
def outerFun():
x = 10
def innerFun():
x = 20
print("Inner:", x)
innerFun()
print("Outer:", x)
outerFun()
以上示例这就是嵌套函数,在外部函数outerFun函数内部定义了函数名为innerFun,即函数内部又定义了函数。
运行以上代码可以发现结果为:
Inner: 20
Outer: 10
这是是不是有疑问,为什么在内部函数中把变量x赋值了20后,外部变量x值没有更改,还是10,其实这就要牵扯到变量作用域的问题了,下一节我会介绍这部分的内容,以及如何修改外部变量x的值。