Python

Hire the Top 3% of 自由Python开发人员

Toptal是一个面向顶级Python开发人员的市场, engineers, programmers, coders, architects, and consultants. 顶级公司和初创公司可以雇佣专职(全职), hourly, 或者兼职Python自由职业者,用于他们的关键任务软件项目.

无风险试用,满意才付款.

雇佣自由的Python开发人员和工程师

Chris Lee

自由Python开发人员

United StatesToptal的自由Python开发人员 Since October 3, 2017

Chris在开发API服务方面有多年的经验. 他最喜欢使用aiohttp包, SQLAlchemy(蒸馏器), 和PostgreSQL栈, 但他也熟悉弗拉斯克, MongoDB, Redis, and more. 他是Indico Data solutions后端团队的一员,Indico Data solutions是一家机器学习API和工具提供商,负责开发处理大数据处理和分析的后端服务. Chris在AWS、GCE和Azure云方面也有出色的技能.

Show More

Hannah Herbig

自由Python开发人员

United StatesToptal的自由Python开发人员 Since June 22, 2022

汉娜是一名自学成才的软件工程师,她已经写了十多年的代码. 她的大部分经验都是在Python上, 包括FastAPI和Flask, 但她也有使用Ruby的经验, C++ with Qt, and JavaScript, including Node.js、Vue、jQuery和Socket.IO. Hannah在这些项目中从事后端api和图形用户界面(gui)的工作.

Show More

Maximilian Hopf

自由Python开发人员

United KingdomToptal的自由Python开发人员 Since June 4, 2019

Max是一位数据科学和机器学习专家,专门研究深度学习和自然语言处理. 他帮助建立了德国资金最雄厚的金融科技公司之一,并在伦敦成功创立了自己的人工智能公司. 马克斯的研究成果发表了一篇科学论文, 通过高级分析提高营销准确性, 并为体育赛事和客户行为的预测建立了可靠的模型.

Show More

Viacheslav Zhenylenko

自由Python开发人员

United StatesToptal的自由Python开发人员 Since June 13, 2019

Viacheslav在数据科学和软件工程方面有8年的经验, 专注于Python, 有Java和c++的生产经验. 他对从原始数据中获得的见解充满热情,并喜欢将它们转化为创造卓越的商业价值. Viacheslav精通应用高级机器学习技术, 比如计算机视觉, NLP, 产品推荐系统, networking data, 以及经典的数据科学来解决数据量大的项目.

Show More

伊云约万诺维奇

自由Python开发人员

NorwayToptal的自由Python开发人员 Since June 14, 2019

Branislav是一名高技能、热情的开发者. 他很努力, 具有广泛的解决问题的能力, 并且喜欢实现一个通用的算法方法. 具有团队合作精神,积极进取, Branislav对电子商务和PHP与其他服务的进一步联系感兴趣. 他参与了从确定客户的实际需求到设计系统架构和实现的整个开发生命周期.

Show More

Alex Wang

自由Python开发人员

CanadaToptal的自由Python开发人员 Since 2021年11月24日

Alex是一名在Python、JavaScript、SQL和R语言方面拥有6年以上经验的开发人员. 她喜欢在创业公司和企业环境中工作,并参与了机器学习项目生命周期的所有阶段(研究), data processing, 模型开发, testing, and deployment). 对学习新事物充满热情, Alex一直在通过业余项目构建web应用程序,并且正在寻找能够让她专注于后端开发和API设计的项目.

Show More

瑞恩·马修·史密斯

自由Python开发人员

United StatesToptal的自由Python开发人员 Since 2018年9月12日

在他的职业生涯中, 瑞安一直与初创公司和小型软件商店合作,在那里,每个里程碑都是成败的关键. 他喜欢在AWS中使用Terraform管理代码的基础设施. Ryan用Go和Bash编写DevOps工具,并定期为开源社区做出贡献. Ryan也是使用Docker部署和维护Kubernetes系统的专家. 根据项目的需要,Ryan擅长作为技术领导或与团队一起工作.

Show More

Yoni Levy

自由Python开发人员

IsraelToptal的自由Python开发人员 Since 2019年12月10日

