函数
名称:函数命名遵循变量命名规范
参数:
- 位置参数:多个参数间不可交换位置
- 关键字参数:对应即可
返回值:默认返回None
参数的收集
一个星(*):表示接收的参数作为元组来处理,收集位置参数
两个星(**):表示接收的参数作为字典来处理,收集关键字参数
装饰器
在程序中,不会对原来函数造成改变,还要增添新的功能,调用函数时的接口没有发生变化。
https://www.bilibili.com/video/BV1d7411h794?from=search&seid=16229229654246779243
- 可以把一个函数赋值给一个变量
- 函数可以当做函数的返回值进行返回
- 闭包
import time
def calculate_time(func):
def inner(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return ret
return inner
@calculate_time
def print1to20():
for i in range(1, 21):
time.sleep(0.1)
print(i, end=" ")
else:
print()
# print1to20 = calculate_time(print1to20)
print(print1to20())
闭包
保证数据安全
-
内层函数对外层函数非全局变量的引用就会形成闭包
-
被引用的非全局变量也称自由变量
- 这个自由变量与内层函数产生一个绑定关系
- 自由变量不会从内存中消失
def average():
li = [] # 自由变量
def inner(value):
li.append(value)
return sum(li) / len(li)
return inner
avg = average()
print(avg(6000))
print(avg(7000))
print(avg(8000))
"""
输出:
6000.0
6500.0
7000.0
"""
Kotlin版:
fun main() {
val avg = average()
println(avg(6000))
println(avg(7000))
println(avg(8000))
}
fun average(): (Number) -> Double {
val list = mutableListOf<Double>()
return { value: Number ->
list.add(value.toDouble())
list.average()
}
}