官方网站建设的四个步骤企业网站推广的方法有
函数是Python编程中最重要的概念之一。无论是编写简单的脚本还是开发复杂的应用程序,函数都是组织代码、提高代码复用性和可维护性的关键工具。本文将带你从基础到高级,全面了解Python函数的使用( 也可点击Python官网关于函数的叙述)。
概念
函数是一段可重复使用的代码块(可以称为方法或者说本质就是方法),用于执行特定的任务。通过将代码封装在函数中,你可以避免重复编写相同的代码,并使程序更加模块化和易于维护。
函数的定义
在Python中,使用 def
关键字来定义一个函数。函数定义的基本语法如下:
def function_name(parameters):"""函数文档字符串"""# 函数体return value
-
function_name
:函数的名称,遵循标识符命名规则。 -
parameters
:函数的参数列表,可以有多个参数,也可以没有参数。 -
"""函数文档字符串"""
:可选的文档字符串,用于描述函数的功能。 -
return value
:可选的返回值,用于将结果返回给调用者。
函数的调用
定义函数后,可以通过函数名加括号的方式来调用函数。如果函数有参数,调用时需要传入相应的参数。
def greet(name):"""向指定的人打招呼"""print(f"Hello, {name}!")greet("Alice") # 输出: Hello, Alice!
函数的参数
Python函数支持多种类型的参数,包括位置参数、关键字参数、默认参数和可变长度参数。
位置参数
位置参数是最常见的参数类型,调用函数时需要按照定义时的顺序传入参数。
def add(a, b):return a + bresult = add(3, 5) # 输出: 8
关键字参数
关键字参数允许你通过参数名来指定参数值,这样可以不按照顺序传入参数。
def greet(name, message):print(f"{message}, {name}!")greet(message="Hi", name="Bob") # 输出: Hi, Bob!
默认参数
默认参数允许你为参数指定默认值。如果调用函数时没有传入该参数,则使用默认值。
def greet(name, message="Hello"):print(f"{message}, {name}!")greet("Alice") # 输出: Hello, Alice!
greet("Bob", "Hi") # 输出: Hi, Bob!
可变长度参数
有时你可能需要处理不确定数量的参数。Python提供了两种可变长度参数:*args
和 **kwargs
。
-
*args
:用于接收任意数量的位置参数,参数会被打包成一个元组。 -
**kwargs
:用于接收任意数量的关键字参数,参数会被打包成一个字典。
def print_args(*args, **kwargs):print("位置参数:", args)print("关键字参数:", kwargs)print_args(1, 2, 3, name="Alice", age=25)
# 输出:
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': 'Alice', 'age': 25}
返回值
函数可以通过 return
语句返回一个值。如果没有 return
语句,函数默认返回 None
。
返回单个值
def add(a, b):return a + bresult = add(3, 5) # result = 8
返回多个值
Python函数可以返回多个值,这些值会被打包成一个元组。
def get_user_info():name = "Alice"age = 25return name, agename, age = get_user_info()
print(name, age) # 输出: Alice 25
作用域
作用域决定了变量的可见性和生命周期。Python中有两种主要的作用域:全局作用域和局部作用域。
局部变量和全局变量
-
局部变量:在函数内部定义的变量,只能在函数内部访问。
-
全局变量:在函数外部定义的变量,可以在整个程序范围内访问。
x = 10 # 全局变量def func():y = 20 # 局部变量print(x) # 可以访问全局变量print(y)func()
print(y) # 报错: NameError: name 'y' is not defined
global
关键字
如果你想在函数内部修改全局变量,可以使用 global
关键字。
x = 10def func():global xx = 20func()
print(x) # 输出: 20
高级函数概念
Lambda 函数
Lambda函数是一种匿名函数,通常用于编写简单的、一次性的函数。
add = lambda x, y: x + y
print(add(3, 5)) # 输出: 8
高阶函数
高阶函数是指接受其他函数作为参数或返回函数的函数。Python内置的高阶函数包括 map()
、filter()
和 reduce()
。
from functools import reduce
# 定义函数
def aaa():pass# 多参数行为 *args:用于接收任意数量的位置参数,参数会被打包成一个元组。**kwargs:用于接收任意数量的关键字参数,参数会被打包成一个字典。
def print_args(*args, **kwargs):print("位置参数:", args)print("关键字参数:", kwargs)
print_args(1, 2, 3, name="Alice", age=25)def args(*ars,**param):print("位置参数:", ars)print("关键字参数:", param)print_args(1, 'Alice', 3, name="Alice", age=25)f = lambda a: a**2
print(f(2))# filter 过滤使用 filter(第一个参数是bool,第二个参数是元组)
even_numbers = list(filter(lambda x: x % 2 == 1, range(10)))
print(even_numbers) # 输出:[1, 3, 5, 7,9]# reduce() 函数会对参数序列中元素进行累积 比如 两数相加(LeetCode真题) 0 -10的数相加是多少
reduce_value = reduce(lambda x,y: x+y , range(10)) # 使用时pycharm 自动会引入 from functools import reduce如果不会请手动
print(reduce_value) # 输出:45 = 0+1+2+3+4+5+6+7+8+9
total = 0
# 测试正确性 lambda x,y: x+y 就是每一项 total += i 累加过程就是reduce的作用
for i in range(10):total += i
print(total) # 输出:45
装饰器
装饰器是一种用于修改或扩展函数行为的高阶函数。装饰器通常用于日志记录、权限检查、性能测试等场景。
def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
# 输出:
# Something is happening before the function is called.
# Hello!
# Something is happening after the function is called.
实践项目
计算器程序
编写一个简单的计算器程序,使用函数实现加、减、乘、除操作。
def add(a, b):return a + bdef subtract(a, b):return a - bdef multiply(a, b):return a * bdef divide(a, b):if b == 0:return "Error: Division by zero"return a / bprint(add(10, 5)) # 输出: 15
print(subtract(10, 5)) # 输出: 5
print(multiply(10, 5)) # 输出: 50
print(divide(10, 5)) # 输出: 2.0
猜数字游戏
编写一个简单的猜数字游戏,使用函数实现游戏逻辑。
import randomdef guess_number():number = random.randint(1, 100)attempts = 0while True:guess = int(input("Guess the number (1-100): "))attempts += 1if guess < number:print("Too low!")elif guess > number:print("Too high!")else:print(f"Congratulations! You guessed the number in {attempts} attempts.")breakguess_number()