函数
自定义函数
函数的参数
函数的返回值
函数的作用域
函数介绍
匿名函数
高阶函数
闭包
内置文件常用函数
递归函数
装饰器
闭包
def test_one():
print('--1--')
test_one() # 函数的调用 # --1--
to = test_one() # --1--
print(id(test_one())) # 1761933504
print(id(to)) # 1761933504
# t_o变量指向了test_one函数的调用
# to() # 报错
闭包的定义需要满足以下三个条件:
- 在一个外函数中定义了一个内函数
- 内函数里运用了外函数的临时变量
- 并且外函数的返回值是内函数的引用
def test(number):
print('--1--')
def test_in(number_in):
print(number_in)
print('--2--')
return number_in + number
print('--3--')
return test_in
# test()执行完毕时,输出1,3。并且函数里面的变量会被释放到(number)
res = test(30) # res = tet_in
res1 = res(25) # tet_in()
print(res1) # 45, 说明在外函数执行完毕时,number并没有被释放,而是继续给内层函数使用。
"""
总结:闭包它是一种现象
一般情况下,外函数执行完毕,临时变量会被释放。
但此时,外函数发现自己的临时变量会在将来被使用
所以外函数结束的时候,在返回内函数引用的同时,将外函数的临时变量与内函数进行绑定。
这也是为什么当外函数结束,但内函数仍然可以使用外函数临时变量的原因。
"""
装饰器
import time # python内置模块,时间模块
# 计算时间的函数
def test_1():
start = time.time()
print('--1--')
time.sleep(2)
end = time.time()
print(f'send {end - start - 2}')
def test_2():
start = time.time()
print('--2--')
time.sleep(2)
end = time.time()
print(f'send {end - start - 2}')
def test_3():
start = time.time()
print('--3--')
time.sleep(2)
end = time.time()
print(f'send {end - start - 2}')
test_1()
test_2()
test_3()
import time # python内置模块,时间模块
# 计算时间的函数
def calru_time(func):
start = time.time()
func()
time.sleep(2)
end = time.time()
print(f'send {end - start - 2}')
def test_1():
print('--1--')
time.sleep(2)
def test_2():
print('--2--')
time.sleep(2)
calru_time(test_1)
calru_time(test_2)
'''
就是在部改变函数源代码的情况下为函数添加新的功能
'''
装饰器
装饰器 (@) 是一种语法糖,主要用于在函数或类的基础上添加一些可重用的额外功
能。从应用开发的角度来看的话,我们使用装饰器来对我们的应用代码进行功能性
扩展和包装,以提高代码的可重用性和可维护性。
# 需要给各个函数添加上打印hello world的功能
def print_hw(f):
print('hello world')
return f
@print_hw # @装饰器函数名称 test = print_hw(test)
def test():
sum_li = sum([12, 3, 4])
print(sum_li)
return sum_li
@print_hw
def test2():
print('我是老amy')
# test2 = print_hw(test) # test函数引用作为实参 test2 = f = test
# test2() # test2() = f() = test()
test()
test2()
'''
1.test()函数未调用的时候,装饰器就已经执行了
'''
import time
'''
此处是问题代码,因为重复调用了test1()
'''
def calcu_time(func): # func = test1
start = time.time()
func() # test1()
end = time.time()
print(f'spend {start - end}')
return func
def test1():
print('--1--')
time.sleep(2)
test= calcu_time(test1) # test = func = test1
test()
# --1--
# # spend -2.0011146068573
# # --1--
import time
# 计算时间的函数
def calcu_time(func): # 外函数里面有内函数
def test_in():
start = time.time()
func() # 内函数引用内函数的临时变量
end = time.time()
print(f'spend {start - end}')
return test_in # 内函数的引用作为外函数的返回值
@calcu_time # test = calcu_time(test1)
def test1():
print('--1--')
time.sleep(2)
@calcu_time
def test2():
print('--2--')
time.sleep(2)
# test = calcu_time(test1) # test + test_in
# test() # test_in()
# test = calcu_time(test2) # test = test_in
# test() # test_in()
test1()
test2()
'''
此处,形成闭包的现象。
1.嵌套函数
2.内层函数引用外层函数变量-->函数名本质也是变量
3.内函数引用作为外层函数的返回值
'''
推导式
推导式介绍
Python 中有一种特有的语法,就是推导式(又称为解析式)。推导式是可以从一个数据
序列构建另一个新的数据序列的结构体。
共有三种推导:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
"""
生成一个[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0] 的列表
"""
# print(range(0, 11 ,0.5)) # 报错 步长不能未浮点数
li=[]
for i in range(1, 21):
li.append(i/2)
print(li)
# 列表推导式的便利之处
li1 = [i/2 for i in range(1, 21)]
print(li1)
"""
有列表如:li = [6, 2, 6, 7, -15, 8, -17, -10, -15, -4]。
需求:将li列表 <0 的数进行平方 生成新列表
"""
li = [6, 2, 6, 7, -15, 8, -17, -10, -15, -4]
li1 = []
for i in li:
if i < 0:
i = i ** 2
li1.append(i)
print(li1)
# 将小于0的过滤出来 filter()
# 将过滤出来的元素 映射做平方操作
fi1 = list(filter(lambda x: x<0, li))
print(list(map(lambda x: x**2 ,fi1)))
# 注意:此处不是三目运算符!!!
li2 = [i ** 2 for i in li if i < 0]
for i in '123':
for j in 'abc':
for k in 'qwe':
print(i + j + k)
# 列表推导式的镶嵌
print([i + j+ k for i in '123' for j in 'abc' for k in 'qwe'])
# 实现:一下列表中的元素 与索引 --> {key:value} 的形式
li = ['age', 'name', 'gender']
dic = {i: li.index(i) for i in li}
print(dic)# 实现:一下列表中的元素 与索引 --> {key:value} 的形式
li = ['age', 'name', 'gender']
dic = {i: li.index(i) for i in li}
print(dic)
# 实现生成10个1-100之间的袁术,取进行去重
# 集合推导式
import random
s1 = {random.randint(1, 100) for i in range(10)}
print(s1)
# 注意:没有元组推导式,而是生成器
tu = (i for i in range(3))
print(tu) # generator
print(type(tu)) # generator
print(tuple(tu)) # (0, 1, 2) 转为 tuple 类型
"""
ü 作业 1
过滤掉该列表 names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]
长度小于或等于 3 的字符串列表,并将剩下的转换成大写字母。
"""
names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]
res = [name.upper() for name in names if len(name)<=3]
print(res)
"""
ü 作业 2
求 (x,y), 其中 x 是 0-5 之间的偶数, y 是 0-5 之间的奇数组成的元组列表。
效果如下: [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
"""
data = [(x,y) for x in range(0, 5, 2) for y in range(1, 5, 2)]
print(data)
data2 = [(x,y)for x in range(0, 5) if x%2==0 for y in range(0 ,5) if y%2==1]
print(data2)
"""
ü 作业 3
[ 'Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob','JAMES','jAMeS' ]
该列表很紊乱,实现去重 , 以及将名字格式统一成首字母大写 (str.capitalize())
"""
names_02 = [ 'Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob','JAMES','jAMeS' ]
print({name.capitalize() for name in names_02})