Yoni在11岁时爱上了编程,现在他不知道如何停下来. 他的职业生涯是从c++开始的,从那以后,他的关注点转向了面向用户的软件. 在过去的十年里,他亲自参与了知名初创公司的所有工作. 他目前正在寻求帮助创建出色的iOS/macOS应用程序, 在App Store出现之前,他就有发行复杂iOS应用的经验.

Show More

Keying Wu

自由Python开发人员

GermanyToptal的自由Python开发人员 Since 2022年10月27日

Keying是一位经验丰富的开发者和领导者,拥有6年的经验. 在软件开发和管理的各个阶段都有实践经验, 她是一个终身学习者, a completionist, 也是一个解决问题的人. keyying的专长包括Java、c#的后端服务.NET, Python, REST, Oracle数据库, PostgreSQL, and Redis SQL, 前端带有Angular, 以及AWS等云技术.

Show More

Avenash Kabeera

自由Python开发人员

SingaporeToptal的自由Python开发人员 Since 2019年12月10日

Avenash在软件开发生命周期的各个领域拥有15年以上的经验, 在开发web应用程序方面有良好的记录, 后端服务, 和外部api. 他是一名工程领导者和导师,在不同阶段的公司中拥有建立和扩展高性能团队的经验, 指导软件架构, design, 和实现, 管理跨管理层的利益相关者, product, strategy, operations, 以及业务开发功能.

Show More

Luigi Crispo

自由Python开发人员

阿拉伯联合酋长国Toptal的自由Python开发人员 Since 2019年12月6日

Luigi是一位经验丰富的云和领导力专家,在各种环境中拥有超过二十年的专业经验. 他对技术和价值驱动的项目充满热情,并且具有很强的适应能力. Luigi已经直接参与了一些推动数字时代的领导者的重大行业转型浪潮.

Show More

现在注册以查看更多资料.

Start Hiring
经常成对

获得额外的专业知识

我们的客户经常将这些额外的服务与我们的自由Python开发人员配对.

A Hiring Guide

雇用优秀Python开发人员指南

因此,您找到了一个看起来很强大的Python开发人员. 你如何确定他或她实际上是否在前1%的候选人之列? 这里有一些经过验证的、有效的技巧和问题,可以帮助你找到真正的语言大师.

阅读招聘指南

Python招聘资源

Trustpilot
总体优势

在无风险试用后,98%的Toptal客户选择雇用我们的人才.

Toptal的筛选和匹配过程确保卓越的人才与您的精确需求相匹配.

Start Hiring
报纸上铺天盖地

... 允许公司快速组建具有特定项目所需技能的团队.

尽管对程序员的需求在不断增加,但Toptal对自己近乎常春藤联盟级别的审查感到自豪.

Our clients
为游戏制作应用程序
Conor Kenney
为游戏制作应用程序
构建一个跨平台的应用程序,在全球范围内使用
蒂埃里Jakicevic
构建一个跨平台的应用程序,在全球范围内使用
引领数字化转型
Elmar Platzer
引领数字化转型
挖掘实时数据将改变行业的游戏规则
挖掘实时数据将改变行业的游戏规则
我们的客户怎么想
Clients Rate Python开发人员总数4.4 / 5.0截至2023年12月30日,平均有2324条评论
Testimonials

没有Toptal就不会有Tripcents. Toptal Projects使我们能够与产品经理一起快速发展我们的基金会, lead developer, 高级设计师. 在60多天的时间里,我们从概念到Alpha. 其速度、知识、专业知识和灵活性是首屈一指的. Toptal团队是tripcents的一部分,就像tripcents的任何内部团队成员一样. 他们像其他人一样贡献并拥有开发的所有权. 我们将继续使用Toptal. 作为一家初创公司,它们是我们的秘密武器.

布兰特利·佩斯,首席执行官 & Co-Founder

Tripcents

我对我们与Toptal的合作经验非常满意. 和我一起工作的专业人员在几个小时内就和我通了电话. 在和他讨论了我的项目后,我知道他就是我想要的候选人. 我立即雇用了他,他没有浪费时间就完成了我的项目, 甚至通过添加一些很棒的设计元素来增加我们的整体外观.

保罗·芬利,局长

K Dunn & Associates

