」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 全端開發:作為 JavaScript 開發人員學習 Python

全端開發:作為 JavaScript 開發人員學習 Python

發佈於2024-09-02
瀏覽:528

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]刪除
最新教學 更多>
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2025-01-05
  • 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-01-05
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2025-01-05
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2025-01-05
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2025-01-05
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2025-01-05
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2025-01-05
  • 如何從 Pandas DataFrame 欄位中刪除具有空值的行?
    如何從 Pandas DataFrame 欄位中刪除具有空值的行?
    從Pandas DataFrame 列中刪除空值要根據特定列中的空值從Pandas DataFrame 中刪除行,請依照下列步驟操作步驟:1.識別列:決定DataFrame中包含要刪除的空值的欄位。在本例中,它是“EPS”列。 2。使用 dropna() 方法:dropna() 方法可讓您根據特定條...
    程式設計 發佈於2025-01-01
  • 如何在 Go 中正確鍵入斷言介面值片段?
    如何在 Go 中正確鍵入斷言介面值片段?
    型別斷言介面值切片在程式設計中,常常會遇到需要型別斷言介面值切片的情況。然而,這有時會導致錯誤。讓我們深入研究為什麼斷言介面值切片可能並不總是可行的原因。 當嘗試從介面值切片中將斷言鍵入特定類型(例如[]Symbol)時,[]Node ,如提供的範例所示:args.([]Symbol)您可能會遇到以...
    程式設計 發佈於2025-01-01
  • 為什麼 `list.sort()` 回傳 `None` 以及如何取得排序清單?
    為什麼 `list.sort()` 回傳 `None` 以及如何取得排序清單?
    了解Sort() 方法及其傳回值當嘗試排序並傳回唯一單字清單時,您可能會遇到常見問題: 「return list.sort()」語法未如預期傳回排序清單。這可能會令人困惑,因為它似乎與 sort() 方法的目的相矛盾。為了澄清這一點,讓我們檢查一下 list.sort() 的工作原理以及為什麼它在這...
    程式設計 發佈於2025-01-01
  • 如何使“preg_match”正規表示式不區分大小寫?
    如何使“preg_match”正規表示式不區分大小寫?
    使 preg_match 不區分大小寫在問題中提供的程式碼片段中,區分大小寫導致無法實現預期結果。要修正此問題,您可以在正規表示式中使用 i 修飾符,確保其不區分大小寫。 以下是修改程式碼的方法:preg_match("#(.{100}$keywords.{100})#i", s...
    程式設計 發佈於2025-01-01
  • DocumentFilter 如何有效地將 JTextField 輸入限制為整數?
    DocumentFilter 如何有效地將 JTextField 輸入限制為整數?
    將 JTextField 輸入過濾為整數:使用 DocumentFilter 的有效方法雖然直觀,但使用鍵偵聽器來驗證 JTextField 中的數字輸入是不夠的。相反,更全面的方法是使用 DocumentFilter。 DocumentFilter:強大的解決方案DocumentFilter 監視...
    程式設計 發佈於2025-01-01
  • 如何從 Go 程式設定 `ulimit -n`?
    如何從 Go 程式設定 `ulimit -n`?
    如何在golang程式中設定ulimit -n? Go的syscall.Setrlimit函式允許在Go程式中設定ulimit -n。這允許在程式內自訂資源限制,而無需進行全域變更。 瞭解 setrlimitsetrlimit 系統呼叫設定目前程序的資源限制。它需要兩個參數:資源限制類型 (RLIM...
    程式設計 發佈於2024-12-31
  • 為什麼 Java 列印陣列的方式很奇怪,如何正確列印陣列的內容?
    為什麼 Java 列印陣列的方式很奇怪,如何正確列印陣列的內容?
    Java 中奇怪的數組打印在 Java 中,數組不僅僅是值的集合。它們是具有特定行為和表示的物件。當您使用 System.out.println(arr) 列印陣列時,您實際上是在列印物件本身,而不是其內容。 此預設表示顯示陣列的類別名,後面接著該物件的十六進位雜湊程式碼目的。因此,例如,整數數組可...
    程式設計 發佈於2024-12-31
  • 使用 Lithe 進行 PHP 會話管理:從基本設定到進階使用
    使用 Lithe 進行 PHP 會話管理:從基本設定到進階使用
    當我們談論 Web 應用程式時,首要需求之一是在使用者瀏覽頁面時維護使用者資訊。這就是 Lithe 中的 會話管理 的用武之地,它允許您儲存登入資訊或使用者首選項等資料。 安裝簡單快速 要開始在 Lithe 中使用會話,您只需透過 Composer 來安裝會話中間件。只需在專案的...
    程式設計 發佈於2024-12-31

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3