面向 Java 人员的 Python

Python for the Busy Java Developer The Language, Syntax, and Ecosystem 无水印原版pdf Python for the Busy Java Developer The Language, Syntax, and Ecosystem 英文无水印原版pdf pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书 立即下载

编者注:在 Java 频道中,我们大多数人都非常了解该语言,并且已经在其生态系统中工作了至少几年。这给了我们常规和专业知识,但它也引起了一定程度的隧道视野。在Outside-In Java系列中,非 Java 主义者将向我们展示他们对生态系统的看法。

从哲学上讲,Python 几乎与 Java 截然相反。它放弃了静态类型和刚性结构,取而代之的是一个松散的沙箱,您可以在其中自由地做任何您想做的事情。也许 Python 是关于你可以做什么,而 Java 是关于你可以做什么。

然而,这两种语言仍然有很多可以追溯到 C 的灵感。它们都是具有块、循环、函数、赋值和中缀数学的命令式语言。两者都大量使用类、对象、继承和多态性。两者都具有相当突出的异常。两者都自动处理内存管理。它们甚至都编译为在 VM 上运行的字节码,尽管 Python 为您透明地编译。Python 甚至从 Java 中汲取了一些线索——标准库logging和unittest模块分别受到 log4j 和 JUnit 的启发。

鉴于这种重叠,我认为Java 开发人员应该对 Python 感到宾至如归。所以我带着一些温和的 Python 宣传来找你。如果您给我一个机会,我可以向您展示 Python 与 Java 的不同之处,以及为什么我觉得这些差异很有吸引力。至少,您可能会发现一些有趣的想法可以带回 Java 生态系统。

(如果你想要 Python教程,Python 文档有一个很好的。另外,这是从 Python 3 的角度来看的!Python 2 在野外仍然相当普遍,它有一些语法差异。)

句法

让我们先解决这个问题。这是你好世界:

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">print<span style="color:#c792ea">(</span><span style="color:#c3e88d">"Hello, world!"</span><span style="color:#c792ea">)</span>
</code></span></span>

嗯,嗯,这不是很有启发性。好的,这是一个查找文件中最常用的十个单词的函数。我使用标准库的Counter类型有点作弊,但它真是太好了。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">from collections import Counter