与我合作的开发者都非常出色——聪明、有动力、反应灵敏. 过去很难找到高质量的工程师和顾问. Now it isn't.

瑞安·洛克菲勒首席执行官

Radeeus

Toptal立即理解了我们的项目需求. 我们遇到了一位来自阿根廷的杰出自由职业者, from Day 1, 沉浸在我们的行业中, 与我们的团队无缝融合, 理解我们的愿景, 并产生了一流的结果. Toptal使与高级开发人员和程序员的联系变得非常容易.

Jason Kulik,联合创始人

ProHatch

作为一家资源有限的小公司,我们不能犯代价高昂的错误. Toptal为我们提供了一位经验丰富的程序员,他能够立即投入工作并开始做出贡献. 这是一次很棒的经历,我们会马上再来一次.

斯图尔特·波克尼校长

现场专用软件解决方案

我们使用Toptal聘请了一位具有丰富的Amazon Web Services经验的开发人员. 我们面试了四位候选人,其中一位非常符合我们的要求. 这个过程迅速而有效.

Abner Guzmán Rivera,首席技术官和首席科学家

Photo Kharma

Sergio是一个很棒的开发者. 一流,反应迅速,工作效率高.

Dennis Baldwin,首席技术专家和联合创始人

PriceBlink

和Marcin一起工作是一种乐趣. He is competent, professional, flexible, 并且非常迅速地理解需要什么以及如何实现它.

安德鲁·费舍尔,首席技术官

POSTIFY

我们需要一位能立即开始我们项目的专业工程师. 西马纳斯的工作超出了我们的预期. 不需要采访和追踪专家开发人员是一种非常节省时间的方法,并且让每个人都对我们选择切换平台以使用更健壮的语言感到更舒服. Toptal使这一过程变得简单方便. Toptal现在是我们寻求专家级帮助的首选之地.

Derek Minor, Web开发高级副总裁

网络传媒集团

Toptal的开发人员和架构师都非常专业,也很容易共事. 他们提供的解决方案价格合理,质量上乘,缩短了我们的发行时间. 再次感谢,Toptal.

首席执行官杰里米·韦塞尔斯

Kognosi

我们与Toptal合作非常愉快. 他们为我们的应用程序找到了完美的开发人员,让整个过程变得非常简单. 它也很容易超出最初的时间框架, 我们可以在整个项目中保持同一个承包商. 我们强烈推荐Toptal,因为它可以快速无缝地找到高素质的人才.

Ryan Morrissey,首席技术官

应用商业技术有限责任公司

我对Toptal印象深刻. 我们的开发人员每天都和我交流,他是一个非常强大的程序员. 他是一个真正的专业人士,他的工作非常出色. Toptal 5星.

首席执行官彼得罗·卡索

浪人娱乐有限公司

与Toptal合作是一次很棒的经历. 在使用它们之前, 我花了相当多的时间面试其他自由职业者,但没有找到我需要的. 在与Toptal合作后,他们在几天内就为我找到了合适的开发者. 与我一起工作的开发人员不仅提供高质量的代码, 但他也提出了一些我没有想到的建议. 我很清楚,阿莫里知道自己在做什么. 强烈推荐!

行政总裁郑志刚

Bulavard, Inc.

作为一名Toptal合格的前端开发人员,我还经营着自己的咨询业务. 当客户来找我帮忙填补他们团队中的关键角色时, Toptal是我唯一愿意推荐的地方. Toptal的所有候选人都是精英中的精英. Toptal是我在近5年的专业在线工作中发现的性价比最高的网站.

伊桑·布鲁克斯,首席技术官

Langlotz Patent & 商标工程公司.

在希格尔的早期, 我们需要一流的开发者, 以可承受的价格, 及时地. Toptal交付!

Lara Aldag, CEO

Higgle

Toptal能让你轻松找到合适的人选,让你放心,因为他们有能力. 我肯定会向任何寻找高技能开发人员的人推荐他们的服务.

Michael Gluckman,数据经理

Mxit

Toptal将我们的项目与最优秀的开发人员快速匹配的能力非常出色. 开发人员已经成为我们团队的一部分, 我对他们每个人所表现出的敬业精神感到惊讶. 对于那些希望与最好的工程师远程工作的人来说,没有比Toptal更好的了.

