在前面我已经编写过一篇,python函数基础的博文,相信有基础的同学应该看得出来,那一篇的基础内容也是不全的,于是就有了这个补全篇。补全篇,补充了变量的作用与(global与nonlocal)、递归函数、闭包、装饰器这几篇的内容。
一. 函数目的
函数的主要目的是提高代码的组织性、可读性和重用性。
详细解释:
代码重用: 将常用的代码块封装成函数,避免重复编写相同的代码。
模块化编程: 将大型程序分解成小的、独立的函数,使程序结构更清晰。
提高可读性: 通过有意义的函数名,使代码的意图更加明确。
抽象: 隐藏复杂的实现细节,只展示必要的接口。
示例:
def calculate_area(length, width):return length * width# 使用函数计算多个矩形的面积
rectangle1 = calculate_area(5, 3)
rectangle2 = calculate_area(7, 4)
rectangle3 = calculate_area(2, 9)print(rectangle1, rectangle2, rectangle3) # 输出: 15 28 18
二. 函数定义
Python使用`def`关键字定义函数,后面跟随函数名和参数列表。
详细解释:
函数定义以 " def " 开始。
函数名应该清晰地表达函数的功能。
参数列表在括号内定义。
函数体应该缩进。
示例:
def greet_user(username, greeting="Hello"):"""This function greets the user"""print(f"{greeting}, {username}!")greet_user("Alice") # 输出: Hello, Alice!
greet_user("Bob", "Good morning") # 输出: Good morning, Bob!
三. 函数声明
在Python中,函数声明和定义是同一个过程。
详细解释:
Python是一种动态类型语言,不需要预先声明函数的返回类型或参数类型。函数在定义时即被声明。
示例:
# 这既是函数的声明,也是定义
def add_numbers(a, b):return a + b# 可以直接使用这个函数
result = add_numbers(5, 3)
print(result) # 输出: 8
四. 函数调用
函数调用是执行函数代码的过程。
详细解释:
使用函数名后跟括号来调用函数。
如果函数有参数,在括号内提供参数。
函数调用可以作为表达式的一部分。
示例:
def multiply(a, b):return a * b# 直接调用
print(multiply(4, 5)) # 输出: 20# 在表达式中调用
result = multiply(3, 7) + 5
print(result) # 输出: 26# 嵌套调用
print(multiply(multiply(2, 3), 4)) # 输出: 24
五. 函数形参
形参是在函数定义中声明的变量,用于接收传入的值。
详细解释:
形参在函数定义时指定。
形参可以有默认值。
形参的作用域仅限于函数内部。
示例:
def describe_pet(animal_type, pet_name):"""显示宠物的信息"""print(f"I have a {animal_type}.")print(f"My {animal_type}'s name is {pet_name}.")describe_pet("hamster", "Harry")
describe_pet("dog", "Willie")
六. 函数实参
实参是在调用函数时传递给函数的具体值。
详细解释:
实参在函数调用时提供。
实参的数量和顺序应与函数定义中的形参匹配。
可以使用位置参数或关键字参数传递实参。
示例:
def describe_city(city, country="China"):print(f"{city} is in {country}.")# 使用位置参数
describe_city("Beijing") # 输出: Beijing is in China.# 使用关键字参数
describe_city(country="Japan", city="Tokyo") # 输出: Tokyo is in Japan
七. 函数返回值
函数可以通过 " return " 语句返回值。
详细解释:
" return " 语句立即终止函数执行并返回指定值。
如果没有 " return " 语句,函数默认返回 " None "。
可以返回多个值,实际上是返回一个元组。
示例:
def get_formatted_name(first_name, last_name):full_name = f"{first_name} {last_name}"return full_name.title()musician = get_formatted_name("jimi", "hendrix")
print(musician) # 输出: Jimi Hendrixdef get_user_info(name, age, city):return name, age, cityuser = get_user_info("Alice", 30, "New York")
print(user) # 输出: ('Alice', 30, 'New York')
八. 函数的参数类型
Python函数支持多种参数类型,增加了函数的灵活性。
详细解释:
位置参数: 按照定义的顺序传递的参数。
关键字参数: 通过参数名指定的参数。
默认参数: 在定义时指定默认值的参数。
可变参数( ' *args ' ): 允许传入任意数量的位置参数。
关键字可变参数( ' **kwargs ' ): 允许传入任意数量的关键字参数。
示例:
def my_el(n, *args, into="鸡排", like="I like you", **kwargs):"""参数类型展示:param n: 位置参数 按照位置依次赋值:param args: 可变元组参数,接受除了第一个愿望所有的位置实参:param into: 关键字参数 默认参数:param like: 关键字参数 默认参数:param kwargs: 接受除了形参中出现的关键字参数以外所有以关键字形式赋值的实参:return:"""print(n)print(args)print(into)print(like)print(kwargs)my_el(8, "hello", into="火腿", like="I can't like you", ask="是的,不喜欢")
my_el(12, "有空吗?", "在干嘛", my_number="156169777")
输出:
九. 变量的作用域与(global与nonlocal)
变量的作用域决定了变量的可访问性。Python中有局部变量、全局变量和非局部变量。
局部变量: 在函数内部定义的变量,仅在函数内部可访问。
全局变量: 在函数外部定义的变量,整个程序都可以访问。
非局部变量: 在嵌套函数中,指向外层函数的变量。
详细解释:
使用 ' global ' 关键字可以在函数内部修改全局变量。
使用 ' nonlocal '关键字可以在嵌套函数中修改外层函数的变量。
示例:
x = 10 # 全局变量def modify_global():global x # 声明使用全局变量x = 20modify_global()
print(x) # 输出: 20def outer():y = 30 # 外层函数的局部变量def inner():nonlocal y # 声明使用外层函数的变量y += 10return yreturn inner()result = outer()
print(result) # 输出: 40
十. 递归函数
递归函数是直接或间接调用自身的函数。
详细解释:
递归通常用于解决可以分解为相同子问题的问题。
每个递归函数必须有一个基本情况,防止无限递归。
示例:
def factorial(n):"""计算n的阶乘"""if n == 0 or n == 1: # 基本情况return 1else:return n * factorial(n - 1) # 递归调用print(factorial(5)) # 输出: 120
十一. 匿名函数
Python使用 ' lambda '关键字创建匿名函数,适用于简单的一次性函数定义。
详细解释:
' lambda ' 函数是一种简洁的方式来创建小型匿名函数。
通常用于需要一个简单函数作为参数的场景。
' lambda ' 函数可以接受任意数量的参数,但只能有一个表达式。
示例:
# 使用lambda函数作为sorted()的key
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
print(pairs) # 输出: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]# 在map()函数中使用lambda
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 输出: [1, 4, 9, 16, 25]
十二. 闭包
闭包是指一个函数可以访问其外部作用域的变量,即使外部作用域已经结束。
详细解释:
闭包允许函数记住并访问其创建时的环境,即使在其外部被调用。
闭包通常用于封装数据,提供私有变量。
示例:
def make_multiplier(factor):def multiplier(x):return x * factor # 访问外部函数的变量return multiplierdouble = make_multiplier(2)
triple = make_multiplier(3)print(double(5)) # 输出: 10
print(triple(5)) # 输出: 15
在这个示例中, ' make_multiplier ' 函数返回一个新的函数 ' multiplier ' ,并且 ' multiplier '能够访问 ' make_multiplier ' 中定义的 ' factor ' 变量。即使 ' make_multiplier ' 的执行已经结束,返回的'multiplier '函数依然可以使用 ' factor '。
十三. 装饰器
装饰器是一个函数,用于在不修改原函数代码的情况下扩展其功能。
详细解释:
装饰器接受一个函数作为参数,并返回一个新的函数。
常用于日志、权限检查、性能测试等场景。
示例:
def decorator_function(original_function):def wrapper_function():print("Wrapper executed before {}".format(original_function.__name__))return original_function()return wrapper_function@decorator_function
def display():print("Display function executed")display()
# 输出:
# Wrapper executed before display
# Display function executed
在这个示例中, ' decorator_function ' 是一个装饰器, ' wrapper_function ' 是在调用原始函数之前执行的一些额外操作。使用 ' @decorator_function ' 语法可以轻松地将装饰器应用于 ' display ' 函数。
总结
Python函数是构建可复用、模块化代码的基石。通过本文,我们深入探讨了函数的定义、调用、参数传递和返回值等核心概念。从基本的函数声明到高级的参数类型、匿名函数、闭包和装饰器,这些知识为编写清晰、高效的Python代码奠定了基础。
掌握函数不仅能提高代码的组织性和可读性,还能大幅提升编程效率。随着实践的深入,你会发现函数在处理复杂任务和设计灵活解决方案时的强大能力。
希望这个博客内容能帮助大家更好地理解Python中的函数基础!