Python不支持 i ++ 语法的原因解析

简要讨论为什么它不提供++作为运算符

正常情况下,当有人问起++原因而不是Python中的运算符时,这一行引起了我的注意。

如果您想知道最初的原因,则必须翻阅旧的Python邮件列表,或询问那里的某个人(例如Guido)〜通过stackoverflow

这迫使我像上图一样思考。 真的我必须问Guido原因吗? 好的,也许但是在那之前,我应该尝试一下,这促使我写这篇文章

在C / C ++ / Java之类的语言中,对整数变量进行自增或自减运算是标准的,可以分为前缀运算(++ i和–i)和后缀运算(i ++和i–), 每个都有细微的差异和不同的目的。

当这些语言的用户进入Python时,他们可能会想知道为什么它不提供++或-操作。

尽管前缀++ i可能出现在Python中,但它不是" ++"自增运算符。

在这种情况下,它只是两个" +"(正号)的叠加,而根本不支持" ++"后缀! (SyntaxError:语法无效)。

那么,为什么Python不支持i ++增量语法?

首先,Python当然可以实现自我增强的效果,即以i + = 1或i = i + 1的形式编写,这在其他语言中也很常见。

尽管Python在底部使用了不同的魔术方法(add ()和__iadd __())来完成计算,但是表面上的效果却完全相同。

因此,我们的问题可以转换为:为什么以上两种书写风格会比i ++更好,并成为Python的最终选择?

1. Python整数是不可变的类型

当我们定义i = 1000时,不同的语言会区别对待它们。

诸如C(写入int = 1000)的语言将适用于内存空间,并将其``绑定''到固定名称i上,同时写入变量值1000。

这里,i的地址和类型是固定的,而值是可变的。

Python(写i = 1000)也将申请内存空间,但是它将"绑定"到数字1000,即该1000的地址和类型是不可变的

因此,当我们使我"自我增加"(i = i + 1)时,两者都被区别对待。

诸如C之类的语言首先找到存储在i地址中的值,然后将其加1。 操作后,新值将替换旧值 Python的操作过程是将i指向的数字加1,然后,将结果绑定到新应用的存储空间,然后将名称标签"粘贴"到新数字。

打个比方:C中的i就像是一个寄生了1000的主机,而Python中的1000就像了一个寄生了i的主机。 所以我在C语言中与Python中的1000相同

综上所述,让我们看一下i ++,不难发现:

在C之类的语言中,i ++可以表示i的数值属性的增加,既不会打开新的内存空间,也不会创建新的一等公民 在像Python这样的语言中,如果i ++是对其name属性的操作,则这没有任何意义。 如果将其理解为对数字本体的一种操作,那么情况将会很复杂。

它将生成一个新的一等公民1001,因此需要为其分配一个内存地址。 如果此时占用的地址为1000,则将涉及旧对象的回收,并且与1000的原始引用关系也将受到影响。 因此只能为1001打开新的内存空间

如果Python支持i ++,则其操作过程将比C ++复杂,并且其含义不再是"将数字增加1"(递增),而应是"创建新数字"。

Python理论上可以实现i ++操作,但是它必须重新定义"增量运算符",这将导致具有其他语言经验的人误解。

最好让每个人都直接写i + = 1或i = i + 1。

2. Python具有可迭代的对象

诸如C / C ++之类的语言已将i ++设计为主要是为了方便使用三部分的for循环结构。

这种程序与数字本身的自增过程有关。 数字的增加与程序主体的执行有关。

Python中没有这种结构,它提供了一种更优雅的方法:

这里反映了不同的思维方式。

  • 它关心值范围内的迭代遍历。
  • 它不在乎或不需要人为添加数字。

Python中的可迭代对象/迭代器/生成器提供了很好的迭代/遍历用法,并且可以完全替代i ++。

例如,Python可以使用enumerate()与上述示例中的值同时遍历下标和特定值。

再举一个例子,对于字典遍历,Python提供了keys(),values(),item()和其他遍历方法,这些方法非常易于使用:

不仅在Python中很少使用i + = 1或i = i + 1,而且迭代对象的可用性使操作值范围变得容易,并且很少有人要求对其进行累加。

因此,回到我们最初的问题,这两种"自增"方法并不比i ++好多少,仅仅是因为它们是通用操作

这就是为什么无需引入新的运算符,Python会继续提供基础支持的原因。 真正的赢家是各种各样的可迭代对象!

摘要

Python不支持递增运算符,原因如下:

因为它的整数是一类不变的一等公民,所以如果要支持增量运算(++),将会带来歧义

含糊不清的原因:在本故事中

主要是因为它具有更合适的实现,即迭代对象,它对遍历操作具有良好的支持。

到此这篇关于Python不支持 i ++ 语法的原因解析的文章就介绍到这了,更多相关Python不支持 i ++ 语法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-07-21

Linux下python与C++使用dlib实现人脸检测

python 与 C++ dlib人脸检测结果对比,供大家参考,具体内容如下 说明: 由于项目需求发现Linux下c++使用dlib进行人脸检测和python使用dlib检测,得到的结果出入比较大,于是写了测试用例,发现影响结果的原因有但不限于: 1.dlib版本不同(影响不大,几个像素的差别) 2.dlib 人脸检测中detector()第二个参数的设置测试结果如下: python PDlib.py: # -*- coding: utf-8 -*- import sys import cv2