劳伦特·阿里,创始人

Livepress

Toptal让寻找合格的工程师变得轻而易举. 我们需要一个有经验的ASP.. NET MVC架构来指导我们的启动应用程序的开发, Toptal在不到一周的时间里为我们找到了三位优秀的候选人. 在做出我们的选择后,工程师立即在线并开始工作. 这比我们自己发现和审查候选人要快得多,也容易得多.

Jeff Kelly,联合创始人

协同解决方案

我们需要一些Scala的短期工作,Toptal在24小时内为我们找到了一位优秀的开发人员. 这在其他平台上是不可能实现的.

Franco Arda,联合创始人

WhatAdsWork.com

Toptal为快速发展和规模化的企业提供不妥协的解决方案. 我们通过Toptal签约的每一位工程师都迅速融入了我们的团队,并在保持惊人的开发速度的同时,将他们的工作保持在最高的质量标准.

Greg Kimball,联合创始人

nifti.com

如何通过Toptal招聘Python开发人员

1

与我们的行业专家交谈

Toptal的工程总监将与您一起了解您的目标, technical needs, 团队动力.
2

与精心挑选的人才一起工作

几天之内,我们将为您的项目介绍合适的Python开发人员. 平均匹配时间在24小时以下.
3

绝对合适

与您的新Python开发人员一起试用一段时间(只在满意的情况下付费), 在订婚前确保他们是合适的人选.

寻找拥有相关技能的专家

在我们的人才网络中访问大量熟练的开发人员,并在48小时内雇用最优秀的3%.

FAQs

  • Toptal Python开发人员有何不同?

    At Toptal, 我们对Python开发人员进行了全面筛选,以确保我们只为您提供最高水平的人才. 在200多个中,每年有5000人申请加入Toptal网络, 只有不到3%的人能达标. 你将与工程专家(而不是一般的招聘人员或人力资源代表)一起了解你的目标, technical needs, 团队动力. 最终的结果是:经过专家审查的人才从我们的网络,定制匹配,以满足您的业务需求.

  • 我可以在48小时内通过Toptal雇佣Python承包商吗?

    取决于可用性和进度, 您可以在注册后48小时内开始与Python开发人员合作.

  • Toptal Python开发人员的无风险试用期是什么?

    我们确保您和您的Python开发人员之间的每次约定都从长达两周的试用期开始. 这意味着你有时间确认订婚是否成功. 如果你对结果完全满意, 我们会给你开时间单的,你愿意多久我们就多久. 如果您不完全满意,我们不会向您收费. From there, 我们要么分道扬镳, 或者我们可以为您提供另一位可能更合适的专家,我们将与他开始第二轮谈判, no-risk trial.

Share
Python

如何聘请优秀的Python开发人员

The Challenge

作为一个粗略的数量级,Giles Thomas(联合创始人) PythonAnywhere)估计 在1之间.8 and 4.全世界有300万Python开发者.

那么找到一个Python开发人员有多难呢? Well, 如果你的目标只是找到一个可以在简历上合法列出Python的人,这并不难. 但如果你的目标是找到一个真正掌握了语言的细微差别和力量的Python大师, 那么挑战肯定是艰巨的.

首先,正如我们在文章中所述,需要一个高效的招聘流程 寻找少数精英-寻找和雇用行业中最好的开发人员. 这样的过程可以通过有针对性的问题和技术得到加强, 例如这里提供的那些, 专门用于从大量具有一定Python经验的候选人中寻找Python大师.

蟒蛇大师还是草丛中的蛇?

所以你已经找到了一个看起来很强大的Python web开发人员. 你怎么确定他或她是, in fact, 在你想要雇佣的前1%的精英候选人中? 虽然没有魔法或万无一失的技巧, 当然,你可以提出一些问题来帮助确定应试者对这门语言的了解程度. 下面是这类问题的简短样本.

但重要的是要记住,这些示例问题仅仅是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能正确回答所有问题, 回答所有问题也不能保证成为A级考生. 说到底,招聘既是一门科学,也是一门艺术.

《欧博体育app下载》……

诚然,最好的开发人员不会浪费时间提交在语言规范或API文档中很容易找到的内存, 任何编程语言都有某些关键特性和功能,任何专家都可以, and should, 被期望精通. 以下是一些特定于python的示例:

