数据类型
一个程序要运行,就要先描述其算法。描述一个算法应先说明算法中要用的数据,数据以变量或常量的形式来描述。每个变量或常量都有数据类型。Python的基本数据类型有5种: 整型(int), 浮点型(float), 字符型(string), 布尔型(bool),空值(None).
整数
Python可处理任意大小的整数,在程序中的表示方法和数学上的写法完全一样。
浮点数
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是相等的。浮点数可以用数学写法,如1.23
,3.14
,-9.01
,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9
,或者12.3e8
,0.000012可以写成1.2e-5
,等等。
整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。
字符串(后面一章我们详细讲字符串的内置方法)
字符串是以‘‘或""括起来的任意文本,比如‘abc‘
,"xyz"
等等。请注意,‘‘或""本身只是一种表示方式,不是字符串的一部分,因此,字符串‘abc‘
只有a
,b
,c
这3个字符。如果‘
本身也是一个字符,那就可以用""括起来,比如"I‘m OK"
包含的字符是I
,‘
,m
,空格,O
,K
这6个字符。
如果字符串内部既包含‘
又包含"
怎么办?可以用转义字符\
来标识,比如:
‘I\‘m \"OK\"!‘
表示的字符串内容是:
I‘m "OK"!
转义字符\
可以转义很多字符,比如\n
表示换行,\t
表示制表符,字符\
本身也要转义,所以\\
表示的字符就是\
,可以在Python的交互式命令行用print打印字符串看看:
>>> print ‘I\‘m ok.‘ I‘m ok. >>> print ‘I\‘m learning\nPython.‘ I‘m learning Python. >>> print ‘\\\n\\‘ \ \
如果字符串里面有很多字符都需要转义,就需要加很多\
,为了简化,Python还允许用r‘‘
表示‘‘
内部的字符串默认不转义,可以自己试试:
>>> print ‘\\\t\\‘ \ \ >>> print r‘\\\t\\‘ \\\t\\
如果字符串内部有很多换行,用\n
写在一行里不好阅读,为了简化,Python允许用‘‘‘...‘‘‘
的格式表示多行内容,可以自己试试:
>>> print ‘‘‘line1 ... line2 ... line3‘‘‘ line1 line2 line3
上面是在交互式命令行内输入,如果写成程序,就是:
print ‘‘‘line1 line2 line3‘‘‘
多行字符串‘‘‘...‘‘‘
还可以在前面加上r
使用,请自行测试。
布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有True
、False
两种值,要么是True
,要么是False
,在Python中,可以直接用True
、False
表示布尔值(请注意大小写),也可以通过布尔运算计算出来:
>>> True True >>> False False >>> 3 > 2 True >>> 3 > 5 False
布尔值可以用and
、or
和not
运算。
and
运算是与运算,只有所有都为True
,and
运算结果才是True
:
>>> True and True True >>> True and False False >>> False and False False
or
运算是或运算,只要其中有一个为True
,or
运算结果就是True
:
>>> True or True True >>> True or False True >>> False or False False
not
运算是非运算,它是一个单目运算符,把True
变成False
,False
变成True
:
>>> not True False >>> not False True
布尔值经常用在条件判断中,比如:
if age >= 18: print ‘adult‘ else: print ‘teenager‘
空值
空值是Python里一个特殊的值,用None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。
此外,Python还提供了列表、字典等多种数据类型,还允许创建自定义数据类型,我们后面会继续讲到。<引用2>
变量和常量
在计算机中,变量就是用来在程序运行期间存储各种需要临时保存可以不断改变的数据的标识符,一个变量应该有一个名字,并且在内存中占据一定的存储单元,在该存储单元中存放变量的值。
变量命名规则
先介绍标识符的概念。和其他高级语言一样,用来标识变量、符号常量、函数、数组、类型等实体名字的有效字符序列称为标识符(identifier)。简单地说,标识符就是一个名字。变量名是标识符的一种,变量的名字必须遵循标识符的命名规则。
Python语言和java,c++等很多语言一样,规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。下面列出的是合法的标识符,也是合法的变量名:
sum, average, total, day, month, Student_name, tan, BASIC, li_ling
下面是不合法的标识符和变量名:
M.D.John, $442, #4, 3G64, Alex Li, C++, Zhang-ling,姓名, U.S.A.
注意:在Python中,大写字母和小写字母被认为是两个不同的字符。因此,sum和SUM是两个不同的变量名。一般地,变量名用小写字母表示,与人们日常习惯一致,以增加可读性。应注意变量名不能与Python的关键字、系统函数名和类名相同。
变量名命名习惯
当你的代码越写越多的时候,你会发现你定义的变量也会越来越多,为了增加代码的易读性和方便调试,给变量起名时一定要遵循一定的命名习惯,你起的变量名称最好能让人一眼就大概知道这个变量是干什么用的,比如,getUserName一看就知道,这个变量应该是要获取用户的姓名,check_current_conn_count代表是要检查现在的连接数,只有这样,别人才能在看你的代码时知道你的这些变量的作用,而如果你把变量名全起成了var1,var2,var3…..varN,那别人再看你的代码时会骂死你的。
变量名的定义在能表达清楚它的作用的前提下最越简洁越好,能用一个单词表述清楚的尽量就不要用两个。变量起名时一般有这么几种写法,你觉得哪种最简洁,你就选哪种吧。
CheckCurrentConnCount
check_current_conn_count
checkCurrentConnCount
不好的起名:
CHECKCURRENTCONNCOUNT
Var1 var2 var3 varN
Checkcurrentconncount
定义变量
了解了变量的概念和用途后,我们一起来定义几个简单的变量看一下
name = ‘Alex Li’ #name 是字符串,字符串要加上引号噢
age = 29 #age 是整数,整数不要加引号,加了引号后就变成字符串了
has_girlfriend = False #是布尔值,一般用这个做逻辑判断,如if has_girlfriend:print ‘good for you !’
age = age + 1 #这个结果应该是30,运算流程是先将=号后面的age +1结果算出,然后再把这个结果重赋值给age, 由于age之前的值是29,重新赋值后,age值变为30.
最后,理解变量在计算机内存中的表示也非常重要。当我们写:
name = ‘Alex‘
时,Python解释器干了两件事情:
- 在内存中创建一个”Alex”的字符串;
- 在内存中创建了一个名为name的变量,并把它指向”Alex”的内存地址。
也可以变量name赋值给另一个变量name2,这个操作实际上是把变量name2指向的数据,例如:
唉?不是已经把name2 等于name变量了吗?name 值改了以后,name2不跟着改吗?没错,当name 的值由”Alex”改成”Jack”后,name2还是指向原来的”Alex”,我们来一步步分析一下:
1. 定义name=”Alex”,解释器创建了字符串”Alex”和变量name,并把name指向了”Alex”
2. 执行name2=name,解释器创建了name2变量,并把name2指向了name变量所指向的字符串
3. 这时通过id内置函数来查看一下这两个变量分别指向的内存地址,结果都是指向了同一地址。
4. 执行name=”Jack”,解释器创建一个新的变量”Jack”,并把name的指向改成了”Jack”
5. 此时再查看两个变量的内存地址指向就会发现,name的指向已经变成了一个新的地址,也就是”Jack”所在内存地址,但是name2依然还是指向原来的”Alex”。
Now, 你明白了吗? 再总结一下,当你把一个变量name赋值给另一个变量name2时,解释器只是把name变量所指向的内存地址赋值给了name2,因此name 和 name2并未发生直接的关联,只不过是他们都同时指向了同一个内存地址而已,这也就是为什么你把name再指向一个新地址后,而name2的值还保持不变的原因。
常量
刚才说到了变量,还有一概念就是常量,所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:
PI = 3.14159265359但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量PI的值,也没人能拦住你。