浮点数赋值给整数_初学者专题:变量和赋值

ace8d30d8a71ca2a125333d713795439.gif

作者:老齐

对于初学Python者,除了看书(《跟老齐学Python:轻松入门》或者《Python大学实用教程》,均为电子工业出版社出版)、或者看视频(网易云课堂、CSDN上均有老齐的视频课程),还要进行专题性总结。比如本文,就是要帮助学习者,对变量赋值这两个非常基本、几乎无处不在的内容作为一个专题进行总结。

d7986f59477bc21f6d9d76ca17a17087.png

对象

Python语言既能够实现面向过程,也能够实现面向对象编程。而面向对象,是当前软件开发的主流编程思想。在我的两本书中,我都强调了面向对象——不要认为这种编程思想不适用于初学者,更不要认为它有多难。

并且,Python语言中已经有这样一个明确的概念:万物皆对象,不论是数字、整数、函数、类,等等,都是对象。

Python语言中的对象,可以理解为语言中的“实际物体”,它一经创建,存储器中就开辟出一个空间保存它,因而也就有了一个内存地址。

比如:

>>> id(3.14)
4312572400

这里返回的十进制数字,就代表了存储器为浮点数对象3.14分配的内存地址。

另外,Python中的任何对象都有类型。在Python中,类型就是类。在Python创立之初,这两个没有统一,后来将“类”和“类型”统一了起来,这样我们就可以把每一个具体的数据,看成是某个“类”的实例,而那个“类”就是这个实例的“类型”。

比如:

>>> type(3.14)

返回值显示,3.14float类的实例,也就是float类型。

下面自定义一个类,然后创建实例,再看看那个实例的类型:

>>> class Book:
... book = "跟老齐学Python:轻松入门"
...
>>> my_book = Book()
>>> type(my_book)

除了返回的类的具体内容不同之外,Book()(注意,这是对象,my_book引用了这个对象,所以,也可以说是my_book,对此的详细说明请阅读本文后续内容)和3.14都是所对应类的实例——返回值格式相同,因此它们也都是所对应类的那种“类型”。

变量

在Python中使用变量,非常方便,可以用“召之即来挥之即去”形容,也就是不需要“创建”变量,用的时候信手拈来。

>>> int a
File "", line 1
int a
^
SyntaxError: invalid syntax

在有些语言里面,比如Java,要使用某个变量,必须先创建它。但是,如果把这个习惯搬到Python中,就如同上面操作那样,会报错。另外,还要注意,Python中的变量不是对象,它不能单独存在。

>>> a
Traceback (most recent call last):
File "", line 1, in
NameError: name 'a' is not defined

上面的演示,就是想用一个变量a,但是,只是把它单独放在那里,就如同在数学上,“假设变量a”,这样做是不行的。在Python中,变量必须和某个对象关联起来。

>>> a = 2
>>> id(a)
4308314816
>>> id(2)
4308314816

在上面的示例中,a=2就是将变量a与对象2关联了起来。注意,这里的变量a不是像容器那样,将对象2放入其中,而是如同标签那样,贴到了对象2上,于是乎通过这个标签就可以找到那个对象。

id(a)并不是返回变量a的内存地址——它不是对象,而是返回了它所引用的对象2的内存地址。再参考后面的id(2),可以看到两者内存地址一样,也就是说证明了a这个变量引用的对象就是2

但是,如果在交互模式中,做下面的操作,就令人匪夷所思了。

>>> a = 1.23
>>> id(1.23)
4312572400
>>> id(a)
4311689008

按照前面的说法,这个怎么解释?!

再解释这个之前,先来看下面的操作。

创建一个文件,比如命名为idvalue.py,然后在文件中写入如下代码:

#coding:utf-8

a = 1.23
id_value1 = id(a)
id_value2 = id(1.23)

print(f"id(a): {id_value1}")
print(f"id(1.23): {id_value2}")

if id_value1 == id_value2:
print("id() 返回值相同")

这段程序,跟前面交互模式里面的一样。但是,请注意接下来的事情。保存文件之后,执行它。

% python3 idvalue.py
id(a): 4327795888
id(1.23): 4327795888
id() 返回值相同

看执行结果。这里得到的a1.23的内存地址居然是一样的。

ce140fb7f07ef03d836b4c496b58fd88.png

神奇吗?

要解释这种神奇,话就有点长了,要从交互模式的特点开始说起。交互模式,是我们学习和做简单练习的好地方,但是,它有一个缺点,“记忆力太差”,每一行执行完毕,就会将该行“忘记”,下一行又从头开始。当执行了a = 1.23之后,本来内存中已经创建了1.23这个对象,但是,当再次执行id(1.23)时,因为两个不完全一样,交互模式的解析器忘记了前面的1.23,于是乎又在存储器中重新创建了id(1.23)中的1.23对象。