问:为什么要使用函数装饰器? Give an example.

装饰器本质上是一个可调用的Python对象,用于修改或扩展函数或类定义. 装饰器的优点之一是单个装饰器定义可以应用于多个函数(或类)。. 因此,使用装饰器可以完成很多工作,否则将需要大量的样板(甚至更糟糕的是冗余)!) code. Flask例如,它使用装饰器作为向web应用程序添加新端点的机制. 装饰器的一些更常见的用途包括添加同步, 类型执行, logging, 或类或函数的前置/后置条件.

问:什么是lambda表达式、列表推导式和生成器表达式? 每种方法的优点和适当用途是什么?

Lambda表达式 是一种创建单行匿名函数的速记技术吗. Their simple, 内联特性通常(尽管并非总是)比正式函数声明的替代方案更易于阅读和简洁. 另一方面, 它们简洁的行内性质, by definition, 很大程度上限制了它们的能力和适用性. 匿名和内联, 在代码中的多个位置使用相同lambda函数的唯一方法是冗余地指定它.

列表理解 为创建列表提供简洁的语法. 列表推导式通常用于创建列表,其中每个元素都是对另一个序列或可迭代对象的每个成员应用某些操作的结果. 它们还可以用于创建成员满足特定条件的元素的子序列. 在Python中,列表推导式提供了使用内置函数的替代方法 map() and filter() functions.

由于lambda表达式和列表推导的应用用法可能重叠, 关于何时何地使用one vs . one,众说纷纭. the other. 有一点要记住, though, 列表推导式是否比使用的类似解决方案执行得更快 map and lambda (一些快速测试产生了大约10%的性能差异). 这是因为调用lambda函数会创建一个新的堆栈帧,而列表推导式中的表达式不会这样做.

