从 C++ 到 Python:走得更近





5.00/5 (13投票s)
面向 C++ 开发者的快速 Python 课程。
引言
如果你精通 C++,学习其他任何语言都非常简单。 那么让我们来看看 Python,这是我们今天拥有的最现代的机器学习工具。
并不是说 C++ 中没有库,但是它们比我们需要做的要低级得多。 只需看看我使用 DirectML 编写的机器学习文章,并将其与 torch 将张量发送到 GPU 的方式进行比较:
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/函数/类)。
缩进在 Python 中是强制性的,因此在 if、函数、类等之后的所有内容,在 C++ 中你将使用 { 和 } 的地方,必须缩进,否则你会收到错误。
变量用法
像 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 之后,我们可以有一个 else 来在 while 不为真或不再为真时执行代码
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);
}
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++ 中的逻辑 && || 和 ! 在 Python 中是 "and"、"or" 和 "not"
函数
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++,全局变量变得不可见。
数组
没有“低级”数组,请改用列表。
names = ["Michael","George","John"]
x = names[0] # x = "Michael"
x = names[-1] # x = "John"
names2 = ["Michael",["Jack","Peter"],"George","John"]
x = names2[1][1] # x = "Peter"
names3 = names[0:1]
# names3 = ["Michael","George"]
names3.append("Johanna")
# names3 = ["Michael","George","Johanna"]
names3.extend(["Paul","Cath"])
# names3 = ["Michael","George","Johanna","Paul","Cath"]
del names3[0]
# names3 = ["George","Johanna","Paul","Cath"]
print("Cath" in names3) # prints True
相同的数组访问元素,例如 [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() 用于访问超类的数据。
现在就这样。 继续努力!
历史
2024-9-20:修复了拼写错误,添加了安装方法。
2024-7-4:首次发布