收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来
如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
正文
nums = (i\*\*2 for i in range(10))
for num in nums:
print(num)
代码运行结果:
- 第二种方法: yield关键字。
如何打印生成器的每一个元素呢?
- 通过for循环, 依次计算并生成每一个元素。
- 如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。
# return: 遇到return就返回,后面代码不会执行
# yield: 遇到yield停止执行代码,再次调用next方法时,会从上次停止的地方继续执行,遇到yiekd继续
def login():
print('step 1')
yield 1
print('step 2')
yield 2
print('step 3')
yield 3
# 如果函数里面有yield关键字,函数的返回值就是一个生成器
g = login()
print(next(g))
print(next(g))
print(next(g))
代码运行结果:
3.生成式的特点
解耦. 爬虫与数据存储解耦;
减少内存占用. 随时生产, 即时消费, 不用堆积在内存当中;
可不终止调用. 写上循环, 即可循环接收数据, 对在循环之前定义的变量, 可重复使用;
生成器的循环, 在 yield 处中断, 没那么占 cpu.
三、闭包
什么是闭包?如何实现闭包?
闭包就是指有权访问另一个函数作用域中的变量的函数。
创建闭包最常见方式,就是在一个函数内部创建另一个函数。
常见形式: 内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用。
闭包的一个常用场景就是装饰器。
# import time
# start\_time = time.time() # 时间戳:从1970年1.1到现在经历的秒数
# time.sleep(2)
# end\_time = time.time() # 时间戳:从1970年1.1到现在经历的秒数
# print(end\_time-start\_time)
# 闭包:
# 1. 函数里面嵌套函数
# 2. 外部函数的返回值是内部函数的引用
# 3. 内部函数可以使用外部函数的变量
def timeit(name):
def wrapper():
print('wrapper ' + name)
print('timeit')
return wrapper
in_fun = timeit(name='westos') # wrapper函数, in\_fun实质上就是wrapper函数
in_fun()
代码运行结果:
四、装饰器
1.什么是装饰器
器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能的工具/函数。
2.为什么要使用装饰器
如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时候可以使用装饰器。因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能指的是开放的。
装饰器的实现必须遵循两大原则:
封闭: 对已经实现的功能代码块封闭。 不修改被装饰对象的源代码
开放: 对扩展开发
装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能。
# 1.装饰器:用来装饰函数的工具
# 2.功能:在不改变源代码的情况下,添加的额外功能(eg:计算运行时间)
# 3.如何实现装饰器,基于闭包
import time
def timeit(f): # f=add
def wrapper(x, y):
start = time.time()
result = f(x, y) # f实质上是add函数
end = time.time()
print("函数运行的时间为: %.4f" %(end-start))
return result
return wrapper
@timeit # 1. 语法糖, add=timeit(add)
def add(x, y):
return x + y
result = add(1, 3)
print(result)
代码运行结果:
3.万能装饰器的实现
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
"""
装饰器的万能模板:
def 装饰器名称(f):
@wraps(f) # 保留被装饰函数的属性信息和帮助文档
def wrapper(\*args, \*\*kwargs):
# 执行函数之前做的事情
result = f(\*args, \*\*kwargs)
# 执行函数之后做的事情
return result
return wrapper
"""
# 需求: 计算函数的运行时间
import time
from functools import wraps
def timeit(f):
"""计时器的装饰器"""
@wraps(f) # 保留被装饰函数的属性信息和帮助文档
def wrapper(\*args, \*\*kwargs):
"""wrapper内部函数"""
start = time.time()
result = f(\*args, \*\*kwargs)
end = time.time()
print(f"函数{f.\_\_name\_\_}运行时间为{end-start}秒")
return result
return wrapper
@timeit
def login():
"""login desc"""
print('login....')
@timeit
def crawl():
import requests
url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Python.svg/1200px-Python.svg.png'
content = requests.get(url).content
with open('doc/python.png', 'wb') as f:
f.write(content)
print("下载图片成功")
# print(help(login))
# login()
crawl()
代码运行结果:
4.含参数的装饰器
套三层的装饰器;在装饰器外层嵌套一层
# 需求: 计算函数的运行时间
import time
from functools import wraps
def timeit(args='seconds'):
def desc(f):
"""计时器的装饰器"""
@wraps(f) # 保留被装饰函数的属性信息和帮助文档
def wrapper(\*args, \*\*kwargs):
"""wrapper内部函数"""
start = time.time()
result = f(\*args, \*\*kwargs)
end = time.time()
if args == 'seconds':
print(f"函数{f.\_\_name\_\_}运行时间为{end-start}秒")
elif args == 'minutes':
print(f"函数{f.\_\_name\_\_}运行时间为{(end-start)/60}秒")
return result
return wrapper
return desc
@timeit(args='minutes') # timeit() @desc===> login=desc(login)
def login():
"""login desc"""
print('login....')
@timeit
def crawl():
import requests
url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Python.svg/1200px-Python.svg.png'
content = requests.get(url).content
with open('doc/python.png', 'wb') as f:
f.write(content)
print("下载图片成功")
# print(help(login))
# login()
crawl()
5.多个装饰器
from functools import wraps
def is\_login(f):
@wraps(f)
def wrapper(\*args, \*\*kwargs):
print('is\_login, 用户是否登录')
result = f(\*args, \*\*kwargs)
return result
return wrapper
def is\_permission(f):
@wraps(f)
def wrapper(\*args, \*\*kwargs):
print('is\_permission, 用户是否有权限')
result = f(\*args, \*\*kwargs)
return result
return wrapper
# 规则: 执行装饰器内容是从上到下。 被装饰的顺序是从下到上。
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)**
![img](https://img-blog.csdnimg.cn/img_convert/b7893f2a44e6f14337fb0c09eca1dc66.png)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
wrapper
# 规则: 执行装饰器内容是从上到下。 被装饰的顺序是从下到上。
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)**
[外链图片转存中...(img-vRl3Iyjp-1713844796395)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**