原文链接:
https://www.codeproject.com/Articles/5383595/From-Cplusplus-to-Python-Get-Closer
如果你懂 C++,那么你就会看到 Python 是如何工作的。
介绍
如果你很了解 C++,学习任何其他语言都非常简单。那么,让我们来看看 Python,这是我们当今拥有的最现代的机器学习工具。
并不是说 C++ 中没有库,但它们比我们需要做的要低得多。只需查看我使用 DirectML 的机器学习文章,并将其与将张量发送到 GPU 的 torch 方法进行比较即可:
a = torch.LongTensor(1).random_(0, 10)
a = a.to(device="cuda")
在进行机器学习等工作时,我们对编写 200 行 SQLite3 包装器只是为了将数据库加载到内存中或从头开始创建张量类来操作它并不感兴趣。您还需要大量的多线程和同步、数据库访问和快速数学知识。Python 要容易得多。
Python 3 的
我不打算引用 Python 2,它与版本 3 有一些不兼容(例如,在 Python 2 中,字符串默认不是 unicode)。我一直专注于 Python 3。
便携式安装
查看适用于 Windows 的 WinPython,以获取您想要的任何版本的便携式安装。对于其他选项,您还可以通过 MiniConda 使用 conda。
注释
# Single line comment
"""
Multiline comment
"""
空格和标识很重要
x = 5
if x == 5:
print("hello")
在 Python 中,您不需要分号来标记行尾,因此您需要 \n。此外,没有 { 和 },因此您需要标识来标记 {} 部分。此外,Python 使用 ':' 来标记 C++ 中接下来带有 { 的任何内容的结尾 (if/while/function/class)。
在 Python 中,标识是强制性的,因此在 C++ 中使用 { 和 } 的 if、function、class 等之后的所有内容都必须缩进,否则会出现错误。
可变用法
与 PHP 一样,您不需要类型化声明。Python 变量是根据需要动态创建的。
x = 5
y = 10
z = int(input("Enter a number:"))
e = x + y + z
if e == 10:
print("10")
else:
print("Not 10")
将 Python 变量视为具有动态存储的 C++ 中的变量。std::any
数据类型
你有
int如long long
float如double
complex (在 C++ 中没有直接等效项)
bool 如bool
str 如std::string
lists 如std::vector<std::any>
tuples 如const std::vector<std::any>
sets 如std::set<std::any>
dictionaries 如std::map<std::any>
# int
x = 5
# float
x = 5.2
# complex
x = 4+2j
# bool
X = True
# str
x = "Hello"
x = 'Hello' # equal
# list
x = ["Hello","There",5]
# tuple
x = ("Hello","There",5)
# set
x = {"a","b","c"}
# dict
x = {"a1":"b","a2":"c","a3":"d"} # like Json
# some casting
x = 5
y = float(x)
# multiple assignment
a,b,c = "1","2","3"
字符串可以使用双引号或单引号,并且是 unicode。元组是不可变的。
流控制
Python 有 if、elif、else、while 和 for。双冒号 :标记表达式的结尾:
if x > y:
print("Hello")
在 while 之后,当 while 不为 true 或不再为 true 时,我们可以有一个 else 来执行代码:
while x > y:
y++;
else:
print("x no longer larger than y")
Python 中的 for 循环仅对循环集有效,因此类似于 C++ 中的 for(auto& x :container):
std::vector<int> ints = {1,2,3};
for(auto i : ints)
{
printf("%d",i);
}
# python
ints = [1,2,3]
for i in ints:
print(i)
如果出于某种原因需要空语句,例如 C++ 中的 if () {},请使用关键字 pass
if i > 5:
pass
此关键字也可用于函数和类。
a = ...;
switch(a)
{
case 5:
result = 1;
break;
}
a = ...
match a:
case 5:
result = 1
运营商
除了常见的 C++ 运算符 (+*/- 等) 之外,Python 还有两个有趣的运算符:
x = 5
y = 3
z = x/y # result = float
z = x//y # result = int
z = x**y # equal to pow(x,y)
逻辑上的&& ||和!在 C++ 中是 “and”、“or” 和 “not” 在 Python 中
功能
def fn_name(a,b = "Default_value"):
print("Hello",a,b)
# call it
fn_name(1)
fn_name(2,"Hello")
# variant number of arguments
def fn2(*k): # now k will be a tuple
print(k)
fn2("Hello","There")
# named arguments call
fn_name(a = 5,b = 3) # equal to fn_name(5,3)
fn_name(b = 4,a = 1) # equal to fn_name(1,4)
# dictionary call
def fn3(**k): # now k will be a dict
print(k["King"])
fn3(Hello = "There",King = "Michael")
Python 也有 lambda 函数,它们只支持其中的一个语句。
def f1(a,b):
multwo = lambda c,d : c*d
return multwo(a,b)
如果您创建一个全局变量,然后在函数中有一个局部变量,它的行为类似于 C++,全局变量将变得不可见。
阵 列
python没有 “low-level” 数组,请使用 lists 代替。
names = ["Michael","George","John"]
x = names[0]
x = names[-1]
names2 = ["Michael",["Jack","Peter"],"George","John"]
x = names2[1][1]
names3 = names[0:1]
names3.append("Johanna")
names3.extend(["Paul","Cath"])
del names3[0]
print("Cath" in names3)
相同的数组访问元素(如 [0]、[0:1]、[-1] )也适用于字符串。
异常处理
FILE* fp = 0;
fopen_s(&fp,"test.txt","r");
try
{
fwrite(fp,1,1,"x");
}
finally
{
fclose(fp);
}
with open("test.txt", "r") as infile:
content = infile.read()
...
lock = threading.Lock()
with lock:
# Critical section of code
在 Python 中,with 关键字会自动在其块的末尾释放内容。它是 RAII(资源获取即初始化)C++ 模型,可在需要时安全地释放对象。在此 StackOverflow 问题中了解更多信息。
模块
模块就是一个.py 文件,然后您可以从另一个 Python 文件(如 C++ 中的命名空间)引用它。
# m.py
def mulf(a,b):
return a*b;
# project.py
import m
y = m.mulf(1,5)
# project2.py
import m as mm
y = mm.mulf(10,11)
Pip 在 Python 中安装了许多现成的模块,您现在可能已经知道了。
对象
# class example
class Animal:
# constructor
def __init__(self,name,age = 2):
self.animal_name = name # this->animal_name = name;, creates a public member "animal_name"
self.__animal_age = age # creates a non-public member "animal_age"
# member function
def printme(self):
print(self.animal_name)
# operator overloading
def __add__(self, other):
return Animal(self.name + other.name);
# use it
a = Animal("Leopard")
a.printme()
print(a.animal_name)
b = Animal("Elephant")
c = a + b # LeopardElephant (duh:)
变量的默认访问权限是 “public”,您可以使用两个下划线将其设为私有。还有其他“特殊”重载,如 __sub__、__pow__ 等。__lt__()、__le__()、__gt__()、__ge__()、__eq__()、__ne__() 重载<、<=、>、>=、== 和 !=。
# Inheritance
class FastAnimal(Animal):
def __init__(self,name,age,speed):
super().__init__(name,age)
self.speed= speed
与 C++ 相反,您可以省略调用父构造函数。在这种情况下,父变量不存在。super() 用于访问超类的数据。