def <span style="color:#82aaff">count_words</span><span style="color:#c792ea">(</span>path<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    words <span style="color:#89ddff">=</span> Counter<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span>
    with <span style="color:#82aaff">open</span><span style="color:#c792ea">(</span>path<span style="color:#c792ea">)</span> as f<span style="color:#c792ea">:</span>
        for line in f<span style="color:#c792ea">:</span>
            for word in line<span style="color:#c792ea">.</span>strip<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span><span style="color:#c792ea">.</span>split<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
                words<span style="color:#c792ea">[</span>word<span style="color:#c792ea">]</span> <span style="color:#89ddff">+=</span> <span style="color:#f78c6c">1</span>

    for word<span style="color:#c792ea">,</span> count in words<span style="color:#c792ea">.</span>most_common<span style="color:#c792ea">(</span><span style="color:#f78c6c">10</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        print<span style="color:#c792ea">(</span><span style="color:#c3e88d">f"</span><span style="color:#c792ea">{</span>word<span style="color:#c792ea">}</span><span style="color:#c3e88d"> x</span><span style="color:#c792ea">{</span>count<span style="color:#c792ea">}</span><span style="color:#c3e88d">"</span><span style="color:#c792ea">)</span>
</code></span></span>

Python 由空格分隔。人们经常对此有强烈的看法。当我第一次看到它时,我什至认为它是异端。现在,大约十年后,这似乎很自然,以至于我很难重新戴上牙套。如果您对此感到厌烦,我怀疑我无法说服您,但我敦促您至少暂时忽略它;它在实践中确实不会引起任何严重的问题,并且它消除了相当多的噪音。另外,Python 开发人员永远不必争论 a{应该去哪里。

如果对Python有兴趣,想了解更多的Python以及AIoT知识,解决测试问题,以及入门指导,帮你解决学习Python中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己Python方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们,可领取最新Python大厂面试资料和Python爬虫、人工智能、学习资料!微信公众号【Python大本营】等你来玩奥~

除了这种美学差异之外,其中大部分应该看起来很熟悉。我们有一些数字、一些赋值和一些方法调用。该import声明的工作方式略有不同,但它具有相同的一般含义,即“使这个东西可用”。Python 的循环与 Java 的-each 循环for非常相似,只是标点符号少了一点。for函数本身是用def而不是类型分隔的,但它可以按照您的预期工作:可以使用参数调用它,然后返回一个值(尽管这个没有)。

这里只有两件事非常不寻常。一个是with块,与 Java 7 的“-with-resources”非常相似try——它保证文件将在块的末尾关闭,即使在其中引发异常也是如此。另一个是f"..."语法,这是一个相当新的功能,允许将表达式直接插入字符串。

就是这样!您已经阅读了一些 Python。至少,这不是来自完全不同星球的语言。

动态类型

从该示例中可能很明显,但 Python 代码并没有很多类型。不在变量声明上,不在参数或返回类型上,不在对象的布局上。任何东西在任何时候都可以是任何类型。我还没有显示一个类定义,所以这里是一个微不足道的定义。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">class <span style="color:#ffcb6b">Point</span><span style="color:#c792ea">:</span>
    def <span style="color:#82aaff">__init__</span><span style="color:#c792ea">(</span>self<span style="color:#c792ea">,</span> x<span style="color:#c792ea">,</span> y<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        self<span style="color:#c792ea">.</span>x <span style="color:#89ddff">=</span> x
        self<span style="color:#c792ea">.</span>y <span style="color:#89ddff">=</span> y

    def <span style="color:#82aaff">magnitude</span><span style="color:#c792ea">(</span>self<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        return <span style="color:#c792ea">(</span>self<span style="color:#c792ea">.</span>x <span style="color:#89ddff">**</span> <span style="color:#f78c6c">2</span> <span style="color:#89ddff">+</span> self<span style="color:#c792ea">.</span>y <span style="color:#89ddff">**</span> <span style="color:#f78c6c">2</span><span style="color:#c792ea">)</span> <span style="color:#89ddff">**</span> <span style="color:#f78c6c">0.5</span>

point <span style="color:#89ddff">=</span> Point<span style="color:#c792ea">(</span><span style="color:#f78c6c">3</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">4</span><span style="color:#c792ea">)</span>
print<span style="color:#c792ea">(</span>point<span style="color:#c792ea">.</span>x<span style="color:#c792ea">)</span>  <span style="color:#697098"># 3</span>
print<span style="color:#c792ea">(</span>point<span style="color:#c792ea">.</span>magnitude<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span><span style="color:#c792ea">)</span>  <span style="color:#697098"># 5.0</span>
</code></span></span>

甚至xandy也没有被声明为属性;它们之所以存在,是因为构造函数创建了它们。没有什么强迫我传入整数。我本可以传入浮点数,或者可能是Decimals或Fractions。

如果您只使用静态语言,这可能听起来很混乱。类型温暖、舒适和舒适。他们保证......好吧,也许不是代码真的有效(尽管有些人不同意),但有些东西。当你甚至不知道任何东西是正确的类型时,你怎么能依赖代码呢?

但是等等——Java 也没有这样的保证!毕竟,任何物体都可能是null,对吧?这几乎从来都不是正确类型的对象。

您可能会认为动态类型是对问题的完全投降null。如果我们无论如何都必须处理它,我们不妨接受它并让它为我们工作——通过推迟一切运行时间。类型错误变成了正常的逻辑错误,你以同样的方式处理它们。

(对于相反的方法,请参阅Rust,它没有null价值或异常。我仍然更愿意编写 Python,但我很欣赏 Rust 的类型系统并不总是悄悄地对我撒谎。)

在我的方法中, int 或 float 或任何类型的数字都magnitude无关紧要。self.x它只需要支持**运营商,并返回支持+运营商的东西。(Python 支持运算符重载,所以这可能是任何东西。)这同样适用于普通的方法调用:任何类型都是可接受的,只要它在实践中有效。

这意味着 Python 不需要泛型。一切都已经正常工作。无需接口;一切都已经是多态的。在类型系统中没有向下转换,没有向上转换,没有逃生舱口。不会遇到需要List何时可以与任何Iterable.

许多常见的模式变得容易得多。您可以创建包装对象和代理,而无需更改使用代码。你可以使用组合而不是继承来扩展第三方类型——不需要做任何特殊的事情来保持多态性。灵活的 API 不需要将每个类都复制为接口;一切都已经充当隐式接口。

动态打字哲学

使用静态类型,任何编写代码的人都可以选择类型,编译器会检查它们是否可以工作。使用动态类型,任何使用一些代码的人都可以选择类型,运行时会试一试。这就是相反的哲学:类型系统关注的是你能做什么,而不是你可以做什么。

以这种方式使用动态类型有时被称为“鸭子类型”,意思是“如果它像鸭子一样走路并且它像鸭子一样嘎嘎叫,那就是鸭子”。这个想法是,如果你想要的只是嘎嘎声,那么不要静态地强制你的代码必须接收鸭子,你可以拿走你得到的任何东西并让它嘎嘎。如果是这样,无论如何,这就是你所关心的,所以它和鸭子一样好。(如果不能,你会得到一个AttributeError,但这不是很有力。)

请注意,Python 仍然是强类型的。这个术语有点模糊,但它通常意味着值在运行时保留它们的类型。典型的例子是 Python 不允许您将字符串添加到数字中,而像 JavaScript 这样的弱类型语言会使用可能不符合您期望的优先级规则默默地将一种类型转换为另一种类型。

与许多动态语言不同,Python 倾向于尽早发现错误——无论如何,在运行时。例如,从尚不存在的变量读取Map将引发异常,从 dict (如 a )读取不存在的键也会引发异常。在 JavaScript、Lua 和类似的语言中,你会null在这两种情况下默默地得到一个值。(即使是 Java 也会null因为缺少Map键而返回!)如果你想回退到默认值,dicts 有方法可以更明确地表达它。

这里肯定有一个权衡,是否值得因项目和个人而异。至少对我来说,在我看到一个系统的实际设计后,它更容易确定一个系统的设计,但是静态类型的语言需要预先设计。静态类型使得尝试很多不同的想法变得更难,更难玩。

你确实有较少的静态保证,但根据我的经验,大多数类型错误都会立即被捕获......因为我在编写一些代码后做的第一件事就是尝试运行它!其他任何东西都应该被你的测试捕捉到——你应该用任何语言编写,而 Python 使得它相对容易。

混合范式

Python 和 Java 都是命令式的和面向对象的:它们通过执行指令来工作,并将一切都建模为对象。

在最近的版本中,Java 已经添加了一些功能特性,我认为这非常欢呼。Python 也有相当多的功能特性,但是……方法有些不同。map它提供了一些像and这样的令牌内置reduce函数,但它并不是真正围绕将许多小函数链接在一起的想法而设计的。

相反,Python 混入了……别的东西。我不知道 Python 采用的方法有什么通用名称。我想它将“链接函数”的想法分为两部分:使用序列,并使函数本身更强大。

序列

序列和迭代在 Python 中扮演着重要的角色。序列可以说是最基本的数据结构,因此使用它们的工具非常好。我将此解释为 Python 对函数式编程的替代方案:Python 不是更容易组合许多小函数,然后将它们应用于序列,而是首先使用命令式代码更容易操作序列。

回到开始的时候,我随便掉进了这行:

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">    for word<span style="color:#c792ea">,</span> count in words<span style="color:#c792ea">.</span>most_common<span style="color:#c792ea">(</span><span style="color:#f78c6c">10</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
</code></span></span>

循环很熟悉,但这段代码一次for迭代两个变量。实际发生的是列表中的每个元素都most_common返回一个元组,一组按顺序区分的值。元组可以通过将它们分配给变量名称的元组来解包,这就是这里真正发生的事情。元组通常用于在 Python 中返回多个值,但它们有时在临时结构中也很有用。在 Java 中,您需要一个完整的类和几行分配内容。

任何可以迭代的东西也可以被解包。解包支持任意嵌套,a, (b, c) = ...它的样子也是如此。对于未知长度的序列,一个*leftovers元素可以出现在任何地方,并且会根据需要吸收尽可能多的元素。也许你真的很喜欢 LISP?

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">values <span style="color:#89ddff">=</span> <span style="color:#c792ea">[</span><span style="color:#f78c6c">5</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">7</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">9</span><span style="color:#c792ea">]</span>
head<span style="color:#c792ea">,</span> <span style="color:#89ddff">*</span>tail <span style="color:#89ddff">=</span> values
print<span style="color:#c792ea">(</span>head<span style="color:#c792ea">)</span>  <span style="color:#697098"># 5</span>
print<span style="color:#c792ea">(</span>tail<span style="color:#c792ea">)</span>  <span style="color:#697098"># (7, 9)</span>
</code></span></span>

Python 还具有从简单表达式创建列表的语法——所谓的“列表推导式”——这比函数式方法(如map. 存在用于创建 dicts 和 set 的类似语法。整个循环可以简化为一个强调您真正感兴趣的内容的表达式。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">values <span style="color:#89ddff">=</span> <span style="color:#c792ea">[</span><span style="color:#f78c6c">3</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">4</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">5</span><span style="color:#c792ea">]</span>
values2 <span style="color:#89ddff">=</span> <span style="color:#c792ea">[</span>val <span style="color:#89ddff">*</span> <span style="color:#f78c6c">2</span> for val in values if val <span style="color:#89ddff">!=</span> <span style="color:#f78c6c">4</span><span style="color:#c792ea">]</span>
print<span style="color:#c792ea">(</span>values2<span style="color:#c792ea">)</span>  <span style="color:#697098"># [6, 10]</span>
</code></span></span>

标准库还在itertools模块中包含许多有趣的迭代器、组合器和配方。

最后,Python 具有使用命令式代码生成惰性序列的生成器。包含yield关键字的函数在调用时不会立即执行;相反,它返回一个生成器对象。当生成器被迭代时,函数会一直运行,直到遇到 a yield,此时它会暂停; 产生的值成为下一个迭代值。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">def <span style="color:#82aaff">odd_numbers</span><span style="color:#c792ea">(</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    n <span style="color:#89ddff">=</span> <span style="color:#f78c6c">1</span>
    while <span style="color:#ff5874">True</span><span style="color:#c792ea">:</span>
        yield n
        n <span style="color:#89ddff">+=</span> <span style="color:#f78c6c">2</span>

for x in odd_numbers<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    print<span style="color:#c792ea">(</span>x<span style="color:#c792ea">)</span>
    if x <span style="color:#89ddff">></span> <span style="color:#f78c6c">4</span><span style="color:#c792ea">:</span>
        break
<span style="color:#697098"># 1</span>
<span style="color:#697098"># 3</span>
<span style="color:#697098"># 5</span>
</code></span></span>

由于生成器运行延迟,它们可以产生无限序列或中途中断。它们可以同时生成大量大型对象,而不会消耗大量内存。它们还可以作为“链式”函数式编程的一般替代方案。您可以编写熟悉的命令式代码,而不是组合映射和过滤器。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python"><span style="color:#697098"># This is the pathlib.Path API from the standard library</span>
def <span style="color:#82aaff">iter_child_filenames</span><span style="color:#c792ea">(</span>dirpath<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    for child in dirpath<span style="color:#c792ea">.</span>iterdir<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        if child<span style="color:#c792ea">.</span>is_file<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
            yield child<span style="color:#c792ea">.</span>name
</code></span></span>

要在 Java 中表达一个完全任意的惰性迭代器,您需要编写一个Iterator手动跟踪其状态的迭代器。对于除了最简单的情况之外的所有情况,这可能会变得非常棘手。Python 也有一个迭代接口,所以你仍然可以使用这种方法,但是生成器非常易于使用,大多数自定义迭代都是用它们编写的。

由于生成器可以自行暂停,因此它们在其他一些情况下也很有用。通过手动推进生成器(而不是仅仅通过循环一次迭代for),可以在中途运行一个函数,让它在某个点停止,并在恢复函数之前运行其他代码。Python 利用这一点纯粹作为一个库添加了对异步 I/O(没有线程的非阻塞网络)的支持,尽管现在它具有专用async和await语法。

职能

乍一看,Python 函数非常熟悉。您可以使用参数调用它们。传递风格与 Java 中的完全一样——Python 既没有引用也没有隐式复制。Python 甚至有“文档字符串”,类似于 Javadoc 注释,但内置在语法中并且在运行时可读。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">def <span style="color:#82aaff">foo</span><span style="color:#c792ea">(</span>a<span style="color:#c792ea">,</span> b<span style="color:#c792ea">,</span> c<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    <span style="color:#c3e88d">"""Print out the arguments.  Not a very useful function, really."""</span>
    print<span style="color:#c792ea">(</span><span style="color:#c3e88d">"I got"</span><span style="color:#c792ea">,</span> a<span style="color:#c792ea">,</span> b<span style="color:#c792ea">,</span> c<span style="color:#c792ea">)</span>

foo<span style="color:#c792ea">(</span><span style="color:#f78c6c">1</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">2</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">3</span><span style="color:#c792ea">)</span>  <span style="color:#697098"># I got 1 2 3</span>
</code></span></span>

Java 有带args...语法的可变参数函数;Python 使用*args. (*leftovers解包的语法受到函数语法的启发。)但是 Python 还有一些技巧。任何参数都可以有一个默认值,使其成为可选的。任何参数也可以通过名称给出——我之前用Point(x=3, y=4). 调用*args任何函数时都可以使用该语法来传递序列,就好像它是单独的参数一样,并且有一个等价物可以接受或传递命名参数作为 dict。可以将参数设置为“仅关键字”,因此必须按名称传递,这对于可选布尔值非常好。**kwargs

当然, Python 没有函数重载,但您使用它的大部分内容都可以替换为鸭子类型和可选参数。

现在已经为 Python 最强大的功能之一做好了准备。与动态类型非常相似,您可以通过包装器或代理透明地替换对象,*args并**kwargs允许透明地包装任何函数。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">def <span style="color:#82aaff">log_calls</span><span style="color:#c792ea">(</span>old_function<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    def <span style="color:#82aaff">new_function</span><span style="color:#c792ea">(</span><span style="color:#89ddff">*</span>args<span style="color:#c792ea">,</span> <span style="color:#89ddff">**</span>kwargs<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        print<span style="color:#c792ea">(</span><span style="color:#c3e88d">"i'm being called!"</span><span style="color:#c792ea">,</span> args<span style="color:#c792ea">,</span> kwargs<span style="color:#c792ea">)</span>
        return old_function<span style="color:#c792ea">(</span><span style="color:#89ddff">*</span>args<span style="color:#c792ea">,</span> <span style="color:#89ddff">**</span>kwargs<span style="color:#c792ea">)</span>

    return new_function

<span style="color:#c792ea">@log_calls</span>
def <span style="color:#82aaff">foo</span><span style="color:#c792ea">(</span>a<span style="color:#c792ea">,</span> b<span style="color:#c792ea">,</span> c<span style="color:#89ddff">=</span><span style="color:#f78c6c">3</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    print<span style="color:#c792ea">(</span><span style="color:#c3e88d">f"a = </span><span style="color:#c792ea">{</span>a<span style="color:#c792ea">}</span><span style="color:#c3e88d">, b = </span><span style="color:#c792ea">{</span>b<span style="color:#c792ea">}</span><span style="color:#c3e88d">, c = </span><span style="color:#c792ea">{</span>c<span style="color:#c792ea">}</span><span style="color:#c3e88d">"</span><span style="color:#c792ea">)</span>

foo<span style="color:#c792ea">(</span><span style="color:#f78c6c">1</span><span style="color:#c792ea">,</span> b<span style="color:#89ddff">=</span><span style="color:#f78c6c">2</span><span style="color:#c792ea">)</span>
<span style="color:#697098"># i'm being called! (1,) {'b': 2}</span>
<span style="color:#697098"># a = 1, b = 2, c = 3</span>
</code></span></span>

有点浓,不好意思。不要太担心它是如何工作的;要点是它foo被替换为 a new_function,它将所有参数转发到foo。调用者和调用者都不foo需要知道有什么不同。

我不能低估这是多么强大。它可用于记录、调试、管理资源、缓存、访问控制、验证等。它与其他元编程功能配合得非常好,并且以类似的方式,它可以让您分解结构而不仅仅是代码。

Java 还是 Ptyhon?

对象和动态运行时

动态运行时是一种运行时——支持语言核心部分的幕后东西——可以在运行时使用。像 C 或 C++ 这样的语言非常没有动态运行时;源代码的结构被“烘焙”到编译输出中,以后没有明智的方法来改变它的行为。另一方面,Java确实具有动态运行时!它甚至还附带了一个专门用于反射的包。

当然,Python 也有反射。内置了许多简单的函数,用于动态检查或修改对象的属性,这对于调试和偶尔的恶作剧非常有用。

但是 Python 更进一步。由于无论如何一切都是在运行时完成的,Python 公开了许多扩展点来自定义其语义。您无法更改语法,因此代码仍然看起来像 Python,但您通常可以分解结构——这在更严格的语言中很难做到。

举个极端的例子,看看pytest,它用 Python 的assert语句做了非常聪明的事情。通常,写作assert x == 1只会AssertionError在错误时抛出一个错误,让您没有关于哪里出错或哪里出错的上下文。这就是为什么 Python 的内置unittest模块(如 JUnit 和许多其他测试工具)提供了一堆特定的实用功能,如assertEquals. 不幸的是,这些使测试变得更加冗长且难以一目了然。但是使用 pytestassert x == 1就可以了。如果失败,pytest 会告诉你什么x是……或者两个列表在哪里分歧,或者两个集合之间有什么不同的元素,或者你有什么。所有这些都是根据正在进行的比较和操作数的类型自动发生的。

pytest 是如何工作的?你真的不想知道。而且您不必知道如何使用 pytest 编写测试——并且可以尽情享受。

这是动态运行时的真正优势。您个人可能无法使用这些功能。但是你可以从使用它们的库中获得巨大的好处,而不用关心它们是如何工作的。甚至 Python 本身也使用自己的扩展点实现了许多额外的功能——不需要对语法或解释器进行任何更改。

对象

我最喜欢的简单示例是属性访问。在 Java 中,Point类可能会选择getX()和setX()方法而不是普通x属性。理由是,如果您需要更改x读取或写入的方式,您可以在不破坏界面的情况下这样做。在 Python 中,您无需预先担心这一点,因为您可以在必要时拦截属性访问。

如果对Python有兴趣,想了解更多的Python以及AIoT知识,解决测试问题,以及入门指导,帮你解决学习Python中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己Python方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们,可领取最新Python大厂面试资料和Python爬虫、人工智能、学习资料!微信公众号【Python大本营】等你来玩奥~

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">class <span style="color:#ffcb6b">Point</span><span style="color:#c792ea">:</span>
    def <span style="color:#82aaff">__init__</span><span style="color:#c792ea">(</span>self<span style="color:#c792ea">,</span> x<span style="color:#c792ea">,</span> y<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        self<span style="color:#c792ea">.</span>_x <span style="color:#89ddff">=</span> x
        self<span style="color:#c792ea">.</span>_y <span style="color:#89ddff">=</span> y

    <span style="color:#c792ea">@property</span>
    def <span style="color:#82aaff">x</span><span style="color:#c792ea">(</span>self<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        return self<span style="color:#c792ea">.</span>_x

    <span style="color:#697098"># ... same for y ...</span>

point <span style="color:#89ddff">=</span> Point<span style="color:#c792ea">(</span><span style="color:#f78c6c">3</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">4</span><span style="color:#c792ea">)</span>
print<span style="color:#c792ea">(</span>point<span style="color:#c792ea">.</span>x<span style="color:#c792ea">)</span>  <span style="color:#697098"># 3</span>
</code></span></span>

有趣的@property语法是装饰器,它看起来像 Java 注释,但可以更直接地修改函数或类。

Readingpoint.x现在调用一个函数并计算它的返回值。这对调用代码是完全透明的——并且与读取的任何其他属性没有区别——但是对象可以随意干预和处理它。与 Java 不同,属性访问是类 API 的一部分,可以自由定制。(请注意,这个例子也是x只读的,因为我没有指定如何写入它!可写的语法property看起来有点滑稽,它的工作方式在这里并不重要。但你可以微不足道,比如说,强制只能将奇数分配给point.x.)

类似的特性存在于其他静态语言(如 C#)中,所以这可能不是那么令人印象深刻。关于 Python 真正有趣的部分是它property一点也不特别。它是一种普通的内置类型,可以用不到一屏纯 Python 编写。它之所以有效,是因为 Python 类可以自定义其自己的属性访问,包括一般属性访问和每个属性访问。包装器、代理和组合很容易实现:您可以将所有方法调用转发到底层对象,而不必知道它有什么方法。

相同的钩子property可以用于延迟加载属性或自动保存弱引用的属性——对调用代码完全透明,并且全部来自纯 Python。

您现在可能已经注意到我的代码没有publicorprivate修饰符,而且 Python 确实没有这样的概念。按照惯例,单个前导下划线用于表示“私有”——或者更准确地说,“不打算作为稳定公共 API 的一部分”。但这没有语义意义,Python 本身不会阻止任何人检查或更改这样的属性(或调用它,如果它是一个方法)。不final或static或const, 要么。

这与工作原理相同:核心 Python 通常不会阻止您做任何事情。当你需要它时,它非常有用。我通过在启动时调用或覆盖甚至彻底重新定义私有方法来修补第三方库中的错误。它使我不必创建项目的整个本地分支,一旦上游修复了错误,我只需删除我的补丁代码。

类似地,您可以轻松地为依赖于外部状态(例如当前时间)的代码编写测试。如果重构不切实际,您可以time.time()在测试期间用虚拟函数替换。库函数只是模块的属性(如 Java 包),而 Python 模块与其他任何东西一样都是对象,因此可以以相同的方式检查和修改它们。

课程

Java 类由一个Class对象支持,但两者并不是完全可以互换的。对于一个类Foo,类对象是Foo.class. 我不认为Foo可以单独使用它,因为它命名了一个type,而 Java 在类型和值之间做了一些微妙的区分。

在 Python 中,一个类是一个对象,一个实例type(它本身就是一个对象,因此它本身就是一个实例,这很有趣。)因此可以像对待任何其他值一样对待类:作为参数传递,存储在更大的结构,检查或操纵。制作键是类的字典的能力有时特别有用。而且因为类是通过调用它们来实例化的——Python 没有new关键字——在很多情况下它们可以与简单的函数互换。像工厂这样的一些常见模式非常简单,几乎消失了。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python"><span style="color:#697098"># Wait, is Vehicle a class or a factory function?  Who cares!</span>
<span style="color:#697098"># It could even be changed from one to the other without breaking this code.</span>
car <span style="color:#89ddff">=</span> Vehicle<span style="color:#c792ea">(</span>wheels<span style="color:#89ddff">=</span><span style="color:#f78c6c">4</span><span style="color:#c792ea">,</span> doors<span style="color:#89ddff">=</span><span style="color:#f78c6c">4</span><span style="color:#c792ea">)</span>
</code></span></span>

现在有好几次,我将函数甚至常规代码放在任何类之外的顶层。这是允许的,但含义有点微妙。在 Python 中,甚至classand语句都是在运行时def执行的常规代码。Python 文件自上而下执行,并且在这方面并不特殊。它们只是用于创建某些类型的对象的特殊语法:类和函数。classdef

这是非常酷的部分。因为类是对象,并且它们的类型是type,所以您可以子类 type化并更改它的工作方式。然后,您可以创建作为子类实例的类。

一开始把你的头绕起来有点奇怪。但同样,你不需要知道它是如何从中受益的。例如,Python 没有enum块,但它确实有一个enum 模块:

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">class <span style="color:#ffcb6b">Animal</span><span style="color:#c792ea">(</span>Enum<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    cat <span style="color:#89ddff">=</span> <span style="color:#f78c6c">0</span>
    dog <span style="color:#89ddff">=</span> <span style="color:#f78c6c">1</span>
    mouse <span style="color:#89ddff">=</span> <span style="color:#f78c6c">2</span>
    snake <span style="color:#89ddff">=</span> <span style="color:#f78c6c">3</span>

print<span style="color:#c792ea">(</span>Animal<span style="color:#c792ea">.</span>cat<span style="color:#c792ea">)</span>           <span style="color:#697098"># <Animal.cat: 0></span>
print<span style="color:#c792ea">(</span>Animal<span style="color:#c792ea">.</span>cat<span style="color:#c792ea">.</span>value<span style="color:#c792ea">)</span>     <span style="color:#697098"># 0</span>
print<span style="color:#c792ea">(</span>Animal<span style="color:#c792ea">(</span><span style="color:#f78c6c">2</span><span style="color:#c792ea">)</span><span style="color:#c792ea">)</span>            <span style="color:#697098"># <Animal.mouse: 2></span>
print<span style="color:#c792ea">(</span>Animal<span style="color:#c792ea">[</span><span style="color:#c3e88d">'dog'</span><span style="color:#c792ea">]</span><span style="color:#c792ea">)</span>        <span style="color:#697098"># <Animal.dog: 1></span>
</code></span></span>

该class语句创建了一个对象,这意味着它在某个地方调用了一个构造函数,并且可以重写该构造函数以更改类的构建方式。在这里,Enum创建一组固定的实例而不是类属性。所有这些都是用纯 Python 代码和普通 Python 语法实现的。

整个图书馆都建立在这些想法之上。您是否讨厌self.foo = foo为构造函数中的每个属性键入繁琐的内容?然后手动定义相等、散列和克隆以及开发人员可读的表示?Java 需要编译器支持,这可能与Project Amber一起提供。Python 足够灵活,社区用attrs库解决了这个问题。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">import attr

<span style="color:#c792ea">@attr<span style="color:#c792ea">.</span>s</span>
class <span style="color:#ffcb6b">Point</span><span style="color:#c792ea">:</span>
    x <span style="color:#89ddff">=</span> attr<span style="color:#c792ea">.</span>ib<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span>
    y <span style="color:#89ddff">=</span> attr<span style="color:#c792ea">.</span>ib<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span>

p <span style="color:#89ddff">=</span> Point<span style="color:#c792ea">(</span><span style="color:#f78c6c">3</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">4</span><span style="color:#c792ea">)</span>
q <span style="color:#89ddff">=</span> Point<span style="color:#c792ea">(</span>x<span style="color:#89ddff">=</span><span style="color:#f78c6c">3</span><span style="color:#c792ea">,</span> y<span style="color:#89ddff">=</span><span style="color:#f78c6c">4</span><span style="color:#c792ea">)</span>
p <span style="color:#89ddff">==</span> q  <span style="color:#697098"># True, which it wouldn't have been before!</span>
print<span style="color:#c792ea">(</span>p<span style="color:#c792ea">)</span>  <span style="color:#697098"># Point(x=3, y=4)</span>
</code></span></span>

或者使用SQLAlchemy,这是一个用于 Python 的功能强大的数据库库。它包含一个受 Java 的Hibernate启发的 ORM ,但不是在配置文件中或通过一些冗长的注释声明表的模式,您可以直接将其编写为一个类:

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">class <span style="color:#ffcb6b">Order</span><span style="color:#c792ea">(</span>Table<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    <span style="color:#82aaff">id</span> <span style="color:#89ddff">=</span> Column<span style="color:#c792ea">(</span>Integer<span style="color:#c792ea">,</span> primary_key<span style="color:#89ddff">=</span><span style="color:#ff5874">True</span><span style="color:#c792ea">)</span>
    order_number <span style="color:#89ddff">=</span> Column<span style="color:#c792ea">(</span>Integer<span style="color:#c792ea">,</span> index<span style="color:#89ddff">=</span><span style="color:#ff5874">True</span><span style="color:#c792ea">)</span>
    status <span style="color:#89ddff">=</span> Column<span style="color:#c792ea">(</span>Enum<span style="color:#c792ea">(</span><span style="color:#c3e88d">'pending'</span><span style="color:#c792ea">,</span> <span style="color:#c3e88d">'complete'</span><span style="color:#c792ea">)</span><span style="color:#c792ea">,</span> default<span style="color:#89ddff">=</span><span style="color:#c3e88d">'pending'</span><span style="color:#c792ea">)</span>
    <span style="color:#c792ea">.</span><span style="color:#c792ea">.</span><span style="color:#c792ea">.</span>
</code></span></span>

这与 基本思想相同Enum,但 SQLAlchemy 也使用相同的钩子,property因此您可以自然地修改列值。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">order<span style="color:#c792ea">.</span>order_number <span style="color:#89ddff">=</span> <span style="color:#f78c6c">5</span>
session<span style="color:#c792ea">.</span>commit<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span>
</code></span></span>

最后,类本身可以在运行时创建。它有点小众,但thriftpy创建了一个完整的模块,其中包含基于Thrift定义文件的类。在 Java 中,您需要代码生成,这会添加一个可能会不同步的全新编译步骤。

所有这些示例都依赖于 Python 现有的语法,但却为其注入了新的意义。它们都没有做任何你用 Java 或任何其他语言做不到的事情,但它们减少了结构重复——这使得代码更容易编写、更容易阅读并且不易出错。如果对Python有兴趣,想了解更多的Python以及AIoT知识,解决测试问题,以及入门指导,帮你解决学习Python中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己Python方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们,可领取最新Python大厂面试资料和Python爬虫、人工智能、学习资料!微信公众号【Python大本营】等你来玩奥~

包起来

Python 有许多与 Java 相同的基本概念,但将它们引向了一个非常不同的方向,并添加了一些全新的想法。Java 侧重于稳定性和可靠性,而 Python 侧重于表现力和灵活性。这是考虑命令式编程的一种完全不同的方式。

我怀疑 Python 会在 Java 擅长的领域取代 Java。例如,Python 可能不会赢得任何速度竞赛(但请参阅PyPy,一个 JITted Python)。Java 对线程有原生支持,而 Python 社区在很大程度上避开了它们。带有很多尘土飞扬的角落的大型复杂软件可能更喜欢静态类型提供的健全性检查(但请参阅mypy,Python 的静态类型检查器)。

但也许 Python 会在 Java 没有的领域大放异彩。大量软件不需要特别快或并行,然后其他问题就会浮出水面。我发现用 Python 开始一个项目非常快速和容易。没有单独的编译步骤,写/运行循环要快得多。代码更短,这通常意味着更容易理解。尝试不同的架构方法感觉更便宜。有时尝试一些愚蠢的想法很有趣,比如用库实现 goto。

我希望你能尝试一下 Python。我玩得很开心,我想你也会的。只是尽量不要把它当作 Java 来对待,所有类型都对你隐藏。

最坏的情况,总是有Pyjnius,它可以让你做到这一点。

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">from jnius import autoclass

System <span style="color:#89ddff">=</span> autoclass<span style="color:#c792ea">(</span><span style="color:#c3e88d">'java.lang.System'</span><span style="color:#c792ea">)</span>
System<span style="color:#c792ea">.</span>out<span style="color:#c792ea">.</span>println<span style="color:#c792ea">(</span><span style="color:#c3e88d">'Hello, world!'</span><span style="color:#c792ea">)</span></code></span></span>

JavaForPythonProgrammers.pdf 英文原版 Java For Python Programmers 立即下载

相关推荐

Jython for Java Developers: Accelerate Your Coding

《Jython for Java Programmers》是一本专为Java开发者设计的指南,旨在帮助他们利用Jython加速开发并提高灵活性。书中详细介绍了Jython的语法、操作符、类型、内置函数、错误处理等内容,并深入探讨了如何无缝集成Java和Python代码。Jython结合了Java的强大类库和Python的灵活性,使开发者能够快速实现算法和模式。此外,本书还涵盖了GUI开发、数据库编程、服务器端网页编程等实际应用案例,帮助读者更好地理解和运用Jython。

极简 Python 语言教程:从 Java 开发者视角入门实战

本文为Java开发者提供了快速掌握Python核心语法的教程。通过对比两种语言的异同点,帮助开发者高效学习Python。内容涵盖环境搭建、基础语法、数据类型、控制流、函数、面向对象、异常处理、文件操作、数据库访问和并发编程等核心概念,并配有对应的Java和Python代码示例。最后通过实战项目演示了如何用两种语言实现RESTful API服务。

果酱 の 博客 2164

Jenkins插件下载慢?3分钟搞定国内镜像加速(含华为/腾讯/清华源对比)

本文详细介绍了如何通过国内镜像源加速Jenkins插件下载,包括华为云、腾讯云和清华源等主流镜像站的性能对比及一键配置方案。通过实测数据展示华为云镜像站表现最佳,下载速度达19.4MB/s,并提供sed命令、管理界面配置和Docker定制三种高效加速方案,帮助开发者快速解决插件下载慢的问题。

sql99的博客 324

写给Java开发者的Python入门

编者注:这是一篇来自Java社区的文章,作者的观点是从Java开发者的角度进行讲解的。但是....为了部落的荣耀,人生苦短,我用Python! 从哲学的角度来看,Python和Java是全然相反的。它放弃了静态类型和刚性结构,并以松散的沙盒结构取而代之,在这样的沙盒里你基本上可以做任何你想做的事情。也许Python这门语言关注的是你能做什么,而Java则更关注你可以做些什么。 尽管如此

杰瑞的专栏 8726

UFS 3.1协议分析(第一至四章) -- UFS概述

Contents协议规范规范参考术语和定义简单概述通用特性接口特性功能特性 协议规范     UFS3.1协议规定了UFS电气接口和存储器件的特性以及系统架构。 特性:低功耗、高数据吞吐量、低电磁干扰、大容量存储器子系统效率的优化 电气接口:使用基于MIPI M-PHY的高级差分接口;M-PHY作为物理层,MIPI UniPro作为链路层,二者结合形成UFS接口的互联。 架构模型:参考 INCITS T10(SCSI) SAM 标准,命令协议基于 INCITS T1

Frank_sample的专栏 1万+

奇迹mu服务端DATA文件解析:从基础配置到高级玩法

本文深入解析奇迹MU服务端DATA文件的核心配置与高级玩法,涵盖基础设置、怪物AI系统、技能战斗机制、副本事件管理及物品商城定制。通过详细示例和实用技巧,帮助开发者掌握从经验倍率调整到动态事件触发的全方位配置方法,实现个性化的私服搭建与运营。

weixin_29254673的博客 532

专为 Java 开发者准备的 Python 快速入门讲解

这篇教程为Java开发者提供了Python快速入门指南,通过对比两种语言的语法差异(如类定义、循环、条件语句等),帮助开发者轻松过渡。文章包含示例代码演示Python核心功能,总结Python动态类型、内置数据结构等特性,并给出学习路径建议。最后提供7天速成计划方案,涵盖从基础语法到实战项目的内容安排,适合有编程经验的开发者快速掌握Python。

码码哈哈的博客 623

解密DS90UB983-Q1的汽车电子魔法:如何通过FPD-Link IV实现4K视频的无缝传输

本文深入解析了德州仪器DS90UB983-Q1串行器芯片如何通过FPD-Link IV技术在汽车电子中实现4K视频无缝传输。文章详细介绍了该技术的核心功能,包括多流传输(MST)模式、热插拔检测(Hot Plug Detect)机制以及电磁兼容性设计,为车载信息娱乐系统提供了高带宽、低延迟的可靠解决方案。

i3j4k5的博客 245

Python Basics for Java Developers Java开发人员的Python基础知识 Lynda课程中文字幕

Python Basics for Java Developers 中文字幕 Java开发人员的Python基础知识 中文字幕Python Basics for Java Developers Python功能强大,流行,并且允许您以相对较少的步骤启动和运行程序 如果您是一名有兴趣学习这种高度可读语言的Java开发人员,那么本课程适合您 加入Deepa Muralidhar,帮助您熟悉Pytho...

lyndacn的博客 182

眼动数据分析基础_AOI分析动态刺激物

如果您正在研究人们对如视频、动画等动态刺激物的视觉行为,动态AOI工具可为您提供类似静态AOI工具对于图片及其他静止刺激物分析的同样功能。创建和编辑动态AOI的过程和静态AOI相似。 关于动态AOI工具的使用,有几点非常重要: 多个看到相同线性动态刺激物的用户的眼动数据叠加是有价值的; 动态AOI不能用于非线性动态记录的分析; 动态AOI不能用于静态刺激物,如图片的分析; 动态AOI可以被开启、关闭、移动、调整大小及跟踪相关分析对象 首先,我们来定义两种不同的动态刺激物:线性动态刺激物(LDS),是指固

Kobe123brant的博客 3504

神经符号AI架构解析:如何通过V&V提升AI系统可信性

在人工智能领域,深度学习模型因其强大的模式识别能力而广泛应用,但其内部决策过程往往如同“黑盒”,难以追溯和解释,这给系统验证与确认带来了巨大挑战。验证与确认是确保复杂软件系统安全、可靠、符合预期的基石,其中验证关注“是否正确地构建了产品”,确认则关注“是否构建了正确的产品”。神经符号人工智能作为一种新兴范式,通过融合符号逻辑的透明推理与深度学习的强大感知,为解决这一难题提供了关键技术路径。它使得AI系统既能从数据中学习复杂模式,又能依据可形式化检验的规则进行逻辑推理,从而在自动驾驶、医疗诊断等高可靠性应用场

weixin_28681379的博客 360

java程序员的python之路(条件,循环和迭代器)

前一篇文章简单介绍了一下python的数据类型,包括,数字,字符串,列表,元组,集合和字典。以及这些类型的基本用法。这一章介绍一个python的条件控制,循环和迭代器。条件控制python条件控制的基本结构如下: if condition1: code_segment elif condition2: code_segment else:

貌似君子的专栏 660

华为OD新系统机试真题-文章特征提取

华为OD机试新系统真题 【文章特征提取】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【文章特征提取】

qq_45776114的博客 735

来自一名java开发人员的python学习(面向对象&常见函数)

文章目录黑魔法析构函数继承super()操作符重载方法与属性私有属性黑魔法普通方法私有方法@staticmethod@classmethod内置函数divmod()eval() & exec() & execfile() & compile()eval & execexecfilecompilefrozenset()vars()globals()__import__()help()dir()id() 黑魔法 python关于属性的处理可以堪称黑魔法,不过如果把python的对

Qbit编程学习笔记 198

【图像去噪】论文复现:CLIP用于图像去噪提升泛化性!CLIPDenoising的Pytorch源码复现,跑通CLIPDenoising全流程,图文结合,网络结构梳理和拆解,对应源码注释!

论文题目:Transfer CLIP for Generalizable Image Denoising —— 用于可泛化图像去噪的转移CLIP。【图像去噪】论文精读:Transfer CLIP for Generalizable Image Denoising(CLIPDenoising)CLIPDenoising理论部分详解见上面对应的论文精读,本文以源码为主,理论部分只是粗略回顾。启发:多看其他领域的文章,分析是否能应用在去噪领域,这是产生idea的要素之一;

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1415

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java/php/node.js/python面向煤矿井下人员的不安全行为管理系统【2024年毕设】

本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。

天成程序设计 110

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python是一种面向过程的编程语言_为什么国外本科学的第一门编程语言通常是Python或者JAVA,而我国大部分是C?...

作为一位曾经的程序员,个人是这样认为的,C语言是一门面向过程的语言,而题主提的Java是面向对象的语言,Python更是一门脚本类型的编程语言。所以谈谈C语言和Java的不同吧,C语言是一门面向过程的语言,何谓面向过程呢?打个比方,就是你建一个房子,那么你就需要用砖一块一块地垒起来形成墙面等构造,这就是面向过程。而面向对象就是,我要建一个房子这一对象,我可以直接用别人已经弄好的一整面墙或者其它构造...

weixin_42353996的博客 278

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java和python培训哪个好_Python和Java哪个好

提到编程语言,大多数人第一个想到的问题或许就是Java而在近期编程界似乎已经被一种叫Python的语言刷屏,那么这两者究竟谁更胜一筹呢?Java PK PythonJava从其定义来看,它是一种面向对象的语言,具有许多程序熟悉的类似于C/C++的语法,其吸引力和价值所在其具有的可移植性和相对效率;Java作为一种编译语言,执行模式与解释性语言,相比更以机器为中心,Java不仅仅是一种语言和库它更是...

weixin_31303743的博客 182

java和python内存管理机制_最强编程语言Java和最受欢迎之Python的巅峰对决

作为程序员们的看家利器之编程语言,倘若技术开发者对其掌握得越深则对自身职业生涯越有益处,然随着技术的更新变革,我们在日常使用不单单只会用到一门编程语言,那么究竟该如何选择一门新的语言来上手?本文中,将以主流 Java 和 Python 为例,为大家详细地解析两者的优缺点以及应用场景。常见的Python基础面试问题包括http协议,面向对象的概念,Python的基本数据类型,函数的定义、参数及返回值...

weixin_32066337的博客 220

pythonjava有什么区别_Java与Python的区别对比

本文概述自Java首次发布以来, 它一直是一种健壮的编程语言, 但是随着市场上出现了新技术并且新的编程语言变得越来越可行, 它似乎正在失去其流行性。一种这样的编程语言是Python。在这里, 我们将讨论Java和Python的功能, 并进行比较。什么是Java?Java是一种面向对象的通用编程语言(尽管由于它包含原始类型, 所以它并不完全是面向对象的)。 Java代码与平台无关, 这意味着Java...

weixin_39988930的博客 271

java 功能_Java的功能–了解Java为什么如此重要

如今,超过900万开发人员正在使用Java。实际上,Java是地球.上最流行和使用最广泛的编程语言。您是否曾经想过,它受欢迎的秘密是什么?它的功能。Java的特性是其成为“所有编程语言之王”的主要原因。如果我们谈论TIOBE索引,我们发现Java在过去3年中一直排名第一。Java功能可为每个开发人员提供安全,轻松和快捷的工作。当前,我们看到Python和Java之间的艰苦战斗。在本文的最后,您将了...

weixin_36017951的博客 411

最强编程语言 Java 和最受欢迎之 Python 的巅峰对决

作为程序员们的看家利器之编程语言,倘若技术开发者对其掌握得越深则对自身职业生涯越有益处,然随着技术的更新变革,我们在日常使用不单单只会用到一门编程语言,那么究竟该如何选择一门新的语言来上手?本文中,将以主流 Java 和 Python 为例,为大家详细地解析两者的优缺点以及应用场景。海风教育退费 https://www.hfjy.com/feedback 海风教育在线辅导0元一对一试听...

weixin_43932460的博客 118

java语言转python_Java是最节能的语言之一,Python是最不节能的语言

多年来,我们一直将性能与处理时间混为一谈。 “效果如何?” 的意思是“它有多快?” 但是这些天,情况发生了变化。 为了节省电池,开发人员,工程师甚至消费者都会做很多事情,以避免CPU大量消耗。 能源效率从硬件方面开始,但现在却被深入到软件开发中。 当您尝试评估编程语言的效率时,会出现很多问题。 首先,您使用哪种指标? 更快的程序语言是否更节能? 更快的编程语言是绿色的吗? 但是,比较语...

315

java高级语言设计1,附源代码

JAVA教程:高级Java开发人员是什么样的?即使成为高级开发人员,但你仍要不断学习,多看一些java教程,多学一些技能。广泛的软件开发及其技术知识;精通Java语言;具有设计、构建和测试企业应用程序的经验;具有面向对象设计(OOD)的经验。这些只是与编程相关的基本要求,但拥有技术知识通常不足以获得高级开发人员的工作。 成为高级Java开发人员需要多少年?如何更快地成为高级Java开发人员?以下是一些经验丰富的软件开发人员关于如何尽快达到高级级别的意见和建议。1.建立强有力的方案相关知识基础。很多时候

aifans_bert的博客 500
上一篇: 您应该采用微前端架构的 5 个理由
下一篇: 如何构建人工智能平台
程序员孔乙己
博客等级 码龄5年 1190粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值