大家好,我是PythonGao ,今天是我Kotlin入门后,入行Python后,第一次总结下自己的经验!
17年从野鸡大学毕业后,刚开始接触的Java,后来入门了Kotlin,后来我自学Python,成功入行,现在已经在新的公司干了大半年了!。
昨天我分享了别人 为什么学习 Python ?的文章,只是以 Python 语言本身的特性来描述了这个理由,今天就来说说我自己。
01 为什么学Python?
相信能进来看这篇体会小文的人,都是因为工作或者兴趣要学习Python,不是盲目地,不过我还是啰嗦几句Python的前世今生,已经了解的朋友可以略过。
1991年,荷兰人Guido van Rossum创造出了Python这门程序语言,名字的来源于他特别着迷的一部BBC喜剧系列Monty Python's Flying Circus。
Python的设计理念是“简单”、“明确”、“优雅”。
python也算是一门最简单的开发语言的一种。主要还是全栈语言。
如果你是零基础,注意是零基础,想入门编程的话,我推荐你学Python。虽然国内基本上是以C语言作为入门教学,但在麻省理工等国外大学都是以Python作为编程入门教学的。
相对于其他编程语言来说,Python易于学习,它的着重点放在如何解决问题上,而不是语法和结构。正因如此,越来越多的初学者选择Python作为编程的入门语言。山东省在最新出版的小学信息技术六年级教材中,加入了Python的内容。浙江省从2018年起,信息技术教材编程语言从vb更换为Python。
作为一种解释型语言,Python更强调代码的可读性和简洁的语法。采用空格缩进标识代码块,减少毫无用处的大括号,去除句末的分号等,显著提高代码的可读性。
常见于C++的这对大括号的直接去掉,同样的缩进标识出代码块,即使没有接触过编程的人也可以很快读完程序,无需考虑复杂的语法。
Python 有非常多的模块库。基本上标准库就能解决各类问题,开发效率很高。相对于C++和Java等其他语言来说,Python可以让我们用更少的代码实现想法,同样的功能Python的代码只有C++和Java的20%到30%。
Python的开发效率高,就能让产品快速迭代,满足需求。像YouTube、Google、Yahoo!、NASA都在内部大量地使用Python,国内知乎、豆瓣网站也基于Python开发。
随着近年来许多公司首选Python来开发人工智能项目,Python也越来越火爆。根据ranked.com的排名,2018年,最受欢迎的人工智能编程语言是Python,第二是C++。
Python很简洁和易于学习,初学者几乎可以立刻学会这个语言,并马上能完成一些很有意思的事,不会因为编译或语法复杂失去学习的兴趣。比如建个人网站,抓取数据进行分析等等。
学以致用,在Python这里展现得淋漓尽致。
正因为Python的简单易学和开发效率高,我选择了Python,并用于人工智能、Web 开发、网络编程、数据分析、科学计算等领域。
02 怎么学Python
第一步:学习python的准备开发工作
俗话说得好,磨刀不误砍柴工,这个你不得不信,反正我信了。那么怎么磨刀呢?首先,百度一下Python,对Python有一个大概的了解,然后去官方网站下载一个Python,你最好先下载Python2.7版本,学到最后在去看 Python3版本,这符合Python的发展规律,如果你安装的过程中遇到问题,请自行百度搜索,这个百度一下,我敢肯定你会找到答案的,我相信你。以上说的是在Windows操作系统下安装。
第二步:先写一个Hello World
找到Python的安装目录,看到一个python.exe的文件,请用鼠标双击。是不是看到一个黑窗口,请输入print(“hello world!”),然后按Enter键。如果顺利,你将看到如下图所示的窗口。
第三步:学会Python运行的原理
不要怕,原理我可以用简单的语言告诉你,你不必东北西走的找。我们可以把那个python.exe当成翻译官(解释器),当我们输入print(“hello world”)的时候,翻译官会把我们的输入解释给操作系统,然后操作系统就明白是要向屏幕输出hello world,其实就是这么简单。
第四步:学会python如何运行编写好的脚本文件
紧接着上一步,请把黑窗口关掉,然后再次打开,你会发现你之前输入的东西都没有了,怎么办?我想保存住之前的输入怎么办?别着急,我来帮你。
现在,请用一个记事本,创建一个纯文本文件,保存成hello.py,请把这个hello.py放到c盘根目录中。
然后,请打开cmd窗口(不知道什么是cmd?百度一下你就知道,是吧),在窗口输入python c:\hello.py,如果顺利,你会看到类似下图的样子。
第五步:选一本合适的入门书,在Python官网进行辅助学习。
比如《“笨办法”学Python》(Learn Python the Hard Way)
国内可以买到的中文版是基于Python2 的第三版,知乎上有赵默水发布的Pyton3的中文译本,可以在线阅读。
这本书以循序渐进的方式介绍Python的基本语法和编程思想,由浅入深,由易到难,非常符合认知规律。书里一共设置了52个练习,可以边学习,边实践,了解Python的输入输出、变量、函数,以及条件判断、循环、类和对象等。
我平时工作很忙,没有大块时间可以看书,只能充分利用碎片时间,比如工作间隙、饭后、通勤路上等等。
做笔记,划重点,前面的章节篇幅非常短,看完只要几分钟,在理解基础上,结合习题内容进行些拓展。
做习题不着急在电脑上敲代码,写到本上,或者电脑的记事本记下思路,画个流程图。
晚上有时间时,在家里自学完成代码,检查并运行。
有人可能会说,那么简单的程序,画什么流程图啊?其实不然,从简单的流程图开始,熟练了,复杂的程序流程图,才能驾轻就熟地画出来。
画流程图也是一个整理思路的办法,配合用思维导图来构建自己的Python知识树,很有帮助。
看这本书,不求快,把基础夯实,只要独立完成这本书的学习,入门是没问题的。
看书的同时,通过Python官网拓展相关内容,比如函数、库等等的用法。
遇到难题,先想后问,一个办法不行,换一个试试。
多看、多想、多练,坚持不懈,要不了多久Python基础部分就拿下了。
剩下的就是选择一个方向来深入学习了。
03 编程工具和外语
用什么工具来写Python代码都没关系,只要选择自己熟悉、顺手的就行,把注意力集中在代码上,不要浪费太多精力在环境配置上。
Sublime Text 3, vi, PyCharm等等都可以。
这三样我都在使用,简单的vi最方便,在一个iTerm窗口里编辑,另外一个iTerm窗口运行。
很多书和资料都是英文的,减少了中间翻译的环节,理解更清晰些。
找工作
我是3月份找工作的天气不算热,面了10家公司,不是很多,拿了5 家offer, 面试题不难,我整理出来了!
自我介绍
这是一道送分题,万年不变的第一个问题。不过有些小伙伴可能没有太在意,其实这个问题已经在面试官心中决定了你的去留意向。自我介绍的主要结构:个人基本信息 + 基本技术构成 + 项目经验(具体项目以及在项目中的负责部分)+ 自我评价,其中的原则就是紧紧围绕招聘岗位的需求做介绍。在此之前要做好准备工作,看看招聘方具体需要什么方向的研发工程师。目前针对Python,boss上的招聘多为自动化测试平台的设计与开发、数据的挖掘与清洗。单纯的web开发好像还没有,所以web方向的同学注意,多和运维以及自动化方面靠拢。
二段式询问
在面试的过程当中,在面试官提出问题的时候,往往会就问题本身引申出较深层次的问题。比如:你使用过with语句吗?我的回答是:with语句经常适用于对资源进行访问的场合,确保在访问的过程中不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放。面试官紧接着问,那你知道为什么with语句能够使文件正确关闭,一下子把我问闷了,只能依稀记得with语句会开辟出一块独立环境来执行文件的访问,类似沙盒机制。面试官对这个答案不置可否,算是勉强通过了。所以知其然更要知其所以然。在平时的学习中,多问一个为什么,面试的时候就不会太被动。
不要给自己挖坑
确保你在回答面试官的过程中,回答中的每个知识点都了然于胸,不然被问住,是很难堪的。我在回答web安全问题时,顺嘴说了SQL注入,面试官说既然提到了SQL注入,那么你讲讲它的原理及解决方法吧!丢脸的是我竟然把XSS跨站注入攻击和SQL注入搞混了,场面也是有点尴尬。所以斟酌你说的每一句话,聪明点的同学还可以引导面试官,让他问出自己想要被问的问题。
必问到Redis,高并发解决办法
面试了好多家公司,必然问道Redis了解多少,高并发的解决办法。笔者回答的都不是很好。
这一年你学习了什么新的技能
这是面试官在考察你是否对于新鲜技术抱有极大热忱。因为我没有任何Python经历,我就把以前的java简历改成了Python相关的。面试我的面试官无一例外都问到了这个问题。他们都希望能找一个不断学习,开括创新的年轻人。多浏览最新的技术资讯,选择一方面自己感兴趣的领域。
你会选择创业公司还是像BAT那样的大公司,为什么?
当然是看招聘方属于哪一个公司啦,不过问这种问题的一般都是创业公司。答案无非是:挑战大,享受挑战;创业公司具有无限成功的可能性,想随公司一起成长;
为什么你要从上一家公司离职?
这也是一个必问问题,找一个比较正当的理由,不要说什么公司零食太多胖了20斤,公司周别附近的外卖都吃腻了,真的别这样说…主要原则就是不要对前公司抱有怨言,BOSS朝令夕改,PM不靠谱什么的,多寻找自身原因:公司发展比较稳定,但我还年轻,希望有更大的挑战和更多的学习机会。像这样就可以。
描述一下你的上一家公司
这个问题问到的几率不太大,不过也还是有三家公司问到过,招聘方主要想从上一家公司的具体经营规模以及主营业务来定位你的水平,知道招聘方的目的就可以从容应答。
技术性问题
非技术性的问题就是以上这么多,作为参考稍加准备,面试的时候就能对答如流。下面讲一下在面试中的技术性问题。个人感觉技术性的问题面试官问的没有特别多,一般考察2-3个,由浅到深。
简述函数式编程
在函数式编程中,函数是基本单位,变量只是一个名称,而不是一个存储单元。除了匿名函数外,Python还使用fliter(),map(),reduce(),apply()函数来支持函数式编程。
什么是匿名函数,匿名函数有什么局限性
匿名函数,也就是lambda函数,通常用在函数体比较简单的函数上。匿名函数顾名思义就是函数没有名字,因此不用担心函数名冲突。不过Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。
如何捕获异常,常用的异常机制有哪些?
如果我们没有对异常进行任何预防,那么在程序执行的过程中发生异常,就会中断程序,调用python默认的异常处理器,并在终端输出异常信息。
try…except…finally语句:当try语句执行时发生异常,回到try语句层,寻找后面是否有except语句。找到except语句后,会调用这个自定义的异常处理器。except将异常处理完毕后,程序继续往下执行。finally语句表示,无论异常发生与否,finally中的语句都要执行。
assert语句:判断assert后面紧跟的语句是True还是False,如果是True则继续执行print,如果是False则中断程序,调用默认的异常处理器,同时输出assert语句逗号后面的提示信息。
with语句:如果with语句或语句块中发生异常,会调用默认的异常处理器处理,但文件还是会正常关闭。
copy()与deepcopy()的区别
copy是浅拷贝,只拷贝可变对象的父级元素。 deepcopy是深拷贝,递归拷贝可变对象的所有元素。
函数装饰器有什么作用(常考)
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
简述Python的作用域以及Python搜索变量的顺序
Python作用域简单说就是一个变量的命名空间。代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是变量的作用域。在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域。Python的变量名解析机制也称为 LEGB 法则:本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)
新式类和旧式类的区别,如何确保使用的类是新式类
为了统一类(class)和类型(type),python在2.2版本引进来新式类。在2.1版本中,类和类型是不同的。
为了确保使用的是新式类,有以下方法:
- 放在类模块代码的最前面 __metaclass__ = type
- 从内建类object直接或者间接地继承
- 在python3版本中,默认所有的类都是新式类。
简述__new__和__init__的区别
创建一个新实例时调用__new__,初始化一个实例时用__init__,这是它们最本质的区别。
new方法会返回所构造的对象,init则不会。
new函数必须以cls作为第一个参数,而init则以self作为其第一个参数。
Python垃圾回收机制(常考)
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。
1 引用计数
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少.引用计数为0时,该对象生命就结束了。
优点:
- 简单 实时性 缺点:
- 维护引用计数消耗资源 循环引用
2 标记-清除机制
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
3 分代技术
分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。
Python默认定义了三代对象集合,索引数越大,对象存活时间越长。
Python中的@property有什么作用?如何实现成员变量的只读属性?
@property装饰器就是负责把一个方法变成属性调用,通常用在属性的get方法和set方法,通过设置@property可以实现实例成员变量的直接访问,又保留了参数的检查。另外通过设置get方法而不定义set方法可以实现成员变量的只读属性。
*args and **kwargs
*args代表位置参数,它会接收任意多个参数并把这些参数作为元组传递给函数。**kwargs代表的关键字参数,允许你使用没有事先定义的参数名,另外,位置参数一定要放在关键字参数的前面。
有用过with statement吗?它的好处是什么?具体如何实现?
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
what will be the output of the code below? explain your answer
- def extend_list(val, list=[]):
- list.append(val) return list
- list1 = extend_list(10)
- list2 = extend_list(123, [])
- list3 = extend_list('a')
- print(list1) # list1 = [10, 'a']print(list2) # list2 = [123, []]print(list3) # list3 = [10, 'a']class Parent(object):
- x = 1class Child1(Parent):
- passclass Child2(Parent):
- passprint(Parent.x, Child1.x, Child2.x) # [1,1,1]Child1.x = 2print(Parent.x, Child1.x, Child2.x) # [1,2,1]Partent.x = 3print(Parent.x, Child1.x, Child2.x) # [3,2,3]
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- arr = [[1,4,7,10,15], [2,5,8,12,19], [3,6,9,16,22], [10,13,14,17,24], [18,21,23,26,30]]def getNum(num, data=None):
- while data: if num > data[0][-1]: del data[0]
- print(data)
- getNum(num, data=None) elif num < data[0][-1]:
- data = list(zip(*data)) del data[-1]
- data = list(zip(*data))
- print(data)
- getNum(num, data=None) else: return True
- data.clear() return Falseif __name__ == '__main__':
- print(getNum(18, arr))
获取最大公约数、最小公倍数
- a = 36b = 21def maxCommon(a, b):
- while b: a,b = b, a%b return adef minCommon(a, b):
- c = a*b while b: a,b = b, a%b return c//aif __name__ == '__main__':
- print(maxCommon(a,b))
- print(minCommon(a,b))
获取中位数
- def median(data):
- data.sort()
- half = len(data) // 2
- return (data[half] + data[~half])/2l = [1,3,4,53,2,46,8,42,82]if __name__ == '__main__':
- print(median(l))
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
- def getOneCount(num):
- if num > 0:
- count = b_num.count('1')
- print(b_num) return count elif num < 0:
- b_num = bin(~num)
- count = 8 - b_num.count('1') return count else: return 8if __name__ == '__main__':
- print(getOneCount(5))
- print(getOneCount(-5))
- print(getOneCount(0))
有几家给了13K,有一家给了 15K,最后选了在浦东的一家公司。目前工作大半年了,第一次分享,但我还是会坚持 kotlin 的学习。
最近下决心 花了一万买了MC, 购置了一台电脑桌,方便我以后学习!
以上就是我面试过程中所被问到的问题,算法题还是比较少的,也只有2家公司要求写算法,数据结构似乎被问到的不是特别多,就问到了一个B+树的结构。数据库问到的是索引相关的优化。稍微有些基础的都能回答上来,但是最好可以深层次的探讨一下。
本文只做抛砖引玉之用,有些见解还不是特别成熟,希望可以为自学Python 并找工作的伙伴们提供一些帮助,面试过程当中最重要的一点是放平心态,求职过程是双方的,不需要太过紧张,把自己掌握的知识充分表达出来就好。只要你是匹千里马,迟早会被伯乐牵出来遛一遛的。
PythonGao:我是来自野鸡大学,一个既会 kotlin 又会 python 的小二逼。
打赏就不开了,你的转发就是对我最大的支持。