每个人都能学的Python(03)-变量和类型

变量的定义

上次我们简单说明了变量的含义,还提到了x'x'不同之处,带引号的是字符串,不带引号的是一个你自己定义的标识符,表示一个对象的名称。这里,x是一个“变量”名。

变量可以存储各种各样的东西,可以存储字符串,也可以存储数字等很多种类的对象,编程语言最强大的功能之一是操纵变量的能力。


我们现在打开Python交互环境,尝试用print函数输出一个变量:

$ python
Python 3.7.1 (default, Nov  6 2018, 18:45:35) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> 

显然,这里出问题了。在输出的最后一行Python解释器给出了提示:NameError: name 'x' is not defined 。这里是说出现了一个名称错误,x没有被定义。这是因为你想用x作为你自己定义的一个变量名,可是你又没告诉python这个x是个什么东西,解释器迷惑不解。

在python中“变量”需要被定义,也就是definde后才能使用,定义后解释器才会根据变量的类型在内存中开辟一块合适大小的地方来存放它,你提供的变量名就成为这块地方的一个标识符,拿出这个名字就代表你要使用这块内存了。根据不同的值类型需要不同的内存大小,所以变量需要区分类型才能精确的分配内存。

说到这里你可能觉得在python里定义一个变量是一个很麻烦的事情,其实非常简单,我们在第一节课就说过python是一种动态类型的语言,所谓动态类型就是:你不需要用一句话来告诉解释器你要用的这个变量是什么类型,确定一个变量的类型是在第一次给它赋值的时候。这样就简单很多啦,下面我们来试试利用上次我们说到的赋值操作符=来给变量一个值,然后看看它们被定义成了什么类型:

>>> message = 'hello world!'
>>> x = 256
>>> pi = 3.1415926

我们可以用内置函数type()来观察一下这些变量被定义成了什么类型:

>>> type(message)
<class 'str'>
>>> type(x)
<class 'int'>
>>> type(pi)
<class 'float'>

根据输出的内容我们知道这三个类型分别是:

  • message:str,字符串类型
  • x:int,整数类型
  • pi:float,浮点数类型

细心的朋友肯定发现了在type输出信息里都有个单词class(类的意思),这里表示它输出的这些strintfloat都是一个对象,举个对照现实中例子就很容易理解了,我们所说的人类就是一个现实世界的“类”,你,我,他,我们每个人都是人类的一个个“实例”对象,我们共有人类的一些基本特性,双足行走,杂食性,胎生等等。同样在python世界也有很多“类”,这里message就是str类的一个实例。这种特性就是我们说过的,python是一门面向对象的编程语言,其实在python中所有的东西都是对象,都有他们自己的类。关于面向对象的话题在后面章节还会详细叙述,这里只要了解一下概念即可。

变量的名称

变量的命名比较自由,但也是需要遵循一些规则的:

  1. 不能使用保留字,在python3.7中一共有35个
1 2 3 4 5
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 yiel
  1. 只能由字母、下划线和数字组成,而不能使用空格、连字符、标点符号、引号或其他字符
  2. 不能以数字开头
  3. 变量名区分大小写
>>> 7day = 'week'
  File "<stdin>", line 1
    7day = 'week'
       ^
SyntaxError: invalid syntax
>>> mail@ = '123@qq.com'
  File "<stdin>", line 1
    mail@ = '123@qq.com'
          ^
SyntaxError: invalid syntax
>>> class = 'human'
  File "<stdin>", line 1
    class = 'human'
          ^
SyntaxError: invalid syntax

思考下上面定义变量时为什么出现各种错误。

获得用户输入的变量

我们之前获得的变量都是在程序中直接赋值的:pi = 3.14,如果我们需要在程序运行的时候动态的获得用户输入的变量怎么办呢,我们可以使用input()函数,这个函数既可以把括号中的参数作为显示提示,还可以让程序暂停,等待获得用户的输入来给变量赋值。
还记得我们第一次计算圆形面积的程序吗?我们来改造一下用来获取用户输入。在文本编辑器里编辑area.py:

r = input('请输入半径长度:')
pi = 3.14
area = pi * r**2
print('面积为{}'.format(area))

这里的半径r不再是一个固定值,而是一个函数input()处理后的结果,这里的结果就是用户在命令行输入的数字,在提示文字后输入然后按回车后r就得到了输入的值。我们来运行一下。

$ python area.py
请输入半径长度:10
Traceback (most recent call last):
  File "area.py", line 3, in <module>
    area = pi * r**2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

这里在输入半径10后按回车,出现了一个初学者常见的一种错误:类型错误,提示是说字符串类型不支持次方运算的操作。这是因为input函数把用户输入的值都作为字符串来赋值给变量,变量就被定义成了字符串类型,而字符串不能做次方运算,也不可以和数字类型一起做任何数学运算。这就是我们曾经提到的,python是一种强类型语言。
显然这里需要先把输入的字符串转成数字,然后再参与运算。我们需要再增加一步操作,利用int()函数强制转换类型。int函数把括号中的字符串转换为整型数字。

注意
int函数的参数需要是可以转为整数型的字符串才能正常工作,如果是'123 321'或是'hello‘这种给int函数处理就会引起一个值错误。

继续修改我们的程序:

str_r = input('请输入半径长度:')
int_r = int(str_r)
pi = 3.14
area = pi * int_r**2
print('面积为{}'.format(area))

命令行执行:

$ python area.py
请输入半径长度:10
面积为314.0

练习

编写一个程序,提示用户输入摄氏温度,将温度转换为华氏温度,然后打印出转换后的温度。摄氏度转华氏度的公式是ºF = ℃ × 1.8 + 32。下一次课将会给出一个参考答案。

本系列尚未完成,将持续更新,请关注我的简书号。
最新STEM知识分享请关注STEM实验室 :www.steamlab.club

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335