C/C++ 与 Python 之间的异同

目录

前言

The Origin of C and Python

About 原始字符串与转义字符 ' \ '

Multiline string(跨行字符串)

method one

method two

Function 'print' and 'repr' in Python

Function 'range()'

Function 'fractions' -- 有理数

Function 'random' -- 生成伪随机数

Various methods for lists(列表)

Ternary Conditional Operator(三元条件表达式)

Reflections on 'decimal'

Orperartor 'and - or' 

'For' loop

Function 'extend()' 与 Slicing Syntax(切片语法)

What details should we pay attention to?

无空格字符串

截断与向下取整

不同类型的数据比较与运算

真值


前言

最近为做科研做准备开始了Python的学习

因为母语是C(确信),在Python的学习过程发现了很多有意思的点,或者平时写C没有注意到的一些异同,记录下来,当作消遣or笔记。

PS.想尽力去用英语来书写blog(英语最近用的实在太少了),需要为阅读文献做好准备。


The Origin of C and Python

因为Python的很多地方与C不谋而合,所以查了一下两者的关系

可以追溯到Python语言的设计目标和发展历程。

Python是由Guido van Rossum于1989年开始设计的。他的目标之一是创建一种简洁、易读且易于理解的编程语言。为了实现这个目标,他选择了从ABC语言继承某些特性,并在其基础上进行改进和扩展。

在Python的早期版本中,它是完全由C语言实现的。这意味着Python解释器本身以及Python标准库中的许多模块都是用C语言编写的。使用C语言作为实现语言,可以提供高性能和底层访问的能力。

随着Python的发展,人们越来越希望能够利用已有的C代码和现有的C库,以满足更复杂的需求。因此,Python引入了与C语言的集成机制,使得开发者可以通过编写C扩展模块或者使用Cython等工具来直接调用C代码。

另外,由于Python的易用性和灵活性,在科学计算、数据处理、机器学习等领域得到了广泛应用。为了提高性能和效率,许多Python库底层的关键部分都使用C语言来编写,以获得更好的执行速度。

总的来说,C与Python之间的渊源可以归结为Python的设计目标和发展需求,以及对性能和底层访问的追求。通过C语言的集成和底层支持,使得Python成为了一种功能强大且灵活的编程语言。


When I study Python,I find some interesting details about coding(C, C++ or Python).I think it's necessary to note them.

About 原始字符串与转义字符 ' \ '

在 C 语言中,没有像 Python 中显示原始字符串的方法。在 Python 中,使用 rR 前缀可以创建原始字符串(即不会对转义字符进行处理)。

然而,在 C 语言中,你可以使用转义字符来表示特殊字符或控制字符,例如使用 \n 表示换行符或者使用 \" 表示双引号。如果你想要在 C 语言中打印包含转义字符的字符串,可以使用反斜杠进行转义。


Multiline string(跨行字符串)

method one

If a '\' is the end of the line within printf("        "),it stands for informing the IDE "that the line is not ending yet".

Able to use in C and Python.

method two

using "Triple-quoted(长字符串)" ,which is meaning that using

a = """

string
 
"""

or

a='''

string

'''

each time.

PS. """ or '''  Must be coordinated in pairs, both before and after.

Only able in Python.


Function 'print' and 'repr' in Python

"""在Python中"""
poetry ='''
Hi
HiHi
'''

print(poetry)

Hi
HiHi


"""和"""

poetry
'\nHi\nHiHi\n'

"""的调用结果为什么会不一样呢"""

在Python中,三个引号(''' 或 """)用于创建多行字符串。当你使用print函数打印一个多行字符串时,它会按照实际的格式输出每一行,并且会自动换行。

在你的代码中,poetry变量赋值了一个多行字符串,并且使用print函数打印它,结果是按照预期的格式输出:

Hi
HiHi

然而,当你直接输入变量名"poetry"并回车时,Python解释器会默认使用repr函数来展示该变量的值。repr函数的作用是返回一个对象的字符串表示形式,通常是在控制台中显示。这里,默认的展示方式是按照字符串字面量的形式,包括转义字符和换行符。因此,当你直接输入"poetry"时,得到的输出是带有转义字符和换行符的字符串:

'\nHi\nHiHi\n'

所以,使用print函数和直接输入变量名所展示的结果略有不同,这是因为print函数会按实际格式输出字符串,而直接输入变量名则会使用repr函数展示字符串字面量

