”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 全栈开发:作为 JavaScript 开发人员学习 Python

全栈开发:作为 JavaScript 开发人员学习 Python

发布于2024-09-02
浏览:135

Fullstack Development: Learning Python as JavaScript Developers

旅程开始

我作为前端开发人员已经工作了 8 年多,在过去的 2 年里,我决定重新思考我的职业生涯以及如何成长。我发现前端技术变化频繁:不同的框架、概念以及React类组件和钩子之间的差距。我意识到这一切只是用来表达业务需求和个人愿景的抽象。从那时起,我决定改变自己的职业道路,稍微成为一名全栈开发人员。

众所周知,现在前端开发都是JavaScript,这也是我决定学习Node.js及其主要框架的原因。所有前端开发人员都会以某种方式遇到 Node.js,作为一名高级前端开发人员,您应该能够使用 Express 或其他库在 Node.js 中编写基本端点。经过两年在 Node.js 方面的积极开发,当我的工作在前端和后端之间达到 50/50 时,我发现大多数项目并不局限于一种语言。

Node.js 并不是万能的理想工具,尤其是当您在一家较大的公司工作时。不同的语言提供不同的解决方案或者更适合解决特定的业务案例。这就是为什么我开始研究我可以学习什么作为我的第二后端语言以及我将来如何利用它。

我想分享我的经验,以及为什么我在尝试学习 Rust(主要不是用于 Web 开发)、Swift(主要是移动优先解决方案)和 Golang 之后决定坚持使用 Python。在这里,您将了解为什么我相信 Python 是前端开发人员学习以及如何开始使用它的绝佳机会。

为什么选择Python?

如今,人工智能是每个人都在谈论的话题。在采访中提及它作为你的经历的一部分总是会给你加分。几乎所有公司都在尝试将人工智能融入到他们的产品中,而Python与人工智能和机器学习齐头并进。通过学习 Python,您不仅有机会使用 Django、Flask 和 FastAPI 等框架编写 Web 应用程序,还可以开始使用机器学习和 AI 服务。
一方面,如果你想成为一名更好的程序员,学习 Rust、Go 或 Elixir 等更复杂的语言是个好主意。然而,从职业角度来看,使用你不太熟悉的完全不同的语言成为后端开发人员并不是一件容易的事。

Python 是一种动态类型编程语言。作为一名在类似环境中度过了职业生涯的大部分时间的 JavaScript 开发人员,这不应该让您感到害怕,因为您已经知道代码中会出现哪些类型的问题。
使用Python,您不仅可以开始编写Web应用程序,还可以利用您在AI相关领域的技能,这使Python作为第二语言具有显着的优势。

学习曲线

学习曲线很简单。在Python中,你肯定需要学习一些基本概念。如果您有 JavaScript 经验,那应该不是什么大问题。

这是Python中的代码示例:

import random

def guess_the_number():
    number_to_guess = random.randint(1, 100)
    attempts = 0
    guessed = False

    print("Welcome to the Number Guessing Game!")
    print("I'm thinking of a number between 1 and 100. Can you guess what it is?")

    while not guessed:
        user_guess = int(input("Enter your guess: "))
        attempts  = 1

        if user_guess  number_to_guess:
            print("Too high! Try again.")
        else:
            print(f"Congratulations! You guessed the number {number_to_guess} in {attempts} attempts.")
            guessed = True

guess_the_number()

我认为你不会在这里发现任何太复杂的东西。即使你之前没有学过Python,你也可以在不阅读文档的情况下理解几乎所有的行。

您会注意到的最大区别是 Python 使用缩进来定义代码块而不是花括号。这可能看起来很奇怪,我仍然觉得它有点不寻常,但过了一段时间,你就会习惯它,并且阅读代码变得更容易。

除此之外,Python 中的许多概念与 JavaScript 中的相似。您可以使用 print 来代替 console.log,对于字符串插值,您可以在字符串的开头添加 f 并使用与 JavaScript 中几乎相同的语法。

这是上面代码的 JavaScript 版本:

function guessTheNumber() {
    const numberToGuess = Math.floor(Math.random() * 100)   1;
    let attempts = 0;
    let guessed = false;

    console.log("Welcome to the Number Guessing Game!");
    console.log("I'm thinking of a number between 1 and 100. Can you guess what it is?");

    while (!guessed) {
        const userGuess = parseInt(prompt("Enter your guess: "), 10);
        attempts  ;

        if (userGuess  numberToGuess) {
            console.log("Too high! Try again.");
        } else {
            console.log(`Congratulations! You guessed the number ${numberToGuess} in ${attempts} attempts.`);
            guessed = true;
        }
    }
}

guessTheNumber();

克服障碍:关键概念

你可以在Python中学习很多不同的概念。作为一名 JavaScript 开发人员,我展示了最令人困惑的部分。

基于缩进的语法

作为 JavaScript 开发人员,您可能熟悉如何使用带有 if/else 和其他运算符的代码块。在大多数情况下,您只需添加 {} 即可。 Python 基于缩进的系统可能很棘手。

让我们看看JavaScript代码:

if (role === "admin") {
    const posts = getDraftPosts()

    if (posts.length === 0) {
        throw NotFound()
    }   

    return posts
}

Python 模拟:

if role == "admin":
    posts = get_draft_posts()

    if posts.length == 0:
        raise NotFound()

    return posts

