Python近些年火的有些神奇,为什么这么说呢?“七天速成Python”、“新手一个月从入门到精通”、“想拿高薪就学Python”… 这些铺天盖地的广告宣传语,每次听到我都满脸问号???
python火在当前大数据、云计算时代这确实有它的道理。
但是!
- 七天速成?
- 一个月精通?
- 你确定吗?
“大家都说python很简单” 这个是针对有编程基础的朋友来说,老司机可能看几天文档,拿起来就开发项目。
“Python不难啊,我几天就上手了!”厉害!好奇一问,“我之前有过3年的java开发经验啊…”
零基础编程者可别当了韭菜!
开发经验丰富,对Python解释器的实现都了如指掌的人,对于他们来说没有什么语言特定的东西是绕不过去的,他的简单和你的简单完全不是一回事。
python只是入门难度低,入门!
要说“语法”层面的简单,的确如此,跟其他编程语言如 C++、Java、PHP、Go 相比,Python语法确实要简单很多,比如完成同一个任务,C语言需要写1000行代码,Java只需要写100行,而Python可能只要20行。
学习编程如果只学习语法,那确实简单,但事实是你才学了三分之一而已,难的在剩下的三分之二,比如装饰器、生成器之类的。
之前听过大神这样说:C语言是自己造轮子,就是C语言的大多数东西都是自己纯手写实现的。java是官方造轮子,是官方写好了很多方法或者函数,让编程人员直接调用。python这门语言是全民造轮子,包括黑客。
python类库比较全面,可以直接调用很多方法。很多常用模块都给你集成好了,别人写好的功能代码,调用一下就能解决很多问题,这个也是相对简单的之一吧。
针对学Python拿高薪这一点,我想说冷静一点儿~
入门简单并不代表人人都能用它拿高薪,想要用python拿高薪工作,算法非常重要,你数学不好学起来会有些费力,因为难在算法,巨量的数据运算需要python 算法。
一些因为python简单而去学习的,并且想靠它来吃饭的,最好考虑清楚,Python只不过入门简单,但是简单的东西大家都会。
很多企业不会招只会表面花架子的,编程语言不能独立于业务而单独存在,编程是为了解决问题。
没有编程基础的人新学一门语言一定一定要有耐心,基础知识没有半年以上的学习和练习是很难彻底掌握的,千万不要图快,学的太快或许会有一时的成就感,但基础知识不扎实也会成为后续技术上的瓶颈。
任何一门编程语言往深学,都会成为工具,能用工具完成具体的任务才是真的学好并用好了它。
总而言之,个人想说有这几点:
1、python入门是简单,但是要真正在工作中使用门槛很高,基础知识要很好。
Python基础大致的一个学习内容:
python语言基础
- Python3入门,数据类型,字符串
- 判断/循环语句,函数,命名空间,作用域
- 类与对象,继承,多态 tkinter界面编程
- Pygame实战飞机大战,2048
python语言高级
- Python常见第三方库与网络编程
- Python正则表达式
- 邮箱爬虫,文件遍历,金融数据爬虫,多线程爬虫
- Python线程、进程
- Python MySQL数据库,协程,jython
Python的简洁易用、快速开发对项目有价值,但这不是你的价值,是Python的价值,想要提高自身的价值,就还需要进一步学习。
Python语言层面还需要学习下面这些内容:
1)使用生成器, 迭代器
2)函数式编程, 匿名函数lambda, map, reduce, filter
3)列表解析, 字典解析, 集合解析, 生成器解析
4)运算符重载(setattr, getattr, getitem, gt, lt...)
5)property, 描述符(get, set, delete)
6)上下文管理器(enter, exit)
7)深入理解面向对象
上述都是语言层面的,属于内功,实战中当然也需要一些更为具体的外功,训练外功可以从熟悉Python标准库开始,且在实际项目中也经常用到,列举一些极为常用的:
1)正则表达式 re
2)迭代工具 itertools
3)常用数据结构 collections, heapq, array
4)处理二进制数据 struct
5)随机 random
6)系统调用 os
7)Python对象序列化 pickle
8)多进程多线程处理 threading, multiprocessing
9)网络 socket, urllib
10)系统参数 sys
无论练习内功或外功,结合实战都是最好的训练方式和检验手段,可以根据个人情况以及喜好选择。
比如:
使用django, flask开发网站
开发网络爬虫或使用Python爬虫框架(如scrapy)
写一些自动化运维脚本, 定时读取某软件log, 出现异常自动发邮件
使用selenium对网站进行测试
使用Python开发树莓派小车(电机,传感器驱动)
使用Python开发Vim插件, 如在vim中做一个音乐播放器
使用Python做算法题, 如leetcode
opencv做图像识别
使用numpy和pandas做数据处理
使用机器学习库sklearn, tensorflow做应用
使用PyQt编写桌面应用
使用scipy, matplotlib做科学计算
使用Python做渗透测试
......
个人建议选择小项目进行实训,有些新手上来就想定一个大目标,做的时候很挫折, 往往半途而废。
把小东西先实现,然后优化,接下来添加新功能,慢慢迭代把小东西做大,这样在做的时候,每实现一个小功能你都会很有成就感。
总的来说就是先明确你的目标,如果你已经知道你想要学编程干什么了,那么就去找学习路线图,它能告诉你要学哪些东西。
比如说爬虫的学习路线图,上面已经把你要学的知识点都写清楚了,你只要找到对于的资源去学习就可以了,这样学下来,你的知识路线是清晰的,不至于学得一头雾水或者不知道自己在学什么。
![在这里
看上去挺多的,可是每天一点点累积下来发现并不是很多!归根结底不要想太多,胖子一口吃不成,得日积月累。顺着方向去学习,建立好自己的学习路线,最好是可以系统化。
如果你还不明确你的学习路线,也没有好的学习资料,可以扫下方二维码领取详细学习资料+精准学习路线
2、Python 越往后学难度越大
学完基础语法,接触到下面这些概念,你可能就不会觉得Python简单了!新手初学Python中遇到的难以理解的概念:
比如编码问题、装饰器、闭包、对象引用、可变性,抽象基类、魔术方法、多重继承、mixin、重载、可迭代对象、迭代器和生成器、上下文管理、基于生成器的协程、原生协程、asyncio 异步编程、描述符协议、元编程等。
说说装饰器,很多人一听直摇头吧哈哈~
在代码运行期间动态增加功能的方式,称之为“装饰器”。装饰器可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print("call%s():" % func.__name__)
return func(*args, **kw)
return wrapper
- 程序扫描到装饰器,默认执行,被装饰的函数名作为参数,保存在装饰器里面,被装饰的函数名被替换成装饰器的返回值
- 被“@函数”修饰的函数不再是原来的函数,而是被替换成一个新的东西(取决于装饰器的返回值)
- 调用被装饰的函数,就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改
如果程序中另外还有一个函数,也需要使用装饰器,但是这个新的函数有 2 个参数,此时又该怎么办呢??
最简单的解决方式是用 *args 和 **kwargs 作为函数装饰器内部函数的参数,*args 和 **kwargs 表示接受任意数量和类型的参数
import time
def timer(func):
def wrapper(*args, **kwds):
t0 = time.time()
func(*args, **kwds)
t1 = time.time()
print('耗时%0.3f' % (t1 - t0,))
return wrapper
@timer #do_something=timer(do_something)
def do_something(delay):
print('函数do_something开始')
time.sleep(delay)
print('函数do_something结束')
do_something(3)
同时Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性,熟练掌握装饰器会让你的编程思路更加宽广,但是它学起来也是真头疼!
函数闭包的概念在初学时容易迷糊,尤其涉及到闭包的作用域和参数问题。
python有一个很有意思的地方,就是def函数可以嵌套在另一个def函数之中。调用外层函数时,运行到的内层def语句仅仅是完成对内层函数的定义,而不会去调用内层函数,除非在嵌套函数之后又显式的对其进行调用。
x = 99
def f1():
x = 88
def f2():
print(x)
f2()
f1()
88
可以看出,f1中的嵌套变量x覆盖了全局变量x=99,然后f2中的本地变量按照引用规则,就引用了x=88。
下面我们来说说嵌套作用域的一个特殊之处:
本地作用域在函数结束后就立即失效,而嵌套作用域在嵌套的函数返回后却仍然有效。
def f1():
x = 88
def f2():
print(x)
return f2
action = f1()
action()
88
这个例子非常重要,也很有意思,函数f1中定义了函数f2,f2引用了f1嵌套作用域内的变量x,并且f1将函数f2作为返回对象进行返回。
最值得注意的是我们通过变量action获取了返回的f2,虽然此时f1函数已经退出结束了,但是f2仍然记住了f1嵌套作用域内的变量名x。
上面这种语言现象称之为闭包:一个能记住嵌套作用域变量值的函数,尽管作用域已经不存在。
3、要学习一门编程,最好买一本专业的书籍,而不是什么零基础速成七七八八之类的教材,踏踏实实学才是捷径。
推荐几本适合零基础学习的Python书籍
《Python编程从入门到实践》
是一本适合新手小白入门的书籍,我个人也比较推荐这本。
包括基础知识和项目两部分,基础篇介绍基本的编程概念,实战篇介绍如何利用新学到的知识开发功能丰富的项目:2D游戏《外星人入侵》,数据可视化实战,Web应用程序。
我比较喜欢它的行文逻辑流畅,从编程小白的角度看,入门极佳;手把手教的感觉,却绝不啰嗦。书中的内容讲解也比较详细精简,不会让小白看起来很难理解。
最重要的是每个小结都附带有”动手试一试”环节,学编程最佳的方式就是多动动手、多动动脑。
4、学习编程需要学习编程思路
首先第一点:三年高考五年模拟的应付试学习思想在编程这是不管用的,需要转变学习思路,记记背背作用不大。
你辛辛苦苦,埋头苦学了好久基础知识,甚至书都被翻烂了,但是跟着别人的视频或者文章写一个代码,一运行,一堆一堆的error!于是你又要吭哧吭哧的重新排查…
这个知识点我会,为啥会报错?
这个知识点我会,为啥写错了?
这里的结果为啥和我想的不一样?!
切忌无脑照着别人的代码敲,甚至我都不建议你记笔记。
因为最重要的是能够学习别人的编程的思路,你要时刻思考这个功能是怎么实现,为什么要这么实现。最好能每次看完书或者视频,用自己的思路把这些东西整理出来,在和视频中对比,找出问题,这样才能把人家精髓的东西消化到自己的思维中。
第二点:要学会用计算机编程思维去思考问题,而不是在学习死知识
训练自己的编程思维,学习成熟的解决问题的方法:
比如if 语句用来做分支判断,循环用来解决反复运算的问题。穷举法、递推、递归、排序、回溯等等(如果需要当专业程序员,需要学习数据结构和算法,设计模式等等,需要学的东西很多很多。但首先要解决的一个问题是自己能写代码解决一般问题。)
训练函数抽象,类抽象解决问题。如对有序数组,查找特定数值,没有经过训练,初学者,直接用循环遍历。如果经过二分法算法的训练,下次碰到这样的问题,就用二分法求解。
建议大家,解决问题的时候,首先要把问题分解。大化小,很多小问题已经有了非常成熟的解决方案,搜索引擎可以解决大部分问题,我们直接拿来用就可以了,并且记住这种解决问题的方案。
而剩下解决不了的小问题,我们在进行针对性解决,每一个小问题解决后,一整块大问题就随之解决。
第三点:做习题,要像开发项目的流程一样
(需求->需求分析->设计->编码->测试->交付等)
拿到一个习题,还没有进行分析,就马上敲代码,这个学习方式,是不好的学习方式。
分解问题,会做需求分析,慢慢训练,才会养成自己的思路。没有人一出生会编程,只有经过训练,才能熟能生巧。很多牛逼程序员用vim,敲的啪啪响,一会儿一屏幕代码,为啥那么熟练使用vim,习惯成自然。
当你训练多了以后,学会一定的套路(解决问题的方法),养成独立思考的习惯,假以时日,自然就有思路了。
5、不管是python、java还是其他编程语言,归根结底只是一门语言、工具,不需要去神话某种语言。
在我们初学的时候,往往会听到一些人说这个语言不行、那个语言什么什么厉害,学这个语言好!… 这其实不对的,语言是我们的工具,我们要做的是解决问题,而不是去研究谁的工具最牛逼,你用好了都厉害!
各个编程语言都有自己擅长的方面,比如 Linux 内核系统调用、底层交互方面,C++ 可能更占优势;实际业务场景中有大量的计算任务和并发时,可能要达到某一参数指标,Go 会更加简单。
在能满足业务要求的前提下,谁最容易达成目标,谁才是最简单的。
我觉得简单都是一个相对的,任何一门编程语言,想要用得十分熟练甚至精通,都不是一件简单的事情。
完整版的Python全套学习资料已经上传CSDN 朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。