生成器表达式 在语法和功能上是否与列表推导式相似,但两者的操作和方式存在一些相当显著的差异, accordingly, 什么时候应该使用它们. In a nutshell, 迭代生成器表达式或列表推导本质上也是一样的, 但是列表推导式将首先在内存中创建整个列表,而生成器表达式将根据需要动态创建项. 因此,生成器表达式可以用于非常大的(甚至无限的)序列及其惰性(i.e.(按需)生成值可以提高性能并降低内存使用. 值得注意的是, though, 标准的Python列表方法可以用于列表推导的结果, 但不是直接在生成器表达式上.

问:考虑下面两种初始化数组和生成数组的方法. 生成的数组有何不同,为什么要使用一种初始化方法. the other?

>>> # INITIALIZING AN ARRAY -- METHOD 1
...
>>> x = [[1,2,3,4]] * 3
>>> x
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
>>>
>>>
>>> # INITIALIZING AN ARRAY -- METHOD 2
...
>>> y = [[1,2,3,4] for _ in range(3)]
>>> y
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
>>>
>>> # WHICH METHOD SHOULD YOU USE AND WHY?

虽然这两种方法乍一看会产生相同的结果, 两者之间存在着极其显著的差异. 方法二产生, 如你所料, 一个包含3个元素的数组, 每个元素本身都是一个独立的4元素数组. 然而,在方法1中,数组的成员都指向同一个对象. 这可能导致最可能出现的意外和不希望出现的行为,如下所示.

>>> # MODIFYING THE x ARRAY FROM THE PRIOR CODE SNIPPET:
>>> x[0][3] = 99
>>> x
[[1, 2, 3, 99], [1, 2, 3, 99], [1, 2, 3, 99]]
>>> # UH-OH, DON’T THINK YOU WANTED THAT TO HAPPEN!
...
>>>
>>> # MODIFYING THE y ARRAY FROM THE PRIOR CODE SNIPPET:
>>> y[0][3] = 99
>>> y
[[1, 2, 3, 99], [1, 2, 3, 4], [1, 2, 3, 4]]
>>> # THAT’S MORE LIKE WHAT YOU EXPECTED!
...

问:下面第二个append()语句会打印出什么?

>>> def append(list=[]):
...     #追加列表的长度到列表
...     list.追加(len(列表)
...     return list
...
>>> append(['a','b'])
['a', 'b', 2]
>>>
>>> append()  # calling with no arg uses default list value of []
[0]
>>>
>>> append()  # but what happens when we AGAIN call append with no arg?

当函数参数的默认值是表达式时, 表达式只求值一次, 不是每次调用函数都这样. Thus, 一旦list参数初始化为空数组, 后续调用append时不指定任何参数,将继续使用list最初初始化到的同一个数组. 因此,这将产生以下可能意想不到的行为:

>>> append()  # first call with no arg uses default list value of []
[0]
>>> append()  # but then look what happens...
[0, 1]
>>> append()  # successive calls keep extending the same default list!
[0, 1, 2]
>>> append()  # and so on, and so on, and so on...
[0, 1, 2, 3]

问:如何修改上一个问题中“append”方法的实现,以避免上面描述的不良行为?

以下是append方法的另一种实现,它是避免上一个问题的答案中描述的不良行为的众多方法之一:

>>> def append(list=None):
...     如果list为None:
            list = []
        #追加列表的长度到列表
...     list.追加(len(列表)
...     return list
...
>>> append()
[0]
>>> append()
[0]

问:如何用一行Python代码交换两个变量的值?

考虑这个简单的例子:

>>> x = 'X'
>>> y = 'Y'

在许多其他语言中,交换x和y的值需要您执行以下操作:

>>> tmp = x
>>> x = y
>>> y = tmp
>>> x, y
('Y', 'X')

But in Python, 可以使用一行代码(由于隐式元组打包和解包)进行交换,如下所示:

>>> x,y = y,x
>>> x,y
('Y', 'X')

问:下面最后一个语句会打印出什么?

>>> flist = []
>>> for i in range(3):
...     flist.追加(λ:我)
...
>>> [f() for f in flist]   # what will this print out?

在Python的任何闭包中,变量都是按名称绑定的. 因此,上面的代码行将打印出以下内容:

[2, 2, 2]

大概不是上面代码的作者想要的!

A workaround is to either create a separate function or to pass the args by name; e.g.:

>>> flist = []
>>> for i in range(3):
...     flist.Append (lambda I = I: I)
...
>>> [f() for f in flist]
[0, 1, 2]

问:Python 2和Python 3的主要区别是什么?

尽管Python 2在这一点上被正式认为是遗留的, 它的使用仍然很广泛,对于python web开发人员来说,认识到python 2和python 3之间的区别是很重要的.

以下是开发者应该注意的一些关键区别:

  • 文本和数据而不是Unicode和8位字符串. Python 3.0使用文本和(二进制)数据的概念,而不是Unicode字符串和8位字符串. 这样做的最大后果是,任何在Python 3中混合文本和数据的尝试.0引发TypeError(以安全地组合两者, 您必须解码字节或编码Unicode, 但是你需要知道正确的编码, e.g. UTF-8)
    • 这解决了naïve Python程序员长期存在的一个陷阱. In Python 2, 如果字符串恰好只包含7位(ASCII)字节,那么混合Unicode和8位数据就可以工作, 但如果它包含非ascii值,你会得到UnicodeDecodeError. Moreover, 异常将发生在组合点, 而不是在将非ascii字符放入str对象时. 这种行为通常会让Python新手程序员感到困惑和恐慌.
  • print function. The print 语句已被替换为 print() function
  • Xrange -再见. xrange() 不再存在(range() 现在表现为 xrange() 用于行为,除了它适用于任意大小的值)
  • API changes:
    • zip(), map() and filter() 现在都返回迭代器而不是列表
    • dict.keys(), dict.items() and dict.values() 现在返回“视图”而不是列表
    • dict.iterkeys(), dict.iteritems() and dict.itervalues() 不再受支持
  • 比较运算符. 排序比较运算符(<, <=, >=, >) now raise a TypeError 当操作数没有有意义的自然顺序时异常. 这方面的一些后果包括:
    • 表达式如 1 < '', 0 > None or len <= len 不再有效
    • None < None now raises a TypeError 而不是返回 False
    • 对异构列表进行排序不再有意义——所有元素必须彼此比较

关于Python 2和Python 3之间差异的更多细节可以查看 here.

问:Python是解释的还是编译的?

As noted in 为什么有这么多蟒蛇?,坦率地说,这是一个有点棘手的问题,因为它是畸形的. Python本身只不过是一个接口定义(对于任何语言规范都是如此),它有多种实现. Accordingly, the question of whether “Python” is interpreted or compiled does not apply to the Python language itself; rather, 它适用于Python规范的每个特定实现.

使这个问题的答案进一步复杂化的事实是, 以CPython(最常见的Python实现)为例, 答案其实是"两者都有". 具体来说,使用CPython,首先编译代码,然后解释代码. 更准确地说,它不是预编译为本机机器码,而是预编译为字节码. 虽然机器码肯定更快,但字节码更具可移植性和安全性. 然后在CPython中解释字节码(或者在运行时解释并编译为优化的机器码) PyPy).

问:CPython有哪些替代实现? 何时以及为什么使用它们?

一个比较突出的替代实现是 Jython使用Java编写的Python实现,利用Java虚拟机(JVM). 而CPython生成在CPython VM上运行的字节码, Jython生成在JVM上运行的Java字节码.

Another is IronPython,用c#编写,目标是 .NET stack. IronPython运行在微软的公共语言运行库(CLR)上。.

中也指出 为什么有这么多蟒蛇?, 完全有可能在不触及Python的非cpython实现的情况下存活下来, 但是转换也有好处, 其中大部分依赖于你的技术栈.

另一个值得注意的替代实现是 PyPy 其主要特征包括:

  • Speed. 由于它的即时(JIT)编译器,Python程序通常在PyPy上运行得更快.
  • Memory usage. Large, 需要大量内存的Python程序使用PyPy可能会比使用CPython占用更少的空间.
  • Compatibility. PyPy与现有的python代码高度兼容. It supports cffi 并且可以运行流行的Python库,如 Twisted and Django.
  • Sandboxing. PyPy提供了以完全安全的方式运行不受信任代码的能力.
  • Stackless mode. PyPy默认支持无堆栈模式, 为大规模并发提供微线程.

问:你在Python中使用什么方法进行单元测试?

这个问题最基本的答案围绕Python unittest 测试框架. Basically, 如果python自动化候选人在回答这个问题时没有提到unittest, 这应该是一个巨大的危险信号.

Unittest支持测试自动化, 共享测试的设置和关闭代码, 将测试聚合到集合中, 以及测试与报告框架的独立性. unittest模块提供了一些类,可以很容易地为一组测试支持这些特性.

假设候选人提到了unittest(如果没有的话), 你可能只想当场结束面试!), you should also ask them to describe the key elements of the unittest framework; namely, test fixtures, test cases, 测试套件和测试运行器.

最近添加到unittest框架的是 mock. Mock允许您用Mock对象替换被测系统的某些部分,并对如何使用它们做出断言. mock现在是Python标准库的一部分,可作为unittest获得.Python 3中的mock.3 onwards.

mock的价值和功能在 Python中的mock介绍. 如其中所述, 系统调用是嘲弄的主要对象:是否编写脚本以弹出CD驱动器, 从/tmp中删除过时缓存文件的web服务器, 或绑定到TCP端口的套接字服务器, 在单元测试的上下文中,这些调用都具有不希望出现的副作用. Similarly, 保持单元测试的效率和性能意味着将尽可能多的“慢代码”排除在自动化测试运行之外, 即文件系统和网络访问.

[注:这个问题是针对同样有Java经验的Python开发人员的。.]
问:在Python和Python中编码时要记住的关键区别是什么. Java?

Disclaimer #1. Java和Python之间的差异非常多,很可能是一个值得单独(冗长)发布的主题. 以下只是两种语言之间一些关键差异的简短示例.

Disclaimer #2. 这里的目的并不是要发起一场关于Python和Python孰优孰弊的宗教之争. Java(尽管这很有趣)!). Rather, 这个问题实际上只是为了了解开发人员对两种语言之间的一些实际差异的理解程度. 因此,从编程效率的角度来看,下面的列表故意避免讨论Python相对于Java的有争议的优势.

记住以上两个免责声明, 以下是在Python和Python中编码时要记住的一些关键差异的示例. Java:

  • 动态与静态类型. 这两种语言之间最大的区别之一是Java仅限于静态类型,而Python支持变量的动态类型.
  • Static vs. class methods. Java中的静态方法不会转换为Python类方法.
    • In Python, 调用类方法涉及调用静态方法或函数所不涉及的额外内存分配.
    • 在Java中,用点分隔的名称(例如.g., foo.bar.方法)由编译器查找, 所以在运行时,你有多少并不重要. 然而,在Python中,查找发生在运行时,因此“每个点计数”。.
  • 方法重载. 而Java要求对多个具有不同签名的同名函数进行显式规范, 在Python中,如果调用者没有指定,则可以使用单个函数包含带有默认值的可选参数来完成相同的操作.
  • Single vs. double quotes. 而使用单引号vs. 双引号在Java中很重要, 它们在Python中可以互换使用(但不是, 它不允许开始 same 带双引号的字符串并试图以单引号结束,反之亦然!).
  • getter和setter(不是!). Getters and setters in Python are superfluous; rather, 你应该使用内置的“属性”(这就是它的作用)!). 在Python中,getter和setter会浪费CPU和程序员的时间.
  • 类是可选的. 而Java要求每个函数都在封闭类定义的上下文中定义, Python没有这样的要求.
  • 缩进问题…… in Python. 这让许多新手Python程序员感到困惑.

