Python函数详解(超全面,超详细指南)

目录

一、函数基础

1.定义

2.调用

3.形参

4.实参

5.返回值

二、函数的类型

1.无参数无返回值函数:

2.有参数无返回值函数

3.有参数有返回值函数

三、递归函数

四、匿名函数

五、作用域

1、作用域的概念

2、Python 中的四种作用域

1. 局部作用域(Local)

2. 嵌套作用域(Enclosing)

3. 全局作用域(Global)

4. 内置作用域(Built – in)

3、nonlocal 关键字

六、闭包:

7、装饰器:

8、装饰器案例


一、函数基础

1.定义

函数是组织好的、可重复使用的、用于执行特定任务的代码块。在 Python 中,使用 def 关键字来定义函数。

def greet(name):
    print(f"Hello, {name}!")

2.调用

调用函数就是执行函数中定义的代码块。通过函数名加上括号,并传入相应的参数(如果有)来调用函数。

greet("Alice")

3.形参

形参(形式参数)是在函数定义中声明的参数,用于接收调用函数时传入的值。

def add(a, b):
    return a + b

这里的 a 和 b 就是形参。 

4.实参

实参(实际参数)是在函数调用时传递给函数的具体值。

result = add(3, 5)
print(result)  

这里的 3 和 5 就是实参。 

5.返回值

函数可以通过 return 语句返回一个值。如果没有 return 语句,函数默认返回 None

def multiply(a, b):
    return a * b

product = multiply(4, 6)
print(product)  

二、函数的类型

1.无参数无返回值函数

不接收参数,也不返回值

def print_message():
    print("This is a message.")

2.有参数无返回值函数

接收参数,但不返回值 

def print_sum(a, b):
    print(a + b)

3.有参数有返回值函数

接收参数并返回值。前面的 add 和 multiply 函数就是例子。 

三、递归函数

递归函数是在函数内部调用自身的函数。递归函数需要有一个终止条件,否则会导致无限递归。

def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5))  

四、匿名函数

匿名函数是没有函数名的小型函数,使用 lambda 关键字定义

add = lambda a, b: a + b
result = add(3, 5)
print(result)  

五、作用域

在 Python 编程中,作用域是一个非常重要的概念。它决定了变量在程序中的可见性和生命周期。理解作用域对于编写正确、高效且易于维护的代码至关重要。本文将深入探讨 Python 的作用域机制。

1、作用域的概念

作用域可以简单理解为变量的 “有效范围”。在 Python 中,变量并不是在代码的任何位置都可以被访问的,而是取决于它被定义的位置。当一个变量在某个作用域内被定义后,它在该作用域以及嵌套在该作用域内的子作用域中是可见的,除非在子作用域中有同名变量的重新定义。

2、Python 中的四种作用域

1. 局部作用域(Local)

局部作用域是最内层的作用域,通常是在一个函数内部定义的变量所处的范围。在函数内部定义的变量只在该函数内部可见,函数执行完毕后,这些局部变量会被销毁。例如:

def local_scope_example():

local_variable = 10

print(local_variable)

local_scope_example()

# print(local_variable) # 这行代码会报错,因为local_variable超出了其局部作用域

2. 嵌套作用域(Enclosing)

当一个函数嵌套在另一个函数内部时,内层函数可以访问外层函数的变量,外层函数的作用域对于内层函数来说就是嵌套作用域。例如:


def outer_function():

enclosing_variable = 20

def inner_function():

print(enclosing_variable)

inner_function()

outer_function()

3. 全局作用域(Global)

全局作用域是在所有函数之外定义的变量所处的范围。全局变量在整个模块中都是可见的,除非在局部作用域中有同名变量的遮蔽。在 Python 中,一个文件通常被视为一个模块。例如:


global_variable = 30

def global_scope_example():

print(global_variable)

global_scope_example()

4. 内置作用域(Built – in)

内置作用域包含了 Python 解释器预先定义的变量和函数,比如print、len、sum等。这些内置的名称在整个程序中始终是可用的。例如:

print(len([1, 2, 3]))

3、nonlocal 关键字

在嵌套函数中,如果想要在内层函数中修改外层(非全局)函数的变量,需要使用nonlocal关键字。例如:

def outer():

num = 10

def inner():

nonlocal num

num = num + 5

print(num)

inner()

outer()

六、闭包:

闭包是一种函数对象,它可以记住定义时的环境变量,即使在函数外部调用时,这些变量也不会消失。

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)
result = closure(5)
print(result)  

7、装饰器:

装饰器是一种特殊的函数,它可以在不修改原函数代码的情况下,为原函数添加新的功能。装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。

def my_decorator(func):
    def wrapper():
        print("Before the function is called.")
        func()
        print("After the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

8、装饰器案例

以下是一个带有参数的装饰器案例,用于记录函数的执行时间。

import random
import time
l0 = [random.randint(1, 10000) for i in range(10000)]
l2 = l0.copy()
def time_count(f):
    def calc():
        start = time.time()
        f()
        print(f"执行{f.__name__}消耗了{time.time() - start}")
    return calc
@time_count
def sort2():
    l22 = sorted(l2)
    print(l22)
@time_count
def sort1():
    l0.sort()
    print(l0)

sort1()
sort2()

这个装饰器 time_count 可以测量任何被它装饰的函数的执行时间。

作者:月挽星回#

物联沃分享整理
物联沃-IOTWORD物联网 » Python函数详解(超全面,超详细指南)

发表回复