Python 函数

Python 函数是返回特定任务的语句块。这个想法是将一些常见或重复完成的任务放在一起并创建一个函数,这样我们就可以进行函数调用来一遍又一遍地重用其中包含的代码,而不是一次又一次地为不同的输入编写相同的代码。

使用函数的一些好处

  • 提高代码可读性 
  • 提高代码的可重用性

Python 函数声明

声明函数的语法是:

Python 函数

Python 中的函数类型

Python中主要有两类函数。

  • 内置库函数:这些是Python 中可供使用的标准函数。
  • 用户自定义函数:我们可以根据自己的需求创建自己的函数。

在 Python 中创建函数

我们可以使用def关键字在 Python 中创建用户定义的函数。我们可以根据需要向其添加任何类型的功能和属性。

# A simple Python function

def fun():
print("Welcome to JKHXW")

调用 Python 函数

在 Python 中创建函数后,我们可以使用函数名称后跟包含该特定函数参数的括号来调用它。

# A simple Python function
def fun():
	print("Welcome to JKHXW")


# Driver code to call a function
fun()

输出:

Welcome to JKHXW

带参数的 Python 函数

如果您有 C/C++ 或 Java 经验,那么您必须考虑函数的返回类型和参数的数据类型。这在 Python 中也是可能的(特别是对于 Python 3.5 及更高版本)。

定义和调用带参数的函数

 def function_name(parameter: data_type) -> return_type:
    """Docstring"""
    # body of the function
    return expression

以下示例用于执行两个整数相加。add 函数定义了两个输入参数 num1 和 num2,它们都被注释为整数类型,并且指定了函数的返回类型为整数 int。

def add(num1: int, num2: int) -> int:
	"""Add two numbers"""
	num3 = num1 + num2

	return num3

# Driver code
num1, num2 = 5, 15
ans = add(num1, num2)
print(f"The addition of {num1} and {num2} results {ans}.")

输出:

The addition of 5 and 15 results 20.

Python 函数参数

参数是在函数括号内传递的值。函数可以有任意数量的参数,并用逗号分隔。

在此示例中,我们将在 Python 中创建一个简单的函数,以检查作为参数传递给该函数的数字是偶数还是奇数。

# A simple Python function to check
# whether x is even or odd
def evenOdd(x):
	if (x % 2 == 0):
		print("偶数")
	else:
		print("奇数")


# Driver code to call the function
evenOdd(2)
evenOdd(3)

输出:

偶数
奇数

Python 函数参数的类型

Python 支持在函数调用时传递的各种类型的参数。在 Python 中,我们有以下 4 种类型的函数参数。

  • 默认参数
  • 关键字参数(命名参数)
  • 位置参数
  • 任意参数(可变长度参数 *args 和 **kwargs)

让我们详细讨论每种类型。 

默认参数

默认参数是一种参数,如果在函数调用中未提供该参数的值,则该参数采用默认值。以下示例说明了默认参数。 

# Python program to demonstrate
# default arguments
def myFun(x, y=50):
	print("x: ", x)
	print("y: ", y)


# Driver code (We call myFun() with only
# argument)
myFun(10)

输出:

x: 10 
y: 50

与 C++ 默认参数一样,函数中任意数量的参数都可以有默认值。但是一旦我们有了默认参数,它右边的所有参数也必须有默认值。

关键字参数

这个想法是允许调用者指定带有值的参数名称,以便调用者不需要记住参数的顺序。

# Python program to demonstrate Keyword Arguments
def student(firstname, lastname):
	print(firstname, lastname)


# Keyword arguments
student(firstname='Geeks', lastname='Practice')
student(lastname='Practice', firstname='Geeks')

输出:

Geeks Practice
Geeks Practice

位置参数

我们在函数调用期间使用了Position 参数,以便第一个参数(或值)分配给 name,第二个参数(或值)分配给age。通过更改位置,或者如果您忘记了位置的顺序,这些值可能会用在错误的位置,如下面的案例 2 示例所示,其中 27 分配给姓名,Suraj 分配给年龄。

def nameAge(name, age):
	print("Hi, I am", name)
	print("My age is ", age)


# You will get correct output because
# argument is given in order
print("Case-1:")
nameAge("Suraj", 27)
# You will get incorrect output because
# argument is not in order
print("\nCase-2:")
nameAge(27, "Suraj")

输出:

Case-1:
Hi, I am Suraj
My age is  27

Case-2:
Hi, I am 27
My age is  Suraj

任意关键字参数

