Python 现在已经是两种非常相似的编程语言了

389 篇文章 7 订阅
373 篇文章 4 订阅

现在使用 Python 的每个人都知道 Python 支持可选的类型提示,并且已经有一段时间了, 这在社区中造成了一个小的分裂,有些人对类型提示完全不感兴趣,并且对语言部分进入新方向有点保守,有些人对我们不断发展的类型工具的潜力感到非常兴奋,以及还有很多中间状态的人,不完全确定在哪里以及如何最好地应用类型提示。

目前,Python 实际上是两种非常相似的编程语言,对于使用 Python 一段时间的人来说,这当然不足为奇。不过,可能令人惊讶的是,这实际上是一件好事。这些语言,让我们称它们为非类型化 Python 和类型化 Python,尽管共享一个非常大的共同基础,但它们在使开发人员使用它们解决问题的方式上存在根本不同。

请允许我提出一个思考代码的模型:基础设施代码和业务逻辑代码。基础设施代码是令人兴奋的、强大的代码,它公开了易于使用的接口来解决困难和棘手的问题,比如与浏览器对话(Flask)、与数据库对话(Django ORM、SQLAlchemy)、依赖注入框架(incant)、序列化( cattrs)或定义类(attrs、数据类)。业务逻辑代码是枯燥乏味的代码,可让你在日常工作中解决问题并完成工单, 基础设施代码的重点是启用和授权业务逻辑代码;业务逻辑代码为你的雇主、你的用户或任何使用你所写内容的人提供实际价值。基础架构代码是你正在使用的库,业务逻辑代码是你自己编写和部署的代码。

(请注意,与所有抽象一样,这种思考代码的方式是有漏洞的。你使用的库可能是其他库之间的一个简单层,因此具有业务逻辑代码的所有特征。如果你受雇于一个典型的软件公司 开发人员职位你的工作代码库几乎肯定会有你为该代码库编写的基础设施代码。即便如此,但这种思考软件的方式非常有用。)

基础设施代码通常不可能在内部完全进行类型提示;Python 类型系统目前还没有,而且可能永远也不会强大到足以支持像 cattrs 和 attrs 这样的库需要做的操作类型。 无类型 Python 的最大优势之一(也是让我首先接触 Python 的原因)是可用的基础结构代码可以提供非常友好和强大的 API。因此,非类型化 Python 过去一直是基础架构代码的绝佳选择;无类型的 Python 不太适合业务逻辑代码,这就是为什么从历史上看,软件开发人员很快就会抱怨维护用 Python 编写的大型系统,这是有理由的。

业务逻辑代码通常比基础设施代码简单得多,而且当今世界上有更多的代码;对于每个 SQLAlchemy 或 Django,可能有数百个(如果不是数百万个)代码库以简单的方式实际使用它。正因为如此,业务逻辑代码与类型化的 Python 非常匹配。使用类型化的 Python 为开发过程带来了很多好处,比如将整个类别的错误从运行时转移到类型检查时间、易于重构(这对于健康的代码库生命周期至关重要)、强大的编辑器支持(包括自动完成和稳健的列表引用,很好 代码导航)并减少对测试的需求(这会大大增加需要编写和维护的代码量)。

为了使这种结合有效,我们需要基础设施代码不在内部进行类型提示,而是在代码边界提供类型提示接口。这正是生态系统的发展方向,值得注意的例子是 SQLAlchemy 2.0 和新一代 Web 框架,如 FastAPI。此外,随着 Python 类型系统的成熟,它将使一类基础设施代码能够完全类型化,但我的直觉是,最有趣的部分仍将是非类型化的。

至于为什么这是一件好事:如果你知道一个(类型化或非类型化的 Python),那么你学习另一个相对容易(无论如何比学习一种完全不同的语言容易一个数量级),并学习它 将大大增强你作为软件开发人员的能力。

现在我们能否拥有一种同时擅长这两种语言?我不知道,但我真的不认为这会出现在像 Python 这样的语言中, 我对几种不同的语言都有些精通,所以让我们看一下它们的情况:

  • JavaScript 似乎也有与 TypeScript 的分裂情况,尽管我不知道相对于基础设施代码和业务逻辑代码的情况, 估计是一样的吧。
  • 我已经将近十年没有接触 Java 了,但我曾经非常精通它, 我使用的 Java 是彻头彻尾的业务逻辑语言,这很容易解释它在行业中的流行(因为行业中绝大多数工作都是为了编写业务逻辑代码)、所有主要库都有的糟糕接口,以及 恐怖的是我看过一次的 ORM 代码, 我认为 Java 实际上也是两种语言,但 Java 的基础设施很难使用, 这就是为什么如果一位开发人员告诉我他们用 Python 编写了一个 ORM,我会兴奋地想要分享笔记,但当时如果一个开发人员告诉我他们用 Java 编写了一个 ORM,我会看看 他们好像疯了一样。
  • 我认为 Rust 通过其强大的宏系统为基础设施代码提供了一种非常有趣的方法。,我对 Rust 的了解还不够多,无法自信地发表评论,但我想你可以将 Rust 宏视为 Rust 之上的一种不同的基础结构语言, 它输入(类型化)Rust 的方式对我来说特别优雅。

总之:类型化 Python 的加入对我们的社区来说是一件好事,而非类型化 Python 不会消失, 我们只需要根据需求正确的使用,并努力将它们有效地结合起来。

题外话

在这个大数据的时代,你要想走在潮流前端,就必须要学习前沿有用的知识。而今人工智能和数据分析爆发,python就是一颗冉冉升起的新星。

全球知名TIOBE编程语言社区发布了2023年最新的编程语言排行榜。我们一起来看看
在这里插入图片描述

