如何在多个编程语言间切换自如

目录

基本思路

  1. 基本结构和控制流要记住,也就是熟悉基本语法
  2. 识别各自语言的特性,也就是知道高级特性

本文主要是熟悉基本语法,搞清楚不同的编程语言怎么描述相同的功能的。对于高级特性,点到为止。

语法简介

语法特性PythonGo
变量声明动态类型,无需声明静态类型,必须声明
代码块缩进(空格/制表符){} 包裹
循环for、while只有 for
函数def,支持默认参数func,无默认参数
错误处理try-except返回 error + if err != nil
并发threading(GIL 限制)goroutine + channel
面向对象完整类继承struct + interface
包管理pip + importgo mod + import

内置函数

Python 的内置函数更丰富,适合快速开发;Go 的内置函数较少,但更专注于底层控制和性能优化。

类别PythonGo
输入输出print(), input()fmt.Println(), fmt.Scan()
类型转换int(), str()strconv.Atoi(), string()
集合操作len(), sorted(), map()len(), append(), make()
并发threading(非内置)go, chan, close()
错误处理try/except(语法)panic(), recover()

Go

  1. 内存分配:new(), make()
  2. 类型转换:int(), float64(), string()
  3. 集合操作:len(), cap(), append()
  4. 并发:go, close()
  5. 错误处理:panic(), recover()

Python

  1. 输入输出:print(), input()
  2. 类型转换:int(), float(), str(), bool()
  3. 数学运算:abs(), round(), min(), max(), sum()
  4. 迭代与序列操作:len(), range(), sorted(), enumerate()
  5. 对象操作:type(), isinstance(), dir()
  6. 高阶函数:map(), filter(), zip()

控制流

循环

Go
/* Go 只有 for 循环 */

for i, val := range arr {
  // ...
}

for i := 0; i < len(arr); i++ {
  // ...
}
Python
for i in range(10):
  pass

for i in range(0, 10, 1):
  pass

for val in arr:
  pass

for i, val in enumerate(arr):
  pass
else
  pass

while len(queue) > 0:
  pass
else
  pass

while flag: print(str(flag))

数据结构

Go

stack := make([]string, 0, 10)

// 入栈
stack = append(stack, "A")

// 出栈
v := stack[len(stack)-1]
stack = stack[:len(stack)-1]

// 判断是否为空
isEmpty := len(stack) == 0

Python

L = []

L.append('D')  # 入栈

L.pop()  # 出栈
L[-1]  # peek

队列

Go

queue := make([]int, 0)

// 入队
queue = append(queue, 10)

// 出队
v := queue[0]
queue = queue[1:]

// 判断是否为空
isEmpty := len(queue) == 0

Python

L = []

L.append('D')  # 入队

L.pop(0)  # 出队
L[0]  # peek
  • collections.deque 是个高效的双端队列,具有 popleft() append() 方法。

集合

集合(set)是一个无序的不重复元素序列。

如果从广义上来看的话,数组、字典、元组、栈、队列等都是集合。

Go

无原生 Set,通常用 map[T]boolmap[T]struct{} 模拟。一般还会封装成一个结构体。

// 初始化一个 set(用 map[string]bool 模拟)
set := make(map[string]bool)

// 添加元素
set["apple"] = true
set["banana"] = true

// 检查元素是否存在
if set["apple"] {
    fmt.Println("apple exists") // 输出: apple exists
}

if _, ok := set["apple"]; ok {
  // 当使用 map[string]struct{} 时更省内存(struct{} 是零大小类型)
    fmt.Println("apple exists") // 输出: apple exists
}

// 删除元素
delete(set, "banana")

// 遍历集合
for key := range set {
    fmt.Println(key) // 输出: apple
}

Python

set1 = {1, 2, 3, 4}            # 直接使用大括号创建集合; 创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典
set2 = set([4, 5, 6, 7])      # 使用 set() 函数从列表创建集合

set2.add(8)  # 将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作
set2.update([9,10])  # 参数可以是列表,元组,字典等

set2.remove(8)  # 将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误
set2.discard(8)  # 移除集合中的元素,且如果元素不存在,不会发生错误
set2.pop()  # 随机删除集合中的一个元素
set2.clear()  # 清空集合

x in s  # 判断元素 x 是否在集合 s 中,存在返回 True,不存在返回 False
len(s)  # 计算集合 s 元素个数
标签 :
comments powered by Disqus

相关文章

Neo4j: 图数据基本概念、语法与增删改查

Neo4j 简介 Neo4j 使用属性图(Property Graph)模型1。 一个图包含节点(Objects)和边(Relationships)。 Neo4j 的属性图模型包含了: 节点 节点标签:用于区分节点的类型,0个或多个 边:源节点与目标节点之间的一条有向边 边类型:用于区分边的类型,有且仅有1个 属性:节点和边都可以有属性(键值对)用于描述节点和边 注意这些名词的英文:node、relationship、label(节点可以有0个或多个标签)、type(边只有一个类型)、property

阅读更多
Remarkable2 配置中文字体与其他 Tips

动机 每次更新系统之后,我的字体就没了,我哭😭 主旨 导入文档 下面尝试导入 PDF、EPUB 来看看阅读效果。首先肯定要去官方的支持网站,看看用户手册。 官方的导入方案中,总的来说就两种,一个是通过它的云同步服务,在客户端程序上导入,另一个就是通过 USB 连接到电脑,通过浏览器网页导入。

阅读更多
如何在没有U盘的情况下,重新安装操作系统?无U盘也能装Ubuntu!

动机 windows11 是在是跑不起来了,卡的要死 咱还是装个 Ubuntu 好让我跑 microk8s ! easyUEFI 没有U盘安装ubuntu18(linux),EasyUEFI安装ubuntu_大蜻科的博客-CSDN博客_无u盘安装ubuntu18 使用easyuefi

阅读更多