The Big Picture

Python的专业知识远远超出了该语言的技术细节. Python专家将对Python的优点和局限性有深入的理解和欣赏. Accordingly, 以下是一些示例问题,可以帮助评估候选人在这方面的专业知识:

问:Python特别擅长什么? 什么时候使用Python是一个项目的“正确选择”?

尽管好恶是非常个人化的, “称职”的开发人员会强调Python语言中通常被认为是有利的特性(这也有助于回答Python“特别擅长”的问题)。. 这个问题的一些更常见的有效答案包括:

  • 易用性和重构性, 这要归功于Python语法的灵活性,这使得它对快速原型制作特别有用.
  • 更紧凑的代码; 再次感谢Python的语法, 以及功能丰富的Python库(与大多数Python语言实现一起免费分发).
  • 一种动态类型和强类型语言, 提供罕见的代码灵活性组合,同时避免讨厌的隐式类型转换错误.
  • 它是免费和开源的! 我们还需要多说吗??

关于什么时候使用Python是项目的“正确选择”的问题, 完整的答案还取决于与语言本身无关的一些问题, 比如优先技术投资, 团队的技能组合, and so on. 尽管如上所述的问题暗示了对严格技术答案的兴趣, 在面试中提出这些额外问题的开发者总是会得到我的“更多分数”,因为这表明他们意识到了, 以及对, “更大的图景”(i.e.,不仅仅是所采用的技术). Conversely, 回答说Python永远是正确的选择,这显然是一个不成熟的开发人员的标志.