Only able in Python.


Function 'range()'

在Python中,range是一个内置函数,用于生成一系列的整数。它常用于循环和迭代操作,可以产生指定范围内的整数序列。

range函数有三种形式:

  1. range(stop)生成从0开始到stop-1的整数序列。
  2. range(start, stop, step)生成从start开始到stop-1的整数序列,步长为step。其中,start是起始值,stop是终止值,step是步长(默认为1)。
  3. range(start, stop)与第二种形式类似,但步长默认为1。

下面是一些使用range函数的例子:

# 生成从0到4的整数序列
for i in range(5):
    print(i)  # 输出:0 1 2 3 4

# 生成从1到6的奇数序列
for i in range(1, 7, 2):
    print(i)  # 输出:1 3 5

# 生成从10到1的倒序序列
for i in range(10, 0, -1):
    print(i)  # 输出:10 9 8 7 6 5 4 3 2 1

需要注意的是,range函数返回的是一个可迭代对象,如果需要将其转换为列表,可以使用list()函数进行转换,例如:list(range(5))会生成一个包含0到4的整数列表 [0, 1, 2, 3, 4]


Function 'fractions' -- 有理数

fractions 模块提供了对有理数运算的支持。

一个 Fraction 实例可以由一对整数,或者一个有理数,或者字符串进行构造。

fractions--有理数(引用自鱼C论坛)


Function 'random' -- 生成伪随机数

random 模块实现了各种分布的伪随机数生成器。

random -- 生成伪随机数(引用自鱼C论坛)


Various methods for lists(列表)


列表的各种方法大合集(引用自鱼C论坛)


Ternary Conditional Operator(三元条件表达式)

In Python,

三元条件表达式允许根据条件的真假来选择两个不同的值进行赋值。它的一般语法形式如下:

x = value1 if condition else value2
expression1 if condition else expression2
"""下面是一个简单的例子"""
x = 520 if "Love" else 404

其中,condition是需要判断的条件表达式,如果条件为真,则将value1赋给变量x;如果条件为假,则将value2赋给变量x

In C/C++,

当谈到C语言的三元表达式时,我们通常指的是C语言中的条件运算符(Conditional Operator),也被称为三元运算符。它是一种特殊的运算符,由问号(?)和冒号(:)组成。

三元表达式的语法如下:

x = (condition) ? value1 : value2
condition ? expression1 : expression2
//下面是一个简单的例子
int x = 5;
int y = (x > 10) ? 100 : -100;

其中,condition 是一个条件表达式,可以是任何有返回值的表达式。如果 condition 的值为真(非零),则整个表达式的值为 expression1 的值;如果 condition 的值为假(零),则整个表达式的值为 expression2 的值。


Reflections on 'decimal'

At the beginning of my learning of Python, I saw the function 'decimal()' as a function which return completely accurate data.But in reality, it's not like that.

在大多数编程语言中,decimal 是一种用于高精度计算的数据类型。它通常使用固定点表示法,可以存储任意精度的小数。

具体的精度取决于编程语言和实现方式。以下是一些常见的精度范围:

  • Python: decimal.Decimal 类型默认使用 28 位精度,可以通过设置上下文精度进行调整。
  • Java: java.math.BigDecimal 类型默认使用 18 位精度。
  • C#: System.Decimal 类型使用 28-29 位有效数字。
  • JavaScript: JavaScript 的原生数字类型 Number 使用双精度浮点数表示,约有 15-17 位十进制数字的精度。然而,一些库(如 bignumber.js)提供了支持任意精度的十进制运算。

需要注意的是,虽然 decimal 类型具有较高的精度,但在执行非常大或非常小的计算时仍然可能出现舍入误差。这是由于计算机在存储和处理浮点数时的固有限制所致。对于特别要求更高精度的场景,可能需要使用专门的高精度计算库或自定义解决方案。


Orperartor 'and - or' 

在多数情况下使用 and 和 or 运算符可以实现与条件分支相同的效果

"条件语句:"
if C:
    X
else:
    Y

"转为and-or:"
C and X or Y

需要注意的一点是:上面的 X 必须是一个能得到布尔真值的表达式,否则就会出问题(像 a < b and print("A") or print("B") 这个表达式就不行了,因为 print 函数的返回值是 None)。


'For' loop