在 Python 任意关键字参数中,*args 和 **kwargs可以使用特殊符号将可变数量的参数传递给函数。有两个特殊符号:

  • Python 中的 *args(非关键字参数)
  • **Python 中的 kwargs(关键字参数)

示例 1:可变长度非关键字参数

这是一个使用 *args 的 Python 示例程序,它接受可变数量的位置参数,并在函数内部将它们遍历并打印出来。

# Python program to illustrate
# *args for variable number of arguments
def myFun(*argv):
	for arg in argv:
		print(arg)


myFun('Hello', 'Welcome', 'to', 'JKHXW')

输出:

Hello
Welcome
to
JKHXW

示例 2:可变长度关键字参数

此示例中使用了 **kwargs 来接受不定数量的关键字参数,并在函数内部将这些参数遍历并输出。

# Python program to illustrate
# *kwargs for variable number of keyword arguments


def myFun(**kwargs):
	for key, value in kwargs.items():
		print("%s == %s" % (key, value))


# Driver code
myFun(first='Geeks', mid='for', last='Geeks')

输出:

first == Geeks
mid == for
last == Geeks

文档字符串

文档字符串(Docstring)是Python中的一种注释,通常出现在函数、类、模块等定义的顶部,用于提供关于该对象的详细文档和说明。文档字符串的主要目的是帮助其他开发人员和你自己理解代码的功能、用法以及如何使用。

文档字符串通常由三个引号包围,可以是单引号或双引号。

语法:

Syntax: print(function_name.__doc__)
# A simple Python function to check
# whether x is even or odd


def evenOdd(x):
	"""Function to check if the number is even or odd"""
	
	if (x % 2 == 0):
		print("even")
	else:
		print("odd")


# Driver code to call the function
print(evenOdd.__doc__)

输出:

Function to check if the number is even or odd

Python 中的匿名函数

在Python中,匿名函数意味着函数没有名称。我们已经知道 def 关键字用于定义普通函数,而 lambda 关键字用于创建匿名函数。

# Python code to illustrate the cube of a number
# using lambda function
def cube(x): return x*x*x

cube_v2 = lambda x : x*x*x

print(cube(7))
print(cube_v2(7))

输出:

343
343

Python函数中的返回语句

函数返回语句用于退出函数并返回到函数调用者,并将指定的值或数据项返回给调用者。return 语句的语法是:

return [expression_list]

return 语句可以包含变量、表达式或在函数执行结束时返回的常量。如果 return 语句中不存在上述任何一项,则返回 None 对象。

def square_value(num):
	"""This function returns the square
	value of the entered number"""
	return num**2


print(square_value(2))
print(square_value(-4))

输出:

4 
16

按引用传递和按值传递

需要注意的一件重要事情是,在 Python 中,每个变量名都是一个引用。当我们将变量传递给函数时,就会创建对该对象的新引用。Python 中的参数传递与 Java 中的引用传递相同。

# Here x is a new reference to same list lst
def myFun(x):
	x[0] = 20


# Driver Code (Note that lst is modified
# after function call.
lst = [10, 11, 12, 13, 14, 15]
myFun(lst)
print(lst)

输出:

[20, 11, 12, 13, 14, 15]

当我们传递引用并将接收到的引用更改为其他内容时,传递的参数和接收的参数之间的连接就会断开。例如:

def myFun(x):
    # 在下面这行代码之后,x 与之前的对象的关联被断开。x 被赋予了一个新的对象。
    x = [20, 30, 40]

# 驱动代码(注意,在函数调用之后,lst 没有被修改)
lst = [10, 11, 12, 13, 14, 15]
myFun(lst)
print(lst)

输出:

[10、11、12、13、14、15]

在这段代码中,myFun 函数接受一个参数 x,但在函数内部,x 被重新赋值为一个新的列表 [20, 30, 40]。这并不会修改原始的 lst 列表,因此打印 lst 时,它仍然是 [10, 11, 12, 13, 14, 15],因为在函数内部对 x 的修改不会影响到函数外部的 lst。

另一个例子表明,如果我们分配一个新值(在函数内部),引用链接就会被破坏。 

def myFun(x):
    # 在下面这行代码之后,x 与之前的对象的关联被断开。x 被赋予了一个新的值。
    x = 20

# 驱动代码(注意,在函数调用之后,x 没有被修改)
x = 10
myFun(x)
print(x)

输出:

10

在这段代码中,myFun 函数接受一个参数 x,但在函数内部,x 被重新赋值为 20,这并不会修改原始的 x 值,因此在函数外部打印 x 时,它仍然是 10,因为函数内部对 x 的修改不会影响到函数外部的 x。