问:Python语言有哪些缺点?

For starters, 如果你精通一门语言, 你知道它的缺点, 所以诸如“没有什么我不喜欢的”或“它没有缺点”之类的回答确实很能说明问题.

对于这个问题,最常见的两个有效答案是:

  • 全局解释器锁(GIL). CPython(最常见的Python实现)不是完全线程安全的. 以支持多线程Python程序, CPython提供了一个全局锁,必须由当前线程持有,才能安全地访问Python对象. As a result, 无论存在多少线程或处理器, 在任何给定时间只有一个线程被执行. 相比之下,值得注意的是PyPy实现 本文前面讨论过 提供无堆栈模式,支持微线程实现大规模并发.
  • Execution speed. Python可能比编译语言慢,因为它是解释型的. (Well, sort of. See our 前面的讨论中 on this topic.)

Wrap Up

这里提供的问题和技巧对于识别真正的Python开发大师来说是非常有价值的辅助工具. 我们希望您在寻找Python软件开发人员中的少数精英时,发现它们是“去芜取芽”的有用基础. 然而,重要的是要记住,这些只是作为工具,被纳入你的整体招聘工具箱和战略的大背景下.

And, 对于那些可能错误地阅读了这篇指南,希望学习如何捕捉爬行动物的人(对不起,伙计, 错误的蟒蛇!),我们建议您查看佛罗里达州野生动物基金会的网站 Python的挑战.

顶级Python开发人员需求量很大.

Start Hiring