Python--变量和简单数据类型
Python--变量和简单数据类型
一、Python脚本运行过程
运行hello_world.py时,即便是运行简单的程序,Python所做的工作也非常多。
运行文件hello_world.py时,末尾的.py指出这是一个Python程序,因此编辑器将使用Python解释器来运行它。Python解释器读取整个程序,确定其中每个单词的含义。例如,看到后面跟着圆括号的单词print时,解释器就将圆括号中的内容打印到屏幕。
编写程序时,编辑器会以各种方式突出程序的不同部分。例如,它知道print()是一个函数的名称,因此将其显示为某种颜色;它知道"Hello Python World!"不是Python代码,因此将其显示为另一种颜色。这种功能叫做语法高亮,对于刚开始学习编程来说很有帮助。
二、变量
下面来尝试在hello_world.py中使用一个变量。在这个文件开头添加一行代码,并对第二行代码进行修改,如下所示:
我们添加了一个名为message的变量。每个变量都指向一个值——与该变量相关联的信息。在这里,指向的值为文本"Hello Python World!"。
添加变量导致Python解释器需要做更多工作。处理第一行代码时,它将变量message与文本"Hello Python World!"关联起来;处理第二行代码时,它将与变量message关联的值打印到屏幕。
下面来进一步扩展这个程序:修改hello_world.py,使其再打印一条消息。为此,在hello_world.py中添加一个空行,再添加下面两行代码:
在这个程序中可随时修改变量的值,而Python将始终记录变量的最新值。
1. 变量的命名和使用
在Python中使用变量时,需要遵守一些规则和指南。违反这些规则将引发错误,而指南旨在让你编写的代码更容易阅读和理解。请务必牢记下述有关变量的规则。
● 变量名只能包含字母、数字和下划线。变量名能以字母或下划线打头,但不能以数字打头。例如,可将变量命名为message_1,但不能将其命名为1_message。
● 变量名不能包含空格,但能使用下划线来分割其中的单词。例如,变量名test_message可行,但变量名test message会引发错误。
● 不要将Python关键字和函数名用作变量名,即不要使用Python保留用于特殊用途的单词,如print。
● 变量名应既剪短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好。
● 慎用小写字母l和大写字母O,因为他们可能被人错看成1和0。
要创建良好的变量名,需要经过一定的实践,在程序复杂而有趣时有其如此。随着编写的程序越来越多,并开始阅读别人编写的代码,你将越来越善于创建有意义的变量名。
注意:就目前而言,应使用小写的Python变量名。虽然在变量名中使用大写字母不会导致错误,但是大写字母在变量名中有特殊含义。
2. Python关键字和内置函数
Python包含一系列关键字和内置函数,给变量命名时,知道这些关键字和内置函数很重要:不能将Python关键字用作变量名,也不应将Python内置函数的名称用作变量名,否则将覆盖相应的内置函数。
下面将列出Python关键字和内置函数的名称,应避免使用这个作为变量名。
2.1 Python关键字
下面的关键字都有特殊含义,如果将它们用作变量名,将引发错误:
False await else import pass
None break except in raise
True class finally is return
and continue for lambda try
as def from nonlocal while
assert del global not with
async elif if or yield
2.2 Python内置函数
将内置函数名用作变量名时,不会导致错误,但将覆盖这些函数的行为:
abs() delattr() hash() memoryview() set()
all() dict() help() min() setattr()
any() dir() hex() next() slice()
ascii() divmod() id() object() sorted()
bin() enukerate() input() oct() staticmethod()
bool() eval() int() open() str()
breakpoint() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() _import_()
complex() hasattr() max() round()
3. 使用变量时避免命名错误
程序员都会犯错,而且大多数程序员每天都会犯错。虽然优秀的程序员也会犯错,但他们也知道如何高效地消除错误。下面来看一种你可能犯的错误,并学习如何消除它。
我们将有意的编写一些引发错误的代码。
程序存在错误时,Python解释器将竭尽所能地帮助你找出问题所在。程序无法成功运行时,解释器将提供一个traceback。traceback是一条记录,指出了解释器尝试运行代码时在什么地方陷入了困境,下面是变量名拼写错误时,Python解释器提供的traceback。
解释器指出,文件hello_world.py的第二行存在错误(见①)。它列出了这行代码,旨在帮助你快速找出错误(见②),还指出了它发现的是什么样的错误(见③)。在这里,解释器发现了一个名称错误,并报告打印的变量masage未定义:Python无法识别你提供的变量名。名称错误通常意味着两种情况:要么是使用变量前忘记给它赋值,要么是输入变量名时拼写不正确。
在这个示例中,第二行的变量名message遗漏了字母s。Python解释器不会对代码做拼写检查,但要求变量名的拼写一致。例如,如果在代码的另一个地方也将message错误地拼写成了mesage,结果将如何呢?
编程语言要求严格,但并不关心拼写是否正确。因此,创建变量名和编写代码时,无需考虑英语中的拼写和语法规则。
很多变量错误都简单,只是在程序的某一行输错了一个字符。为找出这种错误而花费很长时间的大有人在。很多程序员天资聪颖、经验丰富,却为找出这种细微的错误而花费数小时。
4. 变量是标签
变量常被描述为可用于存储值的盒子。在你刚接触变量时,这种定义可能很有帮助,但它并没有准确描述Python内部表示变量的方式。一种好得多的定义是,变量是可以赋给值的标签,也可以说变量指向特定的值。
刚学习编程时,这种差别可能意义不大,但越早知道越好。迟早会遇到变量的行为出乎意料的情形,此时如果对变量的工作原理有准确的热恩师,将有助于搞清楚代码是如何运行的。
注意:要理解新的编程概念,最佳的方式是尝试在程序中使用它们。
三、字符串
大多数程序定义并收集某种数据,然后使用他们来做些有意义的事情。有鉴于此,对数据进行分类大有裨益。
字符串就是一系列字符。在Python中,用括号括起的都是字符串,其中的引号可以是单引号,也可以是双引号,如下所示:
1. 使用方法修改字符串的大小写
对于字符串,可执行的最简单的操作之一是修改其中单词的大小写。请看下面的代码:
在这个示例中,变量name指向小写的字符串"python test"。在函数调用print()中,方法title()出现在这个变量的后面。方法是Python可对数据执行的操作。在name.title()中,name后面的句点(.)让Python对变量name执行方法title()指定的操作。每个方法后面都跟着一对圆括号,这是因为方法通常需要额外的信息来完成其工作。这种信息是在圆括号内提供的。函数title()不需要额外的信息,因此它后面的圆括号是空的。
方法title()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。这很有用,因为你经常需要将名字视为信息。例如,你可能希望程序将值Python、PYTHON和python视为同一个名字,并将它们都显示为Python。
还有其他几个很有用的大小写处理方法。例如,要将字符串改为全部大写或全部小写,可以像下面这样做:
存储数据时,方法lower()很有用。很多时候,你无法依靠用户来提供正确的大小写,因此需要将字符串先转换为小写,再存储它们。以后需要显示这些信息时,再将其转换为最合适的大小写方式。
2. 在字符串中使用变量
在有些情况下,你可能想在字符串中使用变量的值。例如,你可能想使用两个变量分别表示名和姓,然后合并这两个值以显示姓名:
要在字符串中插入变量的值,可在前引号前加上字母f,再将要插入的变量放在花括号内。这样,当Python显示字符串时,将把每个变量都替换为其值。
这种字符串名为f字符串。f是format(设置格式)的简写,因为Python通过花括号内的变量替换为其值来设置字符串的格式。
使用f字符串可完成很多任务,如利用与变量关联的信息来创建完整的消息,如下所示:
在这里,一个问候用户的句子中使用了完整的姓名,并使用方法title()来将姓名设置为合适的格式。这些代码显示一条格式良好的简单问候语。
还可以使用f字符串来创建消息,再把整条消息赋给变量:
上述代码显示消息相同,但这条消息赋给了一个变量message,这让最后的函数调用print()变得简单得多。
注意:f字符串是Python3.6引入的。如果你使用的是Python3.5或更早的版本,需要使用format()方法,而非这种f语法。要使用方法format(),可在圆括号内列出要在字符串中使用的变量。对于每个变量,都通过一对花括号来引用。这样按顺序将这些花括号替换为圆括号内列出的值,如下所示:
3. 使用制表符或换行符来添加空白
在编程中,空白泛指任何非打印字符,如空格、制表符或换哈哪个服。你可以使用空白来组织输出,让用户阅读起来更容器。
要在字符串中添加制表符,可使用字符组合\t,如下述代码的①处所示:
要在字符串中添加换行符,可使用字符组合\n:
还可在同一个字符串中同时包含制表符和换行符。字符串“\n\t”让Python换行到下一行并在下一行开头添加一个制表符。下面的示例演示了如何使用一个但行字符串来生成四行输出:
4. 删除空白
在程序中,额外的空白可能令人疑惑。对程序员来说,'python'和'python '看起来几乎没什么两样,但对程序来说,它们却是两个不同的字符串。Python能够发现'python '中额外的空白,并认为它意义重大——除非你告诉它不是这样的。
空白很重要,因为你经常需要比较两个字符串是否相同。一个重要的示例是,在用户登录网站时检查其同户名。不过在非常简单的情形下,额外的空格也可能令人迷惑。所幸,在Python中删除用户输入数据中的多余空白易如反掌。
Python能够找出字符串开头和末尾多余的空白。要确保字符串末尾没有空白,可使用方法rstrip()。
与变量language相关联的字符串末尾有多余的空白。在终端会话中向Python询问这个变量的值时,可看到末尾的空格。对变量language调用方法rstrip()后,这个多余的空格被删除了。然而,这种删除只是暂时的,接下来再次询问language的值时,你会发现这个字符串与输入时一样,依然包含多余的空白。
要永久删除这个字符串中的空白,必须将删除操作的结果关联到变量
为删除这个字符串中的空白,要将其末尾的空白剔除,再将结果关联到原来的变量。在编程中,经常需要修改变量的值,再将新值关联到原来的变量。这就是变量的值可能随程序的运行或用户输入数据而发生变化的原因所在。
你还可以剔除字符串开头的空白,或者同时剔除字符串两边的空白。为此,可分别使用方法lstrip()和 strip():
在这个示例中,我们首先创建了一个开头和末尾都有空包的字符串。
接下来,分别删除末尾、开头和两边的空白。
尝试使用这些剥除函数有助于我们熟悉字符串操作。在实际程序中,这些剥除函数最常用于在存储用户输入前对其进行清理。
5. 使用字符串时避免语法错误
语法错误是一种你时不时会遇到的错误。程序中包含非法的Python代码时,就会导致语法错误。例如,在用单引号括起的字符串中,如果包含撇号,就将导致错误。这是因为这会导致Python将第一个单引号和撇号之间的内容视为一个字符串,进而将余下的文本视为Python代码,从而引发错误。
下面演示如何正确地使用单引号和双引号。
撇号位于两个双引号之间,因此Python解释器能够正确地理解这个字符串。
然而,如果使用单引号,Python将无法正确地确定字符串的结束位置:
从上述输出可知,错误发生在第二个单引号后面。这种语法错误表明,在解释器看来,其中的有些内容不是有效的Python代码。错误的原因各种各样,我将指出一些常见的原因。学习编写Python代码时,你可能会经常遇到语法错误。语法错误也是最不具体的错误类型,因此可能难以找出并修复。
注意:编写程序时,编辑器的语法高亮功能可帮助你快速找出某些语法错误。看到Python代码以普通句子的颜色显示,或者普通句子以Python代码的颜色显示时,就可能意味着文件中存在引号不匹配的情况。
四、数
在编程中,经常使用数来记录得分、表示可视化数据、存储Web应用信息,等等。Python能根据数的用法以不同的方式处理它们。鉴于整数使用起来最简单,下面就先来看看Python是如何管理它们的。
1. 整数
在Python中,可对整数执行加(+)减(-)乘(*)除(/)运算。
在终端会话中,Python直接返回运算结果。Python使用两个乘号表示乘方运算:
Python还支持运算次序,因此可在同一个表达式中使用多种运算。还可以使用园括号来修改运算次序,让Python按你指定的次序执行运算,如下所示:
在这些示例中,空格不影响Python计算表达式的方式。他们的存在旨在让你阅读代码时能迅速确定限制性哪些运算。
2. 浮点数
Python将所有带小数点的数称为浮点数。大多数编程语言使用了这个术语,它指出了这样一个事实:小数点可出现在数的任何位置。每种编程语言都必须细心设计,以妥善地处理浮点数,确保不管小数点出现在什么位置,数的行为都是正常的。
从很大程度上说,使用浮点数时无需考虑其行为。你只需输入要使用的数,Python通常会按你期望的方式处理它们:
但需要注意的是,结果包含的小数位数可能是不确定的:
所有语言都存在这种问题,没有什么可担心的。Python会尽力找到一种精确表示结果的方法,但鉴于计算机内部表示数的方式,在这有些情况下很难。就现在而言,暂时忽略多余的小数位数即可。
3. 整数和浮点数
将任意两个数相除时,结果总是浮点数,即便这两个数都是整数且能整除:
在其他任何运算中,如果一个操作数是整数,另一个操作数是浮点数,结果也总是浮点数:
无论是哪种运算,只要有操作数是浮点数,Python默认得到的总是浮点数,即便结果原本为整数也是如此。
4. 数中的下划线
书写很大的数时,可使用下划线将其中的数字分组,使其更清晰易读:
当我们打印这种使用下划线定义的数时,Python不会打印其中的下划线,这是因为存储这种数时,Python会忽略其中的下划线。将数字分组时,即便不是将每三位分成一组,也不会影响最终的值。在Python看来,1000与1_000没什么不同,1_000与10_00也没什么不同。这种表示法适用于整数和浮点数,但只有Python3.6和更高的版本支持。
5. 同时给多个变量赋值
可在一行代码中给多个变量赋值,这有助于缩短程序并提高其可读性。这种做法最常用于将一系列数赋给一组变量。
例如,下面演示了如何将变量x、y和z都初始化为零:
这样做时,需要用逗号将变量名分开;对于要赋给变量的值,也需同样处理。Python将按顺序将每个值赋给对应的变量。只要变量和值的个数相同,Python就能正确地将它们关联起来。
6. 常量
常量类似于变量,但其值在程序的整个生命周期内保持不变。Python没有内置的常量类型,但Python程序员会使用全大写来指出应将某个变量视为常量,其值应始终不变:
五、注释
在大多数编程语言中,注释是一项很有用的功能。随着程序越来越大、越来越复杂,应在代码中添加说明,对你解决问题的方法进行大致的阐述。注释让你能够使用自然语言在程序中添加说明。
1. 如何编写注释
在Python中,注释用井号(#)标识。井号后面的内容都会被Python解释器忽略,如下所示:
Python解释器将忽略第一行,只执行第二行。
2. 该编写什么样的注释
编写注释的主要目的是阐述代码要做什么,以及是如何做的。在开发项目期间,你对各个部分如何协同工作了如指掌,但过段时间后,有些细节你可能不记得了。当然,你总是可以通过研究代码来确定各个部分的工作原理,但通过编写注释以清晰的自然语言对解决方案进行概述,可节省很多时间。
要成为专业程序员或与其他程序员合作,就必须编写有意义的注释。当前,大多数软件是合作编写的,编写者可能是同一家公司的多名员工,也可能是众多致力于同一个款开源项目的人员。训练有素的程序员都希望代码中包含注释,因此你最好从现在开始就在程序中添加描述性注释。作为新手,最值得养成的习惯之一就是在代码中编写清晰、简洁的注释。
如果不确定是否要编写注释,就问问自己:在找到合理的解决方案之前,考虑了多个解决方案嘛?如果答案是肯定的,就编写注释对你的解决方案进行说明吧。相比回过头去再添加注释,删除多余的注释要容易得多。
六、Python之禅
经验丰富的程序员倡导尽可能避繁就简。Python社区的理念都包含在Tim Peters撰写的“Python之禅”中。要获悉这些有关编写优秀Python代码的指导原则,只需在解释器中执行命令import this
。这里不打算赘述整个“Python之禅”,而只与大家分享其中的几条原则,让你明白为何它们对Python新手来说至关重要。
Python程序员笃信代码可以编写得漂亮而优雅。编程是要解决问题的,设计良好、高效而漂亮的解决方案都会让程序员新生敬意。随着你对Python的认识越来越深入,并使用它来编写越来越多的代码,有一天也许会有人站在你后面惊呼:“哇,代码编写得真是漂亮!”
如果有两个解决方案,一个简单、一个复杂,但都行之有效,就选择简单的解决方案吧。这样,你编写的代码将更容易维护,你或他人以后改进这些代码时也会更容易。
现实是复杂的,有时候可能没有简单的解决方案。在这种情况下,就选择最简单可行的解决方案吧。
即便是复杂的代码,也要让它易于理解。开发的项目涉及复杂代码时,一定要为这些代码编写有益的注释。
如果让两名Python程序员去解决同一个问题,他们提供的解决方案应大致相同。这并不是说编程没有创意空间,而是恰恰相反!然而,大部分编程工作时使用常见坚决方案来解决简单的小问题,但这些小问题都包含在更庞大、更有创意空间的项目中。在你的程序中,各种具体细节对其他Python程序员来说都应易于理解。
你可以用余生来学习Python和编程的纷繁难懂之处,但这样你什么项目都完不成。不要企图编写完美无缺的代码,而是要先编写行之有效的代码,再决定是对其做进一步改进,还是转而去编写新代码。