文章目录
一、函数目的
1、将重复使用的代码封装起来,提高代码复用性
2、将复杂任务分解为更小的模块,提高代码可读性
3、隐藏实现细节,只暴露接口给使用者
4、便于代码维护和修改
二、函数定义
使用 def
关键字定义函数,后跟函数名和参数列表,以冒号开头,缩进块为函数体。
def function_name():
# 函数体
return result
三、函数声明
def my_course(): # 定义一个名字为my_course的函数,因为没有调用,所以不会执行
print(111)
在Python中,函数声明就是函数定义,没有单独的声明步骤。当使用def
定义函数时,就同时完成了声明和定义。
四、 函数调用
通过函数名后跟括号和参数来调用函数。
def wake_up():
print("醒醒啦!!!")
wake_up() # 醒醒啦!!!
五、函数形参
def wake_up(name): # name 就是形参
print(f"{name}醒醒啦!!!")
wake_up('小明') # 小明醒醒啦!!!
六、 函数实参
实参(实际参数)是调用函数时传递给形参的值。
def my_course(name,n):
for i in range(n):
print(f"上课了!!! {name}")
my_course('小明',5) # 实参即是'小明'和 5 ,打印五次上课了!!!小明
七、 函数返回值
使用 return
语句返回结果。若无 return
,默认返回 None
。
def add(a, b):
return a + b
total = add(1,2)
print(total) # 3
def add(a, b):
total = a + b
total = add(1,2)
print(total) # None,因为没有返回任何东西,默认是None
八.、函数的参数类型
1、位置参数
按顺序匹配形参和实参
def add(a, b):
return a + b
total = add(1,2) # 这里就是把实参1,2分别赋值给函数的形参a,b,实参和形参的位置对应
print(total) # 3
2、关键字参数
在调用函数时通过 “参数名 = 值” 的形式来传递实参的写法
def greet(name, age):
print(f"{name} is {age} years old.")
greet(name="CSDN", age=18)
greet(age=28, name="城市大脑") # 顺序可以打乱
3、混用规则
位置参数必须在前,关键字参数必须在后!
def greet(name, age):
print(f"{name} is {age} years old.")
greet("csdn", age=18) # 合法
# greet(name="csdn", 18) # 报错:SyntaxError
九、匿名函数
指的是一类无需定义标识符(函数名)的函数。在Python中,这种函数通常是通过使用lambda
关键字来创建的,因此也被称为lambda
函数。
匿名函数的基本语法:
lambda 参数列表: 表达式
lambda
:关键字,用于定义匿名函数。
参数列表
:与普通函数一样,用于传递参数,可以包含一个或多个参数,用逗号分隔。
表达式
:匿名函数的主体,用于执行具体的操作。注意,lambda
函数只能包含一个表达式,不能包含多个语句或复杂的逻辑。
# 使用匿名函数计算两个数的和
sum = lambda x, y: x + y
result = sum(3, 4)
print(result) # 输出:7
# 使用匿名函数作为参数进行排序
numbers = [1, 3, 2, 5, 4]
sorted_numbers = sorted(numbers, key=lambda x: x)
print(sorted_numbers) # 输出:[1, 2, 3, 4, 5]
# 使用匿名函数进行过滤
numbers = [1, 3, 2, 5, 4]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出:[2, 4]
十、闭包
1、什么是闭包
简单来说,闭包是指一个函数(通常称为内部函数)能够访问其外部函数(通常称为外部函数或父函数)作用域中变量的情况,即使外部函数已经执行完毕并返回了。这看起来有点像“打包”了外部函数的执行环境和内部函数本身。
2、闭包的构成要素:
1:必须有一个嵌套函数。
2:嵌套函数必须引用外部函数的变量。
3:外部函数必须返回嵌套函数。
def fun1():
x = 10 # 外部函数定义了一个变量 x
def fun2():
y = 30
print(x,y) # 内部函数引用了外部函数的变量 x
return fun2 # 外部函数返回内部函数本身,不加括号
r = fun1() # r = fun2
r() # r加()调用函数fun2执行
3、闭包结合函数案例
def fun1(fun):
pass
def fun2():
print(f"开始执行{fun.__name__}") # 开始执行say
fun() # hello python
print(f"执行结束{fun.__name__}") # 执行结束say
return fun2
def say():
print("hello python")
r = fun1(say)
r()
4、闭包总结:
闭包是 Python 中一个强大而灵活的特性,它允许函数携带其创建时的环境信息。理解闭包有助于你更好地利用 Python 进行函数式编程、创建装饰器(Decorator)以及实现更复杂的设计模式。
十一、装饰器
装饰器是Python中一个强大而灵活的特性,它允许程序员在不修改函数代码的情况下,为函数添加额外的功能。装饰器本质上是一个接受函数作为参数的函数,并返回一个新的函数。
def decorator(fun):
def wrapper():
print("函数执行前可操作修改")
fun()
print("函数执行后做一些事情")
return wrapper
@decorator
def say_hello():
print("你好!")
装饰器实用的案例
# 编写装饰器统计使用冒泡排序与选择排序算出(1-1000内随机1000个)时间开销
import time
l1 = [random.randint(1,1000) for i in range(1000)]
l2 = l1.copy()
def time_cost(fun):
def fun2():
start = time.time()
fun()
end = time.time()
print(f"{fun.__name__}排序的时间开销为:{end - start}")
return fun2
@time_cost
def emerge():
for i in range(1,len(l1)):
for j in range(0,len(l1) - i ):
if l1[j] > l1[j + 1]:
temp = l1[j]
l1[j] = l1[j + 1]
l1[j + 1] = temp
print(l1)
@time_cost
def choice_div():
for i in range(len(l2) - 1):
max_index = i
for j in range(i + 1, len(l2)):
if l2[j] < l2[max_index]:
max_index = j
l2[max_index], l2[i] = l2[i], l2[max_index]
print(l2)
emerge()
choice_div()
十二、内置函数
1、基本类型转换函数
int() | 将字符串或数字转换为整数 |
float() | 将字符串或数字转换为浮点数 |
str() | 将对象转换为字符串 |
bool() | 将对象转换为布尔值 |
complex() | 创建复数 |
bytes() | 返回一个字节对象 |
2、数学运算函数
abs() | 返回绝对值 |
round() | 四舍五入 |
pow() | 幂运算 |
sum() | 求和 |
min() | 返回最小值 |
max() | 返回最大值 |
3、对象操作函数
len() | 返回对象长度 |
type() | 返回对象类型 |
id() | 返回对象的内存地址 |
isinstance() | 判断对象是否是某个类型 |
dir() | 返回对象的属性和方法 |
hasattr() | 判断对象是否有某个属性 |
getattr() | 获取对象属性值 |
setattr() | 设置对象属性值 |
4、输入输出函数
函数名 | 作用 |
---|---|
input() | 接收用户输入 |
print() | 输出内容到控制台 |
5、迭代与序列相关函数
函数名 | 作用 |
---|---|
range() | 生成整数序列 |
enumerate() | 枚举可迭代对象,返回索引和值 |
zip() | 打包多个可迭代对象 |
map() | 对可迭代对象中的每个元素应用函数 |
filter() | 过滤可迭代对象中符合条件的元素 |
总结
函数的主要目的在于提高代码的复用性和可维护性,避免重复编写相同的代码,让程序结构更加清晰;
函数定义是通过def关键字,后面跟着函数名和圆括号,括号内可以放置参数,然后是冒号和缩进的函数体,这样就把一段代码封装成了一个可重复使用的单元;
函数声明其实就是函数定义的过程,在Python中定义函数即完成了声明;
函数调用则是通过函数名后跟圆括号,括号内可以传入实际参数来执行函数体中的代码;
函数形参是在函数定义时括号内声明的参数,它们是形式上的占位符,而函数实参是在函数调用时传递给函数的实际值,形参和实参在数量、顺序和类型上要匹配;
函数返回值使用return语句来实现,它可以返回一个或多个值,如果没有return语句,函数默认返回None;
函数的参数类型有多种,包括位置参数、关键字参数、默认参数、可变位置参数(*args)和可变关键字参数(**kwargs),它们提供了灵活的参数传递方式;
匿名函数使用lambda关键字定义,它是一种轻量级的函数,通常用于需要一个简单函数的地方,且不需要正式定义函数名;
闭包是指一个函数内部定义了另一个函数,并且内部函数引用了外部函数的变量,这样外部函数的变量在内部函数中得以保存,即使外部函数已经执行完毕;
装饰器是一种特殊类型的闭包,它可以在不修改原函数代码的情况下,为函数添加额外的功能,通常用于日志记录、访问控制等场景;内置函数是Python自带的一系列函数,如print()、len()、max()等,它们可以直接使用,无需导入任何模块,大大提高了编程效率。