可为什么a = 2不如此呢?因为Python还有一个习惯,把-256~256这些整数,在内存中有“常住户口”。

>>> b = 256
>>> id(b)
4308322944
>>> id(256)
4308322944
>>>
>>> c = 257
>>> id(c)
4312572688
>>> id(257)
4312572624

但是,如果在一个程序文件里,Python解析器的“记忆力”就正常了,不会重复创建同样的对象——当然,如拷贝等有意为之的除外。

至此,我们已经明确,Python中的变量和对象之间是引用关系,正式因为这种引用关系,让Python中实现某些操作就非常容易了。

>>> first = 1
>>> second = 2
>>> first, second = second, first
>>> first
2
>>> second
1

在这个示例中,变量first引用了1second引用了2,如果想把这两个变量引用的对象对调一下,在Python里面使用first, second = second, first。这是多么简单、优雅、直接呀。如果在Java里面,就麻烦了——学过C/C++/Java等语言的同学,试一试吧。

由此,我们可以放胆说:Python简单、优雅

还是因为“引用”,一个对象可以被多个变量引用,就相当于一个物体上可以贴多个标签那样。

>>> a = b = 3.14
>>> a
3.14
>>> b
3.14

“变量引用对象”这个思想,还可以扩展到函数的参数。有的人习惯把函数的参数弄很多名称,比如形参、实参等,并且进行区分。在Python语言中,它们本质上都是变量,只不过是在函数作用于里面使用的变量。当定义函数的时候,虽然那个变量也没有引用对象,但因为是定义函数,这个函数并没有执行,所以,一个没有引用对象的变量是许可存在的。

>>> book = ['python',]
>>> def my_book(b):
... b.append("feature engineering")
... return b
...
>>> my_book(book)
['python', 'feature engineering']
>>> book
['python', 'feature engineering']

上面代码中,第1行创建了一个列表。第2行开始,创建了一个函数,参数是b——这时候称为“形参”,即形式上的参数。其实,因为这个函数并没有调用,所以,那个变量b可以认为是占位符,可以单独存在,不需要引用任何对象。

后面,调用这个函数my_book(book)。这里我们通常形象而简要地说:“将boo传给函数”。这句话其实不是很严谨,但它因为形象简短,所以被广为使用。如果严谨地说——未免啰嗦了,调用这个函数后,发生的是:b引用了变量book所引用的对象['python',]

从后面的执行结果中可以看出,因为函数内和函数外,不同变量引用的对象都是同一个,所以,会发生同样的变化。

对于变量,最后要强调的就是命名习惯:

  • 非数字开头
  • 字母都小写
  • 用有意的单词或者单词组合,多个单词之间用_连接
  • 避免使用与下列项目冲突的单词:内置类型、内置函数、关键词

以下是列出Python关键词的方法:

>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

或者:

>>> help("keywords")
Here is a list of the Python keywords. Enter any keyword to get more help.

False class from or
None continue global pass
True def if raise
and del import return
as elif in try
assert else is while
async except lambda with
await finally nonlocal yield
break for not

有一种常见情况,如下所示:

>>> list = [1,2,3]
>>> list("laoqi")
Traceback (most recent call last):
File "", line 1, in
TypeError: 'list' object is not callable

这就是因为本来的内置对象类型list,或者内置函数的名称,已经被>>> list = [1,2,3]占用了,后面再使用list,指的就是这个列表。所以,第二行的操作中会报错。

1c18e1183347258b56f8ca6ab8915d7e.png

赋值

在理解变量和对象关系的基础上,理解“赋值”或“赋值语句”就简单多了,从本质上讲,赋值就是变量与某对象建立引用关系,只不过,这里不是如前面所说的某个直接的对象,这里的对象可能是经过计算之后得到的,所以,先要知道“表达式”。

所谓表达式,就是对象间用操作符连接,组成一个有意义的式子。

>>> 1 + 2
3
>>> "python" + "lang"
'pythonlang'

以上演示的都是表达式,一般而言,表达式要返回一个对象。如果将这个对象再被变量引用,就成为了“赋值”。

>>> py = "python" + "lang"
>>> py
'pythonlang'

当然,前面出现的诸如a = 2也都是赋值语句。

在赋值语句中,=的作用于数学中的等号有很大区别,它表示将变量与对象之间建立引用关系。

>>> n = 1
>>> n = n + 1
>>> n
2

对于表达式n = n + 1,这里的=如果是数学中的意义,那么就会出现0=1

对于n = n + 1这种操作,还可以写成:

>>> n += 1
>>> n
3

这种写法称为自增,同样,减、乘、除也都有类似的操作。

对于赋值,必须要说明的是Python3.8中新增的功能:海象运算符