在Python中,使用forin关键字可以实现对可迭代对象进行遍历

The logic of implementing 'for' loop in Python and C/C++ is different.

For python, it's traversal(遍历). And for C, it's an operation such as i++. C is obviously a bit more flexible, but Python is convenient.

for循环的基本语法如下:

for 变量 in 可迭代对象:
    # 循环体代码

在每次迭代中,变量将被赋值为可迭代对象中的当前元素,并执行循环体中的代码。当所有元素都被遍历完毕后,循环结束。

以下是for循环的实现逻辑:

  1. 确定要遍历的可迭代对象,如列表、元组、字符串或字典的键或值等。
  2. 在每次迭代中,将可迭代对象中的当前元素赋给变量。
  3. 执行循环体中的代码。
  4. 重复上述步骤,直到遍历完所有元素为止。

例如,我们可以使用for循环遍历一个列表,并打印出列表中的每个元素:

my_list = [1, 2, 3, 4, 5]

for num in my_list:
    print(num)

# Output:
# 1
# 2
# 3
# 4
# 5

在这个例子中,my_list是一个列表,num是循环变量,它在每次迭代中获取列表中的当前元素,并将其打印出来。循环将重复执行5次,分别打印出列表中的每个元素。


Function 'extend()' Slicing Syntax(切片语法)

对于列表对象,在使用extend()方法时,它期望的是一个可迭代对象作为参数。当你通过传递一个字符串("上山打老虎")给extend()方法时,它将会把字符串拆分成独立的字符,并将每个字符作为列表的独立元素追加到列表中。

所以,使用extend()方法时,字符串被拆分成字符的行为是符合预期的。如果你希望作为整体将字符串追加到列表中,可以将字符串包装在列表内,然后使用extend()方法。示例代码如下:

my_list = [1, 2, 3, 4, 5]
my_list.extend(["上山打老虎"])
print(my_list)
[1, 2, 3, 4, 5, '上山打老虎']
---------------------------------------
my_list.extend("上山打老虎")
print(my_list)
[1, 2, 3, 4, 5, '上', '山', '打', '老', '虎']

for Slicing Syntax(切片语法)

my_list = [1, 2, 3, 4, 5]
my_list[len(my_list):] = ["上山打老虎"]
print(my_list)
[1, 2, 3, 4, 5, '上山打老虎']
---------------------------------------
s[len(my_list):]="上山打老虎"
print(my_list)
[1, 2, 3, 4, 5, '上', '山', '打', '老', '虎']

对于切片赋值操作,它会将右侧对象切割为单个元素,并用这些单个元素替换左侧切片的位置上的元素。

PS.the different results lie in "str" and ["str"]


What details should we pay attention to?

While learning Python, I have come to realize that it is a programming language that is relatively easy to learn but has certain strict rules.

无空格字符串

For example:

在Python中,有几个常用的格式转换函数需要无空格字符串作为参数。以下是其中一些常见的函数及其特性:

  1. int():将字符串转换为整数

  2. float():将字符串转换为浮点数

  3. str():将其他类型的数据转换为字符串

  4. bool():将字符串转换为布尔值

这些格式转换函数在处理字符串参数时,要求字符串不包含空格


截断与向下取整

In Python,

the statement int( ) leads to truncation(截断),

while ' // '  leads to floor division(向下取整).


不同类型的数据比较与运算

In Python,

整数和字符串或者浮点数和字符串是不能进行比较的,但整数和浮点数却可以进行比较。

当浮点数相加的结果等于整数时,则不会出现偏差:如 0.1 + 0.2 会出现偏差,但 0.1 + 0.2 + 0.7 却能得到整数答案 1.0。


真值

In Python,

TrueFalse 两个关键字是完全等值于 1 和 0 的。

布尔类型其实就是特殊的整数类型,True 和 False 就是 1 和 0 的别称,但作为条件,使用 True 和 False 显然比 1 和 0 要更好理解。这代表着True 和False 可以参与数值运算。

Able to use in C and Python.

PS.In C/C++,they are 'true' and 'false'.


赋值之引用与副本

在C++中,赋值操作符默认创建对象的副本。这意味着变量的内容会被复制到新变量中,新变量和原变量是独立的。

而在Python中,赋值操作默认创建对象的引用,新变量将引用原始对象。修改一个变量的值会同时影响其他引用该对象的变量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Any Problem?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值