变量的定义
上次我们简单说明了变量的含义,还提到了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(类的意思)
,这里表示它输出的这些str
,int
,float
都是一个类
对象,举个对照现实中例子就很容易理解了,我们所说的人类
就是一个现实世界的“类”,你,我,他,我们每个人都是人类的一个个“实例”对象,我们共有人类的一些基本特性,双足行走,杂食性,胎生等等。同样在python世界也有很多“类”,这里message
就是str
类的一个实例。这种特性就是我们说过的,python是一门面向对象
的编程语言,其实在python中所有的东西都是对象,都有他们自己的类。关于面向对象的话题在后面章节还会详细叙述,这里只要了解一下概念即可。
变量的名称
变量的命名比较自由,但也是需要遵循一些规则的:
- 不能使用保留字,在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 |
- 只能由字母、下划线和数字组成,而不能使用空格、连字符、标点符号、引号或其他字符
- 不能以数字开头
- 变量名区分大小写
>>> 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
网友评论