>>> n = len('python')
>>> if n < 10:
... print(f"the word length is: {n}")
...
the word length is: 6

在第二行开始的条件语句中,要使用n,必须要要在前面通过赋值语句获得。Python3.8的海象赋值运算符,把上面的赋值那一行和第二行融合起来,让代码更简洁。

>>> if (i := len('python')) < 10:
... print(f"the word length is: {n}")
...
the word length is: 6

关于海象运算符,本微信公众号有专门文章阐述,请参阅:《Python3.8新语法:海象运算符》

最后,要强调的是,Python中函数、类也都是对象,它们同样能够用于赋值语句。

>>> lam = lambda x: x+3
>>> lam(4)
7
>>> q = lam
>>> q(4)
7

第一行创建了一个lambda函数,这个函数对象用变量lam引用,也是赋值。注意第三行,只有名称才引用对象,如果是lam(),是试图要执行lam引用的对象,所以,q = lam才是赋值,或者说变量q也引用了这个lambda函数。

本文对变量和赋值做了专题总结,供初学者复习,以便加深对相关知识的理解。


专注于软件和AI的公众号

老齐教室

6d0ec7cf4ad3bffde7959f77899aa5f4.png

觉得好看,就点这里???

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分析android动画模块[转]

2019独角兽企业重金招聘Python工程师标准>>> 作者: 刘鹏 日期: 2009-03-07 Android 平台提供了两类动画&#xff0c;一类是 Tween 动画&#xff0c;即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果&#xff1b;第二类是 Frame 动画&#xff0c;即…

当你的手被502粘住了要怎么做?

1 看清楚&#xff0c;这是大裤衩子▼这才是 jk 裙▼2 天天看你们骂海王男友其实我有一个河神男友▼3 当你的手被502粘住了怎么办&#xff1f;▼4 不能指望食堂阿姨了自己动手丰衣足食▼5 当你被别人夸奖时▼6 宅在家里也能拍大片▼7 是我本人没错了▼你点的每个赞&#…

excel 如何替换带上标的文字_如何在Excel中批量提取中文汉字和英文字母

1. 在数据源的右边分别命名新的两列为“中文名”和“英文名”&#xff0c;然后将数据源复制到“中文名”这一列。2. 为了确保英文名字可以连在一起&#xff0c;这里我们在有空格的英文名字中间添加一个“-”。选择“中文名”下所有数据源&#xff0c;按CtrlF&#xff0c;点击“…

国内最大.NET平台重金招募中 你竟然还不知道?

各位路过的捎带眼瞅见的不小心翻到的英雄好汉请留步~让小编来带你康康这个胆敢号称国内最大的.NET的平台到底有何惊人之处一难道是因为它有--“最敢”的生态开放平台技术驱动商业创新&#xff0c;数字引领企业的未来&#xff0c;明源云通过多年专业积累&#xff0c;融合多种创新…

GChemPaint-绘制化学分子布局

Toy Posted in AppsRSSTrackbackGChemPaint 是专门用来绘制 2D 的化学分子布局软件&#xff0c;它合用于 GNOME 桌面。经由历程它所绘制的化学分子布局可以被嵌入到其他的应用程序中。Download GChemPaint 0.7.91版权声明&#xff1a; 原创作品&#xff0c;允许转载&#xff0c…

软件开发有哪些规范和标准_深圳APP软件开发的流程是什么?

深圳APP软件开发的流程是什么&#xff1f;APP软件开发是根据用户需求构建软件系统或设备的软件部分的过程&#xff0c;是一项系统工程&#xff0c;包括需求捕获&#xff0c;需求分析&#xff0c;系统设计&#xff0c;系统实现和系统测试。APP软件通常以某种编程语言实现&#x…

第十六周项目3-有相同数字?

输入两个数组中要存放的元素个数及元素值&#xff08;不超过50个&#xff09;&#xff0c;判断这两个数组中是否有相同的数字。 当两组数中有相同数字时&#xff0c;输出YES&#xff0c;否则&#xff0c;输出NO /* * Copyright (c) 2014,烟台大学计算机学院 * All right reserv…

一键对频对讲机好吗_对讲机的基础知识你都知道多少呢?

对讲机或PMR是手持式便携式无线电&#xff0c;可在单个共享频带上使用无线电波进行无线通信。这使Walkie Talkies成为以低成本与大范围人群保持联系的最有效方法之一。双向无线电功能强大&#xff0c;易于使用且易于使用。它们特别适合在户外或在手机或平板电脑过于精致或超出信…

女儿学会走路了,是不是该教她学Python了?

1 哈哈哈&#xff0c;20个人其实都是精准客户▼2 搬沙发一定不要穿的太正式&#xff01;▼3 横竖都是死让我先打完这场游戏先▼4 只要你学会这支舞你就是你妈的好朋友▼5 你能体会到这只阿拉斯加的惆怅吗&#xff1f;▼6 这双鞋一看就是全球限量有钱都买不到的那种▼7 我…

