第2章 变量和简单数据类型
- 如何使用变量,如何创建描述性变量名,以及如何消除名称错误和语法错误
- 字符串是什么,如何使用全小写、全大写和首字母大写的方式显示字符串。
- 如何使用空白来显示整洁的输出,如何删除字符串中的多余字符。
- 如何使用整数和浮点数,了解使用数值数据的方式。
- 如何编写说明性注释,了解 Python 代码编写的理念。
2.1 运行hello_world.py时的情况
变量
变量是可以被赋值的标签,可以说一个变量指向一个特定的值。在程序中可以随时修改,Python 始终记录最新值。
变量的命名规则(蛇形命名法也叫下划线命名)
- 只能包含字母、下划线、数字(不能打头)。
- 不允许空格,可用下划线分隔。
- 避免将 Python 关键字和函数名用作变量名
- 大小写敏感,应使用既简短又有描述性的英文单词
- 慎用小写字母
l
和大写字母O
目前应使用小写的 Python 变量名。虽然大写不会导致错误,但大写字母在变量名中有特殊含义,这将在后续讨论。
>>> message = "Hello Python world!"
>>> print(message)
Hello Python world!
>>> message = "Hello Python Crash Course world!"
>>> print(message)
Hello Python Crash Course world!
Python解释器在程序无法成功运行时,提供一个 Traceback,指出解释器在运行代码时,在什么地方陷入困境。如果你错误拼写了变量名:
>>> message = "Hello Python Crash Course reader!"
>>> print(mesage)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'mesage' is not defined. Did you mean: 'message'?
编程语言不关心拼写是否正确,但需要保持一致。如果在定义变量的地方也将 message 错误地拼写成了 mesage,程序将成功地运行。
2.3 字符串 string
字符串是一系列字符。在 Python 中,用英文引号引起的都是字符串,您可以在字符串周围使用单引号(''
)或双引号(""
)或者三个单/双引号。
大小写修改
.title()
方法
在函数调用print()
中,title()
出现在name这个变量的后面。
在name.title()
中name
后面的句点.告诉Python让title()
方法作用于变量name。
name = "ada lovelace"
print(name.title()) # 将单词首字母大写,输出Ada Lovelace
print(name.upper()) # 将字母全部大写,输出ADA LOVELACE
print(name.lower()) # 将字母全部小写,输出ada lovelace
lower()
方法在存储数据很有用。用户通常不像你期望的那样提供正确的大小写,因此需要将字符串先转换为全小写的再存储。
关于函数(function)和方法(method)
目前为止,我们还不用知道它们之间的区别,但你可以把方法视为特殊的函数。它们的书写方式略有不同:
方法是 Python对一段数据执行的操作。每个方法后面都有一组小括号,这是因为方法通常需要在圆括号内提供额外的信息来完成其工作:变量名.方法名(…)
;
函数的书写方式:函数名(…)
如果要力求精确,可以在 Python 解释器中通过去掉函数后面的括号来执行代码,从而确定函数是否应该被称为方法:
>>> print
<built-in function print>
>>> ''.title
<built-in method title of str object at 0x00007FF922DA36E0>
title()
函数不需要额外的信息,因此它后面的圆括号是空的。
字符串中使用变量
在前引号前加上字母f(format),再将要引用的变量放在花括号{}内。
# 使用两个变量分别表示名字和姓氏,然后组合这些值以显示某人的全名
first_name = "Guido"
last_name = "van Rossum"
full_name = f"{first_name} {last_name}"
print(f"你好, {full_name.title()}!") # 输出 Hello, Ada Lovelace!
message = f"你好, {full_name.title()}!"
print(message) # 同样输出 Hello, Ada Lovelace! 但赋给变量,让函数调用print()变得简单
f
字符串是Python 3.6引入的。如果你使用的是Python 3.5或更早的版本,需要使用 format()
方法:full_name = "{} {}".format(first_name, last_name)
字符串的连接
字符串的连接是一个比较常见的需求,比如将姓和名进行连接。直接使用操作符+就可以将两个或者两个以上的字符串进行连接。
字符串的复制
有的时候我们需要把一个字符串重复多遍,比如你要把“Python真强大”这句话重复三遍,可以使用操作符*
对字符串进行重复。上面代码对字符串重复三遍,输入3就可以。你可以根据需要,重复多遍。
字符串的简单拼接
除了使用 f-字符串来生成字符串,我们还可以对字符串“做运算”:
>>> 'Hello' + 'iTuring' # 使用+号来拼接字符串
'HelloiTuring'
>>> 'Hello' *2 # 使用*号来生成重复的字符串
'HelloHello'
获取字符串的长度
手机号、身份证号、姓名都是字符串,想要知道这些字符串的长度,可以利用len()
函数来获取字符串长度。
字符串查找
字符串查找是指查找某一个字符串是否包含在另一个字符串中,比如知道一个用户名,你想知道这个用户是不是测试账号(测试账号的判断依据是名字中包含测试两字),那么只要在名字中查找“测试”字符串即可。如果找到了,则说明该用户是测试账号;如果查找不到,则说明不是测试账号。
用in
或者not in
这两种方法均可实现。除了in
和not in
,还可以用find
,当用find
查找某一字符是否存在于某个字符串中时,如果存在则返回该字符的具体位置,如果不存在则返回-1,如下所示。
注意,因为在Python中位置是从0开始数的,所以第3位就是2。
添加空白
空白泛指任何非打印字符,如空格、制表符(\t
)和换行符(\n
)。用空白组织输出,增加易读性。
# 单行字符串生成四行输出
>>> print("Languages:\n\tPython\n\tC\n\tJavaScript")
Languages:
Python
C
JavaScript
删除空白
rstrip()
方法:剔除字符串右侧的空白
lstrip()
方法:剔除字符串左侧的空白
strip()
方法:剔除字符串首尾的指定字符,默认剔除字符串首尾的空格或换行符
>>> '\tPython\n'.strip()
'Python'
>>> 'APythonA'.strip("A")
'Python'
>>> favorite_language = ' Python '
>>> favorite_language.strip() # 剔除字符串两边的空白
'Python'
>>> favorite_language.rstrip() # 剔除字符串右侧的空白
' Python'
>>> favorite_language.lstrip() # 剔除字符串左侧的空白
'Python '
>>> favorite_language
' Python '
# 要永久删除字符串中的空格,必须将删除的值与变量名关联起来
>>> favorite_language = favorite_language.strip()
>>> favorite_language
'python'
删除前缀
如果我们想去掉https://
这个URL前缀,只关注用户在地址栏需要输入的部分
removeprefix()
:输入变量名,后面跟一个点,然后输入 removeprefix()
方法。在括号内输入要从原始字符串中删除的前缀。同样也会使原始字符串保持不变。如果要保留新的值可以重新分配给原来的变量或新的变量。
>>> nostarch_url = 'https://davonos.com'
>>> nostarch_url.removeprefix('https://')
'davonos.com'
>>> simple_url = nostarch_url.removeprefix('https://')
>>> print(simple_url)
davonos.com
字符串分隔
先将一个字符用某个分隔符号分开,然后将分隔后的值以列表的形式返回,用到的是split()
。
>>>"a,b,c".split(",")
['a', 'b', 'c']
2.4 数值 Number
整数integer
基础数学运算
双乘号**
表示乘方运算,双斜杠//
表示整除运算
>>> 2 + 3
5
>>> 3 - 2
1
>>> 2 * 3
6
>>> 3 / 2
1.5
>>> 3 ** 2
9
>>> 2 + 3 * 4
14
>>> (2 + 3) * 4
20
Python3 的六个标准数据类型中:
不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3个):List(列表)、Dictionary(字典)、Set(集合)。
数据类型 | Excel对照 |
---|---|
整数int | 整数 |
浮点数float | 小数 |
布尔值bool | TRUE/FALSE |
复数complex | COMPLEX函数 |
字符串string | 文本 |
列表list | 某列内容(不包含表头) |
字典dict | 某列内容(含表头)& 某行内容 |
元组(Tuple) | |
集合(Set) |
此外还有一些高级的数据类型,如:字节数组类型(bytes)。
浮点数float
小数点可以出现在数的任何位置上。注意包含的小数位数可能不确定。在第二部分的项目中学习处理多余小数位的方式。
>>> 0.1 + 0.1
0.2
>>> 0.2 +0.1
0.30000000000000004
>>> 2 * 0.1
0.2
>>> 3 * 0.1
0.30000000000000004
任意两个数相除,即便能整除,结果也总是浮点数。只要有操作数是浮点数,Python默认得到的总是浮点数。
>>> 4/2
2.0
>>> 2 * 3.0
6.0
用下划线将数字分组,使很大的数更清晰易读,下划线不会被打印
>>> universe_age = 14_000_000_000 # 在书写长数字时,可以使用下划线对数字进行分组,使大数字更加易读
>>> print(universe_age) # 打印使用下划线定义的数字时,Python 只打印数字
14000000000
>>> print( 3**2, 3/2, 3//2 )
9 1.5 1
Python 支持在一行代码中给多个变量赋值,这有助于缩短程序并提高可读性。
常用做法是将一系列数赋给一组变量。数和变量均用逗号分开,书写的顺序就是分配的顺序。
# 如何将变量 x、y 和 z 都初始化为零
>>> x,y,z = 0,1,2
>>> print(x,y,z)
0 1 2
常量
程序内一直保持不变的变量。Python 没有内置的常量,我们给出的是一个约定俗成的惯例,习惯使用全大写字母(单词由下划线分割)来指出将某个特定的变量视为常量。
请不要在程序中修改任何常量!
避免语法错误
语法错误:包含非法的 Python 代码时发生的错误(时常会遇到)
解释器无法正确地确定字符串的结束位置,所以会给出错误
- 语法错误较难定位(不借助工具时)
- 正确使用单引号和双引号
- 利用编辑器的语法高亮
- 注意编辑器的错误提示
- 查看运行后的错误提示
- 参考书籍附录 C 的建议
2.5 注释 #
编写注释的主要目的是阐述代码要做什么,以及是如何做的。
单行注释:使用#
注释内容,说明多行代码功能一般放在代码上一行,说明单行代码的功能时一般放在代码右侧。
多行注释:使用三个连续的单引号```或三个连续双引号注释"""
作为新手,最值得养成的习惯之一就是在代码中编写清晰、简洁的注释。
如果不确定是否要编写注释,问问自己:在找到合理解决方案前,考虑了多个解决方案吗?如果答案是肯定的,就编写注释对你的解决方案进行说明吧。相比回过头去再添加注释,删除多余的注释要容易得多。
动手一试
完成下面的每个练习时,都编写一个独立的程序。保存每个程序时,使用符合标准 Python 约定的文件名:使用小写字母和下划线,如simple_message.py
。
简单消息:将一条消息赋给变量,并将其打印出来。
msg = "I love learning to use Python."
print(msg)
多条简单消息:将一条消息赋给变量,并将其打印出来。再将变量的值修改为一条消息,并将其打印出来。
msg = "I love learning to use Python."
print(msg)
msg = "It's really satisfying!"
print(msg)
个性化消息:用变量表示一个人的名字,并向其显示一条消息。显示的消息应非常简单,如下:Hello Eric, would you like to learn some Python today?
name = "eric"
msg = f"Hello {name.title()},would you like to learn some Python today?"
print(msg)
调整名字的大小写:变量表示一个人的名字,再分别以全小写、全大写和首字母大写的方式显示这个人名。
name = 'eric'
print(name.lower())
print(name.upper())
print(name.title())
名言1:找一句名人名言,并打印出来,输出应类似于(包括引号):Albert Einstein once said, “A person who never made a mistake never tried anything new.”
print('Albert Einstein once said, "A person who never made a mistake')
print('never tried anything new."')
名言2:重复名言1的练习,但用变量 famous_person 表示名人的姓名,再创建要显示的消息并将其赋给变量 message,然后打印这条消息。
famous_person = "Albert Einstein"
message = f'{famous_person} once said, "A person who never made a mistake never tried anything new."'
print(message)
删除人名中的空白:变量表示一个人的名字,并在其开头和末尾都包含一些空白字符。务必至少使用字符组合“\t"
和“\n”
各一次。打印这个人名,显示其开头和末尾的空白。然后分别使用函数lstrip()
、rstrip()
和strip()
对人名处理,并打印结果。
name = "\tEric Matthes\n"
print("Unmodified:")
print(name)
print("\nUsing lstrip():")
print(name.lstrip())
print("\nUsing rstrip():")
print(name.rstrip())
print("\nUsing strip():")
print(name.strip())
文件扩展名:Python 提供了 removesuffix()
方法,工作原理与 removeprefix()
很像。请将值'python_notes.txt'
赋给变量 filename
,再使用 removesuffix()
方法来显示不包含扩展名的文件名,就像文件浏览器那样。
filename = 'python_notes.txt'
print(filename.removesuffix('.txt'))
数字8:编写4个表达式,分别使用加减乘除运算,结果都是数字8。为了使函数调用print()来显示结果,务必将表达式用括号括起来,类似于:print(5+3)
print(2+6)
print(9-1)
print(2*4)
print(2**3)
print(16/2)
最喜欢的数:用一个变量表示你最喜欢的数,再使用这个变量创建一条消息,指出你最喜欢的数是什么,然后将这条消息打印出来。
fav_num = 42
msg = f"My favorite number is {fav_num}."
print(msg)
添加注释:选择你编写的两个程序,每个程序至少添加一条注释,如何实在没有需要说明的,就在开头加上姓名和当前日期,再用一句话阐述程序的功能。
Python之禅:在终端执行命令import this
,并了解一下有关编写优秀 Python 代码的指导原则。