65.9K
CodeProject 正在变化。 阅读更多。
Home

从 C++ 到 Python:走得更近

starIconstarIconstarIconstarIconstarIcon

5.00/5 (13投票s)

2024 年 7 月 3 日

CPOL

3分钟阅读

viewsIcon

16638

面向 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:首次发布

© . All rights reserved.