html游戏怎么做,HTML5 制做“游戏”的一个基本流程

怎样用HTML5 Canvas制作一个简单的游戏为了让大家清楚HTML5制作游戏的简单流程&#xff0c;所以先了制作一个非常简单的游戏&#xff0c;来看一看这个过程。游戏非常简单&#xff0c;无非就是英雄抓住怪物就得分&#xff0c;然后游戏重新开始&#xff0c;怪物出现在地图的随机位…

.NET 6 的 docker 镜像可以有多小

.NET 6 的 docker 镜像可以有多小?Intro最近写了一个小玩具&#xff0c;一个命令行调用 HTTP API 的工具&#xff0c;介绍可以参考&#xff1a;动手造轮子 —— dotnet-HTTPie&#xff0c;最近在使用 System.CommandLine 重构的同时&#xff0c;也在尝试减少 docker 镜像的大小…

开源播放器 Banshee 发布 1.0 beta 2

Banshee也是个很是不错的开源播放器,同时也是SuSE的内置播放器,默许支持靠山播放,消息区域告诉,可以快速跳过以后曲目,评分等等,也支持全局热键,媒体库支持音频和视频.新版本提供了对网络视频和PodCast的优秀支持.SuSE/Ubuntu/Fedora Linux用户可以从源中直接安置,也可以下载安…

仓库每天的账怎样做_新年第一站,济南:仓储匠人仓库问题解决与实战力培训...

【时间地点】1月15-16日&#xff0c;济南站济南市天桥区无影山北路88号祥云酒店5楼(师范路西口)【报名方式】直接加微信号“taishan33976”&#xff0c;注明姓名公司名仓储匠人。如果您认识小编的任意一位同事&#xff0c;欢迎直接找他们报名。【培训价格】1960元/人&#xff0…

一对一指导怎么追喜欢的男生

1 它们是怎样达成平衡的2 OK. 对不起打扰了3 今天也要加油鸭&#xff01;4 以色列一个父亲&#xff0c;为她“坐没坐相”的女儿打造的椅子。5 这个床我爱了6 静冈花火大会上摄影师发现了一个有趣的角度7 怎么样学会了吗内容自奔现翻车现场你点的每个赞&#xff0c;我都认真当成…

android canvas_Android 如何实现气泡选择动画

作者&#xff1a;Irina Galata Android 开发者: Yulia Serbenenko UI/UX 设计师 译者&#xff1a;skyar2009链接&#xff1a;https://juejin.im/post/58e5ec838d6d8100616d82e2/跨平台用户体验统一正处于增长趋势&#xff1a;早些时候 iOS 和安卓有着不同的体验&#xff0c;但是…

MVC中的验证规则

前面的博客中曾经提到过ModelBing机制&#xff0c;也在Demo中体现过&#xff0c;在MVC中更吊的是封装了自定义的验证规则。下面来一个Demo来展现一下&#xff0c;看了后&#xff0c;你一定会爱上它的&#xff0c;能让你少写很多JS语句。 1.View层 [html] view plaincopyprint…

网络——在网络上发送,接收数据

问题 创建并加入一个网络会话是一回事&#xff0c;但如果不能发送或接收任何数据那么网络会话有什么用呢&#xff1f; 解决方案 当玩家连接到会话时&#xff0c;你可以在一个PacketWriter流中存储所有想要发送的数据。完成这个操作后&#xff0c;你可以使用LocalNetworkPlayer.…

微服务之 EShop on dapr概览

????欢迎点赞 &#xff1a;???? 收藏 ⭐留言 ???? 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;????本文作者&#xff1a;由webmote 原创&#xff0c;首发于 【掘金】????作者格言&#xff1a;生活在于折腾&#xff0c;当你不折…

苹果android 对比,苹果安卓旗舰差距有多少?看了这份对比,果粉傻眼了

最近&#xff0c;身边不少小伙伴都在换机&#xff0c;有的换了最新的 iPhone 12 系列&#xff0c;有的则是换成安卓旗舰&#xff0c;毕竟现在的安卓旗舰与 iPhone 之间的体验已经十分接近&#xff0c;甚至在一些方面安卓旗舰还有着不小的优势。下面&#xff0c;我们以最新的 iP…

python画画用哪库好_Python我要学画画-turtle库

上帝说&#xff1a;“要有光&#xff01;” 于是&#xff0c;就有了光。 ---《圣经》旧约创世纪篇 我要学画画&#xff0c;Python便有了turtle库。 turtle库是一个点线面的简单图像库。画布中心为坐标系原点&#xff0c;小海龟起始位置就在原点方向向右。turtle界面 Python与库…