过来人想泼泼冷水:学Python说简单真的简单,但难它也真的难

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%免费】。
在这里插入图片描述

在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是在VMware虚拟机上搭建Linux python的编程环境,并打造客户-服务器的步骤: 1. 安装Linux操作系统:首先需要在VMware虚拟机上安装Linux操作系统,可选择Ubuntu、CentOS等常见版本。 2. 安装Python:在Linux操作系统中,Python可能已经预装,如果没有则需要手动安装。在终端中输入以下命令进行安装: Ubuntu:sudo apt-get install python3 CentOS:sudo yum install python3 3. 安装编辑器:选择一个合适的编辑器来编写和运行Python代码,如Sublime Text、VS Code、PyCharm等。 4. 编写客户端代码:在编辑器中编写一个简单Python客户端代码,用于向服务器请求数据,例如: ``` import socket # 创建一个TCP/IP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将套接字连接到服务器地址和端口 server_address = ('localhost', 10000) print('connecting to %s port %s' % server_address) sock.connect(server_address) try: # 发送数据 message = 'This is the message. It will be repeated.' print('sending "%s"' % message) sock.sendall(message.encode()) # 查找响应 amount_received = 0 amount_expected = len(message) while amount_received < amount_expected: data = sock.recv(16) amount_received += len(data) print('received "%s"' % data.decode()) finally: print('closing socket') sock.close() ``` 5. 编写服务器端代码:在编辑器中编写一个简单Python服务器端代码,用于接收客户端请求并返回数据,例如: ``` import socket # 创建一个TCP/IP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定套接字到端口 server_address = ('localhost', 10000) print('starting up on %s port %s' % server_address) sock.bind(server_address) # 监听连接 sock.listen(1) while True: # 等待连接 print('waiting for a connection') connection, client_address = sock.accept() try: print('connection from', client_address) # 接收数据 while True: data = connection.recv(16) print('received "%s"' % data.decode()) if data: print('sending data back to the client') connection.sendall(data) else: print('no more data from', client_address) break finally: # 清理连接 connection.close() ``` 6. 运行代码:分别在两个终端中运行客户端和服务器端代码,即可通过客户端向服务器请求数据,并从服务器端收到响应。 以上就是在VMware虚拟机上搭建Linux python的编程环境,并打造客户-服务器的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值