口说无凭,请大家继续来看一下Python的招聘数据。

据职友集数据显示,分别来自50家招聘网站,与Python有关的招聘职位薪资待遇如下:

图片
图片

那么为什么各地对Python工程师需求这么大?工资给的这么高?因为Python程序员太少啦!很多高校并未开设Python课程,因此市场上Python开发人才供小于求。很多企业为了争夺有限的Python程序员,不得不给出极其丰厚的薪资待遇,现在初级Python开发工程师的起薪一般在10-20K!

目前来学的人群分为以下几类:

第一类:入行编程新手:大学刚毕业或者其他行业转岗,想从事编程开发的工作,目前认为Python比较火,想入行;Python简单易学,非常适合新手入门。

第二类:Linux系统运维人员:Linux运维以繁杂著称,对人员系统掌握知识的能力要求非常高,那么也就需要一个编程语言能解决自动化的问题,Python开发运维工作是首选,Python运维工资的薪资普遍比Linux运维人员的工资高。

第三类:做数据分析或者人工智能:不管是常见的大数据分析或者一般的金融分析、科学分析都比较大程度的应用了数据分析,人工智能的一些常见应用也使用了Python的一些技术。

第四类:在职程序员转Python开发:平常只关注div+css这些页面技术,很多时候其实需要与后端开发人员进行交互的,现在有很多Java程序在转到Python语言,他们都被Python代码的优美和开发效率所折服。

第五类:其他:一些工程师以前在做很多SEO优化的时候,苦于不会编程,一些程序上面的问题,得不到解决,只能做做简单的页面优化。现在学会Python之后,你和我一样都可以编写一些查询收录,排名,自动生成网络地图的程序,解决棘手的SEO问题。

当然,这里总结的只是常见的一些情况,关于职业和岗位。

Python的优点:

  • 易于学习:简单、易学、对新手极度友好。
  • 免费开源:Python的所有内容都是免费开源的,不需要花一分钱就可以免费使用Python,并且可以自由地发布这个软件的拷贝、阅读其源代码、对其做改动、把其一部分用于新的自由软件中;
  • 可扩展:Python除了使用Python本身编写外,还可以混合使用像C语言、Java语言等编写;

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等习教程。带你从零基础系统性的学好Python!

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉100道Python练习题👈

检查学习结果。
在这里插入图片描述

👉面试刷题👈

在这里插入图片描述

在这里插入图片描述

👉python副业兼职与全职路线👈

在这里插入图片描述

上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码 即可领取↓↓↓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答。首先,我们需要了解一下图像分割的概念。图像分割是将一张图像分割成多个子区域的过程,每个子区域都表示图像的一个部分或对象。常见的图像分割方法包括阈值分割、区域生长和边缘检测等。 下面是三种利用Python和OpenCV实现图像分割的方法: 1. 阈值分割 阈值分割是将图像分成两个或多个部分的最简单方法。在阈值分割中,我们选取一个阈值,将图像中所有像素的灰度值与该阈值比较,大于阈值的像素被分配到一个区域,小于等于阈值的像素被分配到另一个区域。 以下是一个简单的示例代码: ```python import cv2 # 读取图像 img = cv2.imread('image.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 阈值分割 ret, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 显示结果 cv2.imshow('Threshold', threshold) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先读取了一张图像,并将其转换为灰度图像。然后,我们使用cv2.threshold()函数进行阈值分割。该函数的第一个参数是输入图像,第二个参数是阈值,第三个参数是当像素值大于阈值时应该被赋予的值,第四个参数是阈值类型。在本例中,我们使用了二进制阈值分割,因此阈值类型为cv2.THRESH_BINARY。最后,我们使用cv2.imshow()函数显示结果图像。 2. 区域生长 区域生长是一种基于像素相似度的图像分割技术。该方法从种子像素开始,根据像素的相似性逐步生长出一片区域,直到遇到像素不相似的边缘为止。区域生长方法需要对图像进行一些前期处理,例如平滑和边缘检测等。 以下是一个简单的示例代码: ```python import cv2 # 读取图像 img = cv2.imread('image.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 平滑处理 blur = cv2.GaussianBlur(gray, (5, 5), 0) # 区域生长 seed_point = (img.shape[0] // 2, img.shape[1] // 2) mask = cv2.floodFill(blur, None, seed_point, 255, cv2.FLOODFILL_MASK_ONLY) # 显示结果 cv2.imshow('Region Growing', mask) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先读取了一张图像,并将其转换为灰度图像。然后,我们使用cv2.GaussianBlur()函数进行平滑处理。接着,我们使用cv2.floodFill()函数进行区域生长。该函数的第一个参数是输入图像,第二个参数是掩模图像,第三个参数是种子像素的坐标,第四个参数是填充的颜色,第五个参数是阈值,第六个参数是标志。在本例中,我们使用了掩模图像和阈值,因此标志为cv2.FLOODFILL_MASK_ONLY。最后,我们使用cv2.imshow()函数显示结果图像。 3. 边缘检测 边缘检测是一种基于图像灰度变化率的图像分割技术。该方法通过检测图像中像素值的变化率,找出图像中的边缘或轮廓。 以下是一个简单的示例代码: ```python import cv2 # 读取图像 img = cv2.imread('image.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 100, 200) # 显示结果 cv2.imshow('Edge Detection', edges) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先读取了一张图像,并将其转换为灰度图像。然后,我们使用cv2.Canny()函数进行边缘检测。该函数的第一个参数是输入图像,第二个参数和第三个参数是低阈值和高阈值。在本例中,我们使用了低阈值100和高阈值200。最后,我们使用cv2.imshow()函数显示结果图像。 希望以上三种方法能够帮助到你。如果有任何问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值