一步一步学python之(12)函数

文章目录

  • 一步一步学python之(12)函数
    • 一、内置函数
    • 二、自定义函数
      • 1. 函数定义
      • 2.函数调用
        • 2.1 位置参数
        • 2.2 关键字参数
        • 2.3 可变参数
        • 2.4 匿名函数
      • 3.嵌套函数

一步一步学python之(12)函数

我们通常说的函数主要分为两大类,内置函数和自定义函数。
内置函数就是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次幂的余数计算。
print 输出到标准输出设备的一个函数,可以同时输出多个对象,并可以通过参数控制输出的格式和内容。
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) 将对象转换为字符串表示形式。

二、自定义函数

1. 函数定义

自定义函数是需要开发者自己编写的函数,函数的定义如下:

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

def关键字:函数以def关键字开头,其后一定要空格,后跟函数名()和冒号。
函数名:用于标识函数的名称,遵循标识符的命名规则。
参数列表:参数之间用逗号分隔,可以为空,但是()不能省略。
函数体:是这个函数需要做的事情,由单行或多行程序代码组成,这个语句块的整体必须保持缩进。函数体中可以使用return关键字返回函数的结果。当然函数也可以没有返回结果。

2.函数调用

当自定义的函数开发完成后我们就可以调用我们的自定义函数。调用方式为

函数名([参数列表])

比如我们定义了一个求和函数:

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)调用函数的过程就是将实参传递给形参的过程。
根据不同的传递形式,函数的参数可分为:位置参数、关键字参数、默认参数、可变参数。我们分别来看下他们是如何使用的。

2.1 位置参数

函数调用时,默认情况下,实参将按照位置顺序传递给形参。例如一下求和函数(求x+y的值)

def sum_number(x, y):
    return x + y

当我们传参时,按照如下调用方式:

sum_number(10,20)

此时的位置传递的意思就是实参10传给形参x,实参20传给形参y。

2.2 关键字参数

简单来说就是要按照函数中定义的名称来传递参数。还是以我们刚才的函数为例:

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)

2.3 可变参数

函数定义时可以使用单星号* 和双星号** 来处理可变数量的参数。
单星号 :用于接收不定数量的位置参数,调用函数时传入的所有参数被接收后以元组形式呈现。
双星号 ** :用于接收不定数量的关键字参数,调用函数时传入的所有参数被接收后以字典形式呈现。
(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'}
2.4 匿名函数

顾名思义,匿名函数就是指没有名字的函数。Python通过lambda关键字支持匿名函数,lambda函数可以接受任何数量的参数,但只能有一个表达式。格式如下:

lambda arguments: expression

其中arguments可以是多个参数(也可以是0个)。
还是以我们的求和函数为例:

sum =lambda  x,y: x+y

调用匿名函数:

print(sum(1,2))

打印我们的程序结果为3(1+2)

3.嵌套函数

在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的值。

你可能感兴趣的:(python,python,开发语言)