(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
本篇文章不会过多的向你介绍装饰器的基本知识,我会默认你知道什么是装饰器,并且懂得如何写一个简单的装饰器。
不了解装饰器的可以先去阅读我之前写的文章,非常全且详细的介绍了装饰器的各种实现方法。
常规的装饰器
下面这是一个最简单的装饰器示例,在运行 myfunc 函数的前后都会打印一条日志。
def deco(func):
def wrapper(*args, **kw):
print("Ready to run task")
func(*args, **kw)
print("Successful to run task")
return wrapper
@deco
def myfunc():
print("Running the task")
myfunc()
装饰器使用起来,似乎有些高端和魔幻,对于一些重复性的功能,往往我们会封装成一个装饰器函数。
在定义一个装饰器的时候,我们都需要像上面一样机械性的写一个嵌套的函数,对装饰器原理理解不深的初学者,往往过段时间就会忘记如何定义装饰器。
有一些比较聪明的同学,会利用 PyCharm 来自动生成装饰器模板
然后要使用的时候,直接敲入 deco 就会生成一个简单的生成器代码,提高编码的准备效率
使用神库
使用 PyCharm 的 Live Template ,虽然能降低编写装饰器的难度,但却要依赖 PyCharm 这一专业的代码编辑器。
这里,我要教你一个更加简单的方法,使用这个方法呢,你需要先安装一个库 : decorator,使用 pip 可以很轻易地去安装它
$ python3 -m pip install decorator
从库的名称不难看出,这是一个专门用来解决装饰器问题的第三方库。
有了它之后,你会惊奇的发现,以后自己定义的装饰器,就再也不需要写嵌套的函数了
from decorator import decorator
@decorator
def deco(func, *args, **kw):
print("Ready to run task")
func(*args, **kw)
print("Successful to run task")
@deco
def myfunc():
print("Running the task")
myfunc()
deco 作为装饰函数,第一个参数是固定的,都是指被装饰函数,而后面的参数都固定使用 可变参数 *args 和 **kw 的写法,代码被装饰函数的原参数。
这种写法,不得不说,更加符合直觉,代码的逻辑也更容易理解。
带参数的装饰器
装饰器根据有没有携带参数,可以分为两种
第一种:不带参数,最简单的示例,上面已经举例
def decorator(func):
def wrapper(*args, **kw):
func(*args, **kw)
return wrapper
第二种:带参数,这就相对复杂了,理解起来了也不是那么容易。
def decorator(arg1, arg2):
def wrapper(func):
def deco(*args, **kwargs)
func(*args, **kwargs)
return deco
return wrapper
那么对于需要带参数的装饰器,decorator 是否也一样能很好的支持呢?
下面是一个官方的示例
from decorator import decorator
@decorator
def warn_slow(func, timelimit=60, *args, **kw):
t0 = time.time()
result = func(*args, **kw)
dt = time.time() - t0
if dt > timelimit:
logging.warn('%s took %d seconds', func.__name__, dt)
else:
logging.info('%s took %d seconds', func.__name__, dt)
return result
@warn_slow(timelimit=600) # warn if it takes more than 10 minutes
def run_calculation(tempdir, outdir):
pass
可以看到
- 装饰函数的第一个参数,还是被装饰器 func ,这个跟之前一样
- 而第二个参数 timelimit 写成了位置参数的写法,并且有默认值
- 再往后,就还是跟原来一样使用了可变参数的写法
不难推断,只要你在装饰函数中第二个参数开始,使用了非可变参数的写法,这些参数就可以做为装饰器调用时的参数。
签名问题有解决?
我们在自己写装饰器的时候,通常都会顺手加上一个叫 functools.wraps 的装饰器,我想你应该也经常见过,那他有啥用呢?
先来看一个例子
def wrapper(func):
def inner_function():
pass
return inner_function
@wrapper
def wrapped():
pass
print(wrapped.__name__)
#inner_function
为什么会这样子?不是应该返回 func 吗?
这也不难理解,因为上边执行func 和下边 decorator(func) 是等价的,所以上面 func.name 是等价于下面decorator(func).name 的,那当然名字是 inner_function
def wrapper(func):
def inner_function():
pass
return inner_function
def wrapped():
pass
print(wrapper(wrapped).__name__)
#inner_function
目前,我们可以看到当一个函数被装饰器装饰过后,它的签名信息会发生变化(譬如上面看到的函数名)
最后
不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~
给大家准备的学习资料包括但不限于:
Python 环境、pycharm编辑器/永久激活/翻译插件
python 零基础视频教程
Python 界面开发实战教程
Python 爬虫实战教程
Python 数据分析实战教程
python 游戏开发实战教程
Python 电子书100本
Python 学习路线规划
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!