当前位置: 首页 > 科技观察

为什么你学不会Python,Python入门的4大陷阱

时间:2023-03-12 05:08:39 科技观察

Python以语法简单、关键字少而著称,所以经常被各大媒体忽悠说它是一门非常容易上手的编程语言。他的具体描述是不言而喻的,但其进入的难易程度值得商榷。因为每个人的基础都不一样。市面上的Python入门书籍大多目录很长(毕竟少一个重要的知识点会被批),但是作为入门,真的需要把所有的知识点都学一遍吗?对于初学者来说,看着这些书籍目录学习往往会遇到各种坑。今天我就分享一下我的个人看法。语法规则太多了。Python的语法规则多吗?其实有很多。如果你研究过一些不再更新的旧编程语言,你会发现Python中其实有很多语法规则。因为Python需要适应现代的发展要求,他“被迫”不断地加入新的语法特性,比如“装饰器”、“海象运算符”等等。这时候,初学者就会陷入第一个陷阱——抵挡不住“目录”的诱惑,觉得跳过某个知识点就无从下手。作为初学者,我不建议学习这些东西(你可能短期内用不上)。那么,你需要学习什么语法呢?分支判断循环就是简单的if和for循环。事实上,学习这些语法并不需要你去死记硬背它们的写法。大多数时候,这些语法语句并不需要我们将每个字母都手写出来,因为现在的ide都非常友好,一般都提供了生成代码段的功能。下面是vscodeDemo:经常看到有人建议入门的时候必须手写每段代码。你一定要三思,这只能提高你的键盘打字水平。水平,这就是代码段的好处,哥们:“其他的语法规则呢,比如运算符优先级,怎么想不起来了?”其实我从来没有背过运算符的优先级,因为当有多个运算符时,我总是用括号来明确它们的优先级:小伙伴:“看起来很容易上手,if和for语法真的那么容易学习?”不,像if语法学习的重点不是怎么写,而是如何构造bool值,这需要你进一步了解基本数据类型(str、int、bool等)。好在这些知识点的数量很少,不需要对每一种存储机制(比如需要多少字节)都深入了解才能入门。以上知识点可能只是一本入门书的1到3章。内容序列的处理非常重要。对if和for的用法有了基本的了解之后,下一步就是了解序列(列表、元组)的数据结构。至此,初学者又会掉进另一个坑里——list里面有很多方法需要死记硬背!同样,我也不建议初学者死记硬背这些方法,只需要死记硬背最常用的1、2个操作即可。例如:添加元素:append删除元素:remove同样,字符串的处理方法也有很多,通常我们只需要学习其中的几种方法即可。即使是上面的两个操作也很少用到。因为在Python中,更倾向于构造新的序列,而不是就地操作序列。后面学习推导的时候,你会发现if和for是用的最多的语法。您可能想知道为什么序列处理很重要?无论学习什么编程语言,无论是应用开发还是普通办公自动化学习,真正复杂的逻辑大部分都来自于序列处理。比如一堆文件,每个文件都会有一堆数据。对于简单的单一数据,操作往往非常直接和简单。你想在这个阶段学习字典吗?我的建议是试着理解它。如果你发现你看不懂,那就跳过它。因为后期总会有他的应用场景,所以在结合场景的时候,更容易学会当时分解问题的思维,你对问题一无所知。这时你就掉进了另一个陷阱——边写代码边思考逻辑。大多数入门书籍不会教你这个,因为这不是Python的特性,但却是极其重要的。编程的本质是用代码表达现实的逻辑。现实中,当我们要完成一件比较复杂的事情时,总是先考虑整体流程,再分成多个子流程,最后再考虑每个子流程的细节。在我的文章中,案例是必不可少的。考虑以下真实场景:您想从家庭书架(有100多本书)中查找某个作者的书。你可能认为这件事很简单。不就是从头开始,每本书看作者名字,符合就拿出来吗?这个思考过程其实是一个从整体到细节的过程:首先,你会考虑从哪里开始找,总有一个寻找的方向。例如,从书架的左上角水平扫描每行书籍。其次,在你开始找书之前,你决定找一本书,看看封面上的作者名字。最后,如果符合条件就拿出来与原书区分开来。请注意,以上各点的考虑是在您开始操作之前决定的。这就是从整体到细节的考虑。您不会拿起一本书然后想知道如何找到作者的名字吗?找到它然后拿出来?这是非常违反直觉的。然而,Python初学者经常会使用这种反人类直觉的编程方式——写到哪里,想到哪里,现在又转向Python问题。一个文件夹里面有很多文本文件,每个文件相当于一本书,里面有书名、作者姓名等信息:下面是一种反直觉的写法。文末会给出自定义函数的方法,大家可以明显感受到两种写法在思维上的区别。第一步:如何保证每一个文件都被取出来,不遗漏,不重复取出?在网上搜索“python文件夹文件”后,可以找到很多方法,我就用其中一种:importosforfileinos.listdir(r'Targetfolderpath'):#file是每个文件的路径passStep2:有个文件路径,怎么读取里面的内容?网上搜索“python读取文件”,找到:withopen('文件路径(记得带后缀)','r')asf:lines=f.readlines()#lines是一个列表,每个元素是里面的一行内容文件。这一步其实是第一步的后续操作,所以:importosforfileinos.listdir(r'targetfolderpath'):#file是每个文件的路径withopen(file,'r')asf:lines=f。readlines()第三步:文件中作者行的内容是“Author:”前缀,我给你这一行,怎么在里面提出作者的名字?这是一个常见的字符串操作:'Author:Xiaoming'.split(':')[1]这应该是初学者必学的方法,当然你也可以上网搜索“python字符串分割”所以现在代码是这样的(去掉书名):importosforfileinos.listdir(r'targetfolderpath'):withopen(file,'r')asf:lines=f.readlines()#第三步book=lines[0].split(':')[1]author=lines[1].split(':')[1]第四步:判断书名是否是我们要找的如果满足要求取出来,使用if判断和基本序列操作:importos#第四步results=[]target='Xiaoming'forfileinos.listdir(r'目标文件夹路径'):withopen(file,'r')asf:lines=f.readlines()book=lines[0].split(':')[1]author=lines[1].split(':')[1]#第四步iftarget==author:results.append(book)现在,结果列表就是结果。代码看似简单,但是如果书里不再存放文件这个文件是一个Excel,你能一下子知道在哪里修改吗?初学者常常对这些细节感到沮丧。明明看懂了别人写的,解决自己问题的时候却一头雾水。这是因为,Python中有一个知识点可以完美匹配“从整体到细节”的过程!但是初学者一般不知道怎么用。您必须学习自定义函数。为什么编程语言基本上都具有自定义函数的特点?因为这符合我们解决问题的思维逻辑。还是解决前面的问题:#Step1:从书架上取出书defget_file_paths(folder):pass#Step2:看封面,获取书名和作者defget_book_message(file):passreturnbook,author#Step3:看看是否满足defmatch(author):returnauthor=='小明',怎么感觉少了最后一步“把满足条件的书拿出来”?看整体调用:results=[]forfileinget_file_paths(r'targetfolderpath'):book,author=get_book_message(file)ifmatch(author):results.append(book)包含了“取出符合条件的书”的逻辑在整个过程中。接下来,将每个自定义功能一一实现即可。违反直觉,解决方案与之前相同。但是怎么感觉代码量比以前多了呢?确实如此,但是如果现在将信息存储在excel中,你可以立即知道修改哪个函数,修改的负担就少了很多。为什么?因为函数定义有Constraints,看上面get_book_message的函数定义,必须传入一个文件路径,返回一个元组(书名,作者)。整体的过程和每一步的其他作用,不管你是怎么从一个文件路径中得到元组的,过程不重要,结果最重要如何推进上面的总结(适合初学者):语法学习很简单(if,for)你需要了解基本序列(列表,元组),但你不需要记住它的对象操作方法。学会分解问题的思路,学会自定义功能。其实第3点是最重要的,其他的点都是针对他的。所以,Python的进度顺序还是围绕第3点展开的。比如前面的例子,整体流程代码中仍然包含“取出合格书籍”的逻辑,这其实是不合理的。那么这个时候你就会学习到新的语法知识点,这样可以简化整体的流程代码。这可能需要你去学习:lambda高阶函数的定义(专有名词很吓人,其实它们可以将逻辑传递给函数参数)例如:#第二步:看封面,得到标题和书的作者defget_book_message(file):passreturnbook,author该函数只返回书名和作者姓名。如果还有其他信息,整个流程的代码也很麻烦。此时,你需要学习面向对象的知识:比如定义类(使用命名元组也是可以的)。我觉得最好是根据自己的实际需要有选择性地学习,因为有使用场景的时候是最容易学的。