Python调用C++,通过Pybind11制作Python接口

我是在ubuntu系统进行实验的,所以和window可能会有区别. python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单,现在我们就简单记下Pybind11的入门操作. 1. pybind11简介与环境安装 pybind11是一个轻量级的只包含头文件的库,它主要是用来在已有的 C++代码的基础上做扩展,它的语法和目标非常像Boost.Python,但

浅析Java、C/C++、JavaScript、PHP、Python分别用来开发什么?

首先,我们先普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如编写一篇文章,下载一首MP3等,而计算机干活的CPU只认识机器的指令,所以,尽管不同的编程语言差异极大,最后都得"翻译"成CPU可以执行的机器指令.理论上任何语言干任何事情几乎都可以, 但是主要干什么那就不一样了. 01.Java java常常跟"企业"联系在一起, 因为具备一些很好的语言特性, 以及丰富的框架, 在企业应用中最被青睐, 你总可以听到关于J2EE,JSP,Hi

python调用c++ ctype list传数组或者返回数组的方法

示例1: pycallclass.cpp: #include <iostream> using namespace std; typedef unsigned char BYTE; #define MAX_COUNT 20 struct tagOutCardResult_py { BYTE cbCardCount; BYTE cbResultCard1; BYTE cbResultCard2; BYTE cbResultCard3; BYTE cbResultCard4; BYTE cbRes

python调用java模块SmartXLS和jpype修改excel文件的方法

本文实例讲述了python调用java模块SmartXLS和jpype修改excel文件的方法.分享给大家供大家参考.具体实现方法如下: # -*- coding: utf8 -*- """ 使用java的模块SmartXLS和jpype修改excel 和xlrd,xlwt不同的是它可以生成和保持图表 """ from __future__ import print_function, division import os import jpyp

Java调用shell脚本解决传参和权限问题的方法

1. java 执行shell java 通过 Runtime.getRuntime().exec() 方法执行 shell 的命令或 脚本,exec()方法的参数可以是脚本的路径也可以是直接的 shell命令 代码如下(此代码是存在问题的.完整代码请看2): /** * 执行shell * @param execCmd 使用命令 或 脚本标志位 * @param para 传入参数 */ private static void execShell(boolean execCmd, String

python调用c++传递数组的实例

如下所示: INPUT = c_int * 4 # 实例化一个长度为2的整型数组 input = INPUT() # 为数组赋值(input这个数组是不支持迭代的) input[0] = 11 input[1] = 2 input[2] = 3 input[3] = 4 dll.teststring.restype = c_char_p # bytes(aaaa, encoding="utf-8") a = dll.teststring(input,4) MYLIBDLL char*

Python调用scp向服务器上传文件示例

最近做的项目中有一个小功能:在python中调用scp命令 使用ssh登录,然后将指定目录中的图片上传到服务器指定目录 网上搜了很多方法都没用,最后终于碰到一个可以成功上传的,特此记录 import paramiko # 用于调用scp命令 from scp import SCPClient # 将指定目录的图片文件上传到服务器指定目录 # remote_path远程服务器目录 # file_path本地文件夹路径 # img_name是file_path本地文件夹路径下面的文件名称 def u

Python调用C语言的方法【基于ctypes模块】

本文实例讲述了Python调用C语言的方法.分享给大家供大家参考,具体如下: Python中的ctypes模块可能是Python调用C方法中最简单的一种.ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改.也正是如此奠定了这种方法的简单性. 示例如下 实现两数求和的C代码,保存为add.c //sample C file to add 2 numbers - int and floats #include <stdio.h> int add

python调用动态链接库的基本过程详解

动态链接库在Windows中为.dll文件,在linux中为.so文件.以linux平台为例说明python调用.so文件的使用方法. 本例中默认读者已经掌握动态链接库的生成方法,如果不太清楚的可以参考动态链接库的使用 调用上例动态链接库的使用中的sum.so import ctypes so = ctypes.CDLL('./sum.so') print "so.sum(50) = %d" % so.sum(50) so.display("hello world!"

Python调用C语言的实现

Python中的ctypes模块可能是Python调用C方法中最简单的一种.ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改.也正是如此奠定了这种方法的简单性. 示例如下 实现两数求和的C代码,保存为add.c //sample C file to add 2 numbers - int and floats #include <stdio.h> int add_int(int, int); float add_float(float,

对Python中数组的几种使用方法总结

二维数组的初始化 matirx_done = [[0 for i in range(0, len(matirx))]for j in range(0, len(matirx[0]))] 就将其初始化为一个与matrix相同大小的元素全为 0 的矩阵 数组的多级排序 在数组 idea_collect = [[3, 1, 2], [3, 2, 1], [3, 2, 2], [3, 1, 1]] 中, 先按照第二项排列, 再按照第三项倒序排列 可写为: idea_collect.sort(key=la

python调用pyaudio使用麦克风录制wav声音文件的教程

python的pyaudio可以进行录音,播放,生成wav文件等等,WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为WAV,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种.在我们研究语音识别,自然语言处理的过程中,常常会使用到它,比如我们调用百度语音识别所以我们首先研究一下pyaudio库的安装与使用. 安装: pip install pyaudio 调用pyaudio使用麦克风录制声音: python中的pyaudio库可以直接通过麦克风录制声音,我们可以通过调用该库,