正如您所见,从第一个角度来看,Python 中的块的可读性可能具有挑战性。这就是为什么对我来说避免深层嵌套的块很重要,因为它很难阅读并且很容易错过正确的缩进。请记住,Python 可能会因为缺少缩进而将您的代码附加到错误的代码块。

类型系统

Python 是一种动态类型语言,但我很惊讶地发现 Python 内置了 Types 注释。

def add(x: int, y: int) -> int:
    return x   y

您不需要安装额外的功能,只需安装 Python *3.5 及以上版本中需要的功能即可。*

甚至更复杂的类型也可以描述为等于 Typescript:

# enums
from enum import Enum # import enum for built in lib

class Season(Enum): # extend class to mark it as enum
    SPRING = 1
    SUMMER = 2
    AUTUMN = 3
    WINTER = 4

print(Season.SPRING.name) # SPRING
print(Season.SPRING.value) # 1

# or generics
def first(container: List[T]) -> T:
    return container[0]

list_two: List[int] = [1, 2, 3]
print(first(list_two)) # 1

要使用这些类型,您不需要安装某些东西或转译此代码。这是我在 JavaScript(至少是 Node.js)中错过的东西。我知道 Node.js 在最近的版本中添加了一些基本类型(请参阅关于 Node.js 内置类型支持的 Medium 帖子),但如果你将它与 Python 进行比较,它现在看起来很差。

Python 的全局解释器锁 (GIL)

JavaScript 使用事件驱动、非阻塞模型,而 Python 的全局解释器锁 (GIL) 在多线程程序中可能是一个令人困惑的概念。
Python 全局解释器锁 (GIL) 是一种确保一次只有一个线程执行 Python 代码的机制。即使你的Python程序有多个线程,由于GIL的存在,一次只能有一个线程执行Python代码。
使用 JavaScript,您可以通过 Web Worker 实现多线程,但在 Python 中,您需要使用额外的库来完成此操作。

Pythonic 心态

JavaScript 的“多种方法来做到这一点”的哲学在 Python 中并不适用,因为 Python 更严格地遵循“应该有一种 - 并且最好只有一种 - 明显的方法来做到这一点”的概念。
在 JavaScript 世界中,每个公司都经常创建自己的代码风格指南,如果它遵循基本的 JavaScript 风格建议,那就很幸运了。实际上,使用分号等做法可能会有很大差异,以至于一个项目可能使用分号,而另一个项目则可能不使用。
在 Python 中,强烈建议遵循 PEP 8(Python 风格指南)中的 Pythonic 原则。本指南概述了如何编写 Python 代码的基本规则。
为了编写更好的代码,必须与社区互动并学习优先考虑清晰性和简单性的惯用 Python 实践。

管理依赖关系和虚拟环境

这部分也可能令人困惑。在 JavaScript 中,您通常可以添加包管理器并开始安装依赖项,不会出现任何问题。然而,Python的pip和虚拟环境可能是新概念。

在Python中,当使用额外的依赖项时,强烈建议使用单独的虚拟环境。在您的环境中使用 pip(Python 相当于 JavaScript 中的 npm)安装依赖项可能会破坏系统实用程序或操作系统本身,因为系统 Python 解释器(随操作系统预装的解释器)由操作系统使用,并且其他系统实用程序。

作为解决方案,您可以使用 venv 模块创建虚拟环境:

python -m venv myenv
myenv\Scripts\activate # for windows
source myenv/bin/activate # for Mac

进入虚拟环境后,您可以安装所有依赖项,不会对您的根环境造成任何问题或危险。

寻找支持和资源

我是如何学习Python的

学习一门新语言总是充满挑战。我开始在一个在线平台上学习Python基础知识,并在那里完成了一些小项目。这是我在学习过程中使用的计划:

  • Python 基础知识。
  • 高级 Python 概念(模块系统、类型、环境、异步代码)。
  • 学习 Django、Flask 和 FastAPI 等最流行框架的基础知识。
  • 使用 FastAPI 编写我的第一个 API 服务器。
  • 添加数据库并学习如何在 Python 中使用数据库。
  • 在免费托管服务上部署应用程序。

哪里可以找到帮助

学习时您可以在 Reddit 社区或 Discord 服务器中找到很多帮助。我主要是 Reddit 用户,建议查找 Python 子版块以及您决定用于第一个应用程序的框架。

记得使用官方文档。在我看来,它看起来势不可挡,大多数时候,如果我陷入一个概念,我会尝试查找相关文章。

请务必阅读 PEP 8 — Python 代码风格指南,您可以在其中找到有关如何编写 Python 代码的基本规则。

回顾与展望

当我回顾自己从 JavaScript 开发人员到拥抱 Python 的旅程时,我并不后悔。这种转变带来了令人兴奋的机会,特别是在人工智能和机器学习领域,我现在在我的项目中广泛利用这些机会,特别是在后端。

展望未来,Python 的可能性是巨大的。无论是 Web 开发、数据科学、自动化,还是深入研究人工智能和机器学习,Python 都提供了强大且多功能的基础来构建和探索新视野。

版本声明 本文转载于:https://dev.to/oversec/fullstack-development-learning-python-as-javascript-developers-l6l?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-06-07
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-06-07
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-06-07
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-06-07
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-06-07
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-06-07
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的python功能eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-06-07
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-06-07
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-06-07
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-06-07
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-06-07
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-06-07
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-06-07
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-06-07
  • Python环境变量的访问与管理方法
    Python环境变量的访问与管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    编程 发布于2025-06-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3