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 可以测量任何被它装饰的函数的执行时间。
作者:月挽星回#