一、函数的概述
(一)函数的类别
通常我们使用的函数分为两大类:内置函数和自定义函数。
内置函数是在编程语言中已经预定义好的函数,可以直接调用,比如Python中的print()函数和len()函数。这些函数通常用于实现常见的任务,比如输出文本和计算数组长度。常用的内建函数如图所示。
自定义函数是开发人员自行编写的函数。这些函数具有特定的功能,并可以通过调用来执行它们。自定义函数可以根据需要添加参数和返回值,以便满足程序员的要求。自定义函数可以增强代码的重用性,使得程序逻辑更加清晰明了。例如,在Python中,开发人员可以使用def关键字定义自己的函数。如下代码演示了自定义函数printme()的定义和调用过程。
# 自定义函数
def printme(str):
"函数功能:打印传入的字符串"
print(str)
# 调用自定义函数
printme("调用用户自定义函数!")
printme("再次调用用户自定义函数!")
输出结果:
调用用户自定义函数!
再次调用用户自定义函数!
(二)函数的定义
在Python语言中,函数通常是由函数名、参数列表以及一系列语句组成的函数体构成的。函数定义的一般格式如下:
def 函数名(参数列表):
函数体
def age():
print("我今年的年纪是:",26)
age()
注意:上述示例中age()函数虽然不包含任何参数,但是函数名后的一对括号
是不能省略
的。在实际应用中,稍复杂的函数通常都会包含一个或多个参数。
二、形参与实参
(一)形参与实参的概述
函数定义时用的是形参,调用时用的是实参。
- 形参是函数定义时声明的变量,在函数内部用于接收传递进来的实参值。
- 实参是在函数调用时传递给函数的值,它们可以是任何表达式或变量。
- 形参和实参之间的关系是:函数定义时声明的形参用于接收函数调用时传递的实参值。
(二)示例
要求:计算一个半径为10的圆的面积
# 注释:首先直接采用公式计算求出正确值
area=3.14*10*10
print(area)
#使用函数
#构造函数area1:无参数,无返回值
def area1():
print(3.14*10*10)
area1()
#构造函数area2:有参数,无返回值
def area2(r):
print(3.14*r*r)
area2(10)
#构造函数area3:无参数,有返回值
def area3():
return 3.14*10*10 #返回值
print(area3())
#构造函数area4:有参数,有返回值
def area4(r):
return 3.14*r*r
print(area4(10))
(三)总结
返回值总结 #没有返回值,直接调用函数 #有返回值,将返回值当作一个值使用 参数值总结 #没有参数值,函数的功能是固定的,比如:计算半径为10的面积 #有参数值,函数更加灵活,比如:能计算更多半径的圆形面积
练习:计算边长为10的正方形的面积
#不使用函数直接计算
area=10*10
print(area)
#使用函数
#构造函数area1:无参数,无返回值
def area1():
print(10*10)
area1()
#构造函数area2:有参数,无返回值
def area2(r):
print(r*r)
area2(10)
#构造函数area3:无参数,有返回值
def area3():
return 10*10
print(area3())
#构造函数area4:有参数,有返回值
def area4(r):
return r*r
print(area4(10))
三、常见函数参数
(一)参数类型
- 可变类型:类似c++的引用传递,如列表、字典等。如果传递的参数是可变类型,则在函数内部对传入参数的修改会影响到外部变量。
- 不可变类型:类似c++的值传递,如整数、字符串、元组等。如果传递的参数是不可变类型,则在函数内部对传入参数的修改不会影响到外部变量。
(二)位置参数
位置参数是一种在函数定义中指定参数的方式。在此方法中,函数的参数根据其出现的位置进行匹配。例如,以下函数定义中,x 和 y 是位置参数:
def add(x, y):
return x + y
在调用函数时,必须按相同的顺序提供参数:
result = add(2, 3)
在此示例中,2 被分配给 x,3 被分配给 y,add() 函数返回 5。如果位置参数的数量不正确,将引发 TypeError。
(三)默认参数
在Python中,函数可以使用默认参数。默认参数是在函数定义时指定的参数值,如果调用者没有提供该参数的值,则使用默认值。
以下是一个具有默认参数的函数示例:
def greet(name='world'):
print('Hello,', name)
# 调用函数
greet() # 输出:Hello, world
greet('Alice') # 输出:Hello, Alice
在上面的示例中,greet()
函数具有一个名为name
的默认参数,其值为'world'
。如果该函数没有传递任何参数,则使用默认值'world'
。如果函数调用者传递了参数,则使用传递的参数值。
可以在定义函数时使用任意数量的默认参数。但是,必须确保在声明默认参数时,将它们放在其他参数的后面,例如:
def greet(greeting, name='world'):
print(greeting, name)
# 调用函数
greet('Hello') # 输出:Hello world
greet('Hi', 'Alice') # 输出:Hi Alice
在上面的示例中,greeting
参数是非默认参数,而name
是默认参数。在定义时,需要先定义非默认参数,然后再定义默认参数。
(四)不定长参数
不定长参数是指函数的参数数量可以不确定,可以传递任意个参数。在 Python 中,可以通过在函数定义时使用 *args 和 **kwargs 来实现不定长参数。
*args 用于传递任意数量的位置参数,它将所有的位置参数收集到一个元组中。
**kwargs 用于传递任意数量的关键字参数,它将所有的关键字参数收集到一个字典中。
示例代码:
def func1(*args):
print(args)
def func2(**kwargs):
print(kwargs)
func1(1, 2, 3, 4) # 输出:(1, 2, 3, 4)
func2(a=1, b=2, c=3) # 输出:{'a': 1, 'b': 2, 'c': 3}
可以看到,通过使用 *args 和 **kwargs,我们可以接受任意数量的参数,这在一些情况下会非常方便。
注意:
*表示不定长参数
**表示不定长的关键字参数
(五)关键字参数
关键字参数是指在函数调用时,通过指定参数名称来传递参数值的方式。在函数定义时,使用参数名称来定义函数,例如:
def my_func(name, age):
print("My name is", name)
print("I am", age, "years old")
在调用函数时,可以通过指定参数名称来传递参数值:
my_func(age=20, name="Tom")
这里,使用参数名称来传递参数值,使得可以更清晰地表达参数的含义。关键字参数还可以用来指定函数的默认值,例如:
def my_func(name, age=18):
print("My name is", name)
print("I am", age, "years old")
在调用函数时,如果不传递参数 age,则自动使用默认值,例如:
my_func(name="Tom")
注意参数定义是有顺序的。定义的顺序
必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
。
资料来源Python基础语法02:函数