Python版本:3.8.8
文本编辑器:Pycharm
1.起步
(1)安装Python以及文本编辑器
(2)从终端运行Python程序,输出 hello world!!
在命令窗口中,可以使用终端命令cd
(表示change directory,即切换目录 )在文件系统中导航。使用命令dir
(表示directory,即目录 )可以显示当前目录中的所有文件。
为运行程序hello_world.py,请打开一个新的终端窗口,并执行下面的命令(我的.py文件放在了D:\rural_courtyard):
C:\Users\22445>D:
D:\>cd rural_courtyard
D:\rural_courtyard>python Hello_world.py
hello world!!
D:\rural_courtyard>
2.变量和简单数据类型
2.1 变量
修改初始代码,加一个变量:原始结果不变。
message = "Hello Python world!"
print(message)
2.2.1 变量的命名和使用
请务必牢记下述有关变量的规则。
- 变量名只能包含字母、数字和下划线。变量名能以字母或下划线打头,但不能以数字打头。例如,可将变量命名为
message_1
,但不能将其命名为1_message
。 - 变量名不能包含空格,但能使用下划线来分隔其中的单词。例如,变量名
greeting_message
可行,但变量名greeting message
会引发错误。 - 不要将Python关键字和函数名用作变量名,即不要使用Python保留用于特殊用途的单词,如
print
(请参见附录A.4)。 - 变量名应既简短又具有描述性。例如,
name
比n
好,student_name
比s_n
好,name_length
比length_of_persons_name
好。 - 慎用小写字母
l
和大写字母O
,因为它们可能被人错看成数字1
和0
。
2.2.2 变量是标签
变量常被描述为可用于存储值的盒子。一种好得多的定义是,变量是可以赋给值的标签,也可以说变量指向特定的值。
2.3 字符串
字符串 就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号.
(1)使用方法修改字符串的大小写
在函数调用print()
中,方法title()
出现在这个变量的后面。方法 是Python可对数据执行的操作。在name.title()
中,name
后面的句点(.
)让Python对变量name
执行方法title()
指定的操作。每个方法后面都跟着一对圆括号,这是因为方法通常需要额外的信息来完成其工作。这种信息是在圆括号内提供的。函数title()
不需要额外的信息,因此它后面的圆括号是空的。
方法title()
以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。这很有用,因为你经常需要将名字视为信息。还有其他几个很有用的大小写处理方法。例如,要将字符串改为全部大写或全部小写.
message_1 = "hello python world"
print(message_1.title()) # 首字母大写
print(message_1.upper()) # 全部大写
print(message_1.lower()) # 全部小写
结果:
Hello Python World
HELLO PYTHON WORLD
hello python world
(2)在字符串中使用变量
要在字符串中插入变量的值,可在前引号前加上字母f ,再将要插入的变量放在花括号内。这样,当Python显示字符串时,将把每个变量都替换为其值。这种字符串名为f字符串 。f是format(设置格式)的简写,因为Python通过把花括号内的变量替换为其值来设置字符串的格式。
message_1 = "hello "
message_2 = "world"
message_3 = f"{message_1}{message_2}"
print(message_3)
结果 :
hello world
(3)使用制表符或换行符来添加空白
在编程中,空白 泛指任何非打印字符,如空格、制表符和换行符。
① 要在字符串中添加制表符,可使用字符组合\t
>>> print("Python")
Python
❶ >>> print("\tPython")
Python
② 要在字符串中添加换行符,可使用字符组合\n
:
>>> print("Languages:\nPython\nC\nJavaScript")
Languages:
Python
C
JavaScript
③删除空白
在程序中,额外的空白可能令人迷惑。对程序员来说,'python'
和'python '
看起来几乎没什么两样,但对程序来说,它们却是两个不同的字符串。Python能够发现'python '
中额外的空白,并认为它意义重大——除非你告诉它不是这样的。Python能够找出字符串开头和末尾多余的空白。要确保字符串末尾没有空白,可使用方法rstrip()
。
❶ >>> favorite_language = 'python '
❷ >>> favorite_language
'python '
❸ >>> favorite_language.rstrip()
'python'
❹ >>> favorite_language
'python '
与变量favorite_language
相关联的字符串末尾有多余的空白(见❶)。你在终端会话中向Python询问这个变量的值时,可看到末尾的空格(见❷)。对变量favorite_language
调用方法rstrip()
后(见❸),这个多余的空格被删除了。然而,这种删除只是暂时的,接下来再次询问favorite_language
的值时,你会发现这个字符串与输入时一样,依然包含多余的空白(见❹)。
要永久删除这个字符串中的空白,必须将删除操作的结果关联到变量:
>>> favorite_language = 'python '
❶ >>> favorite_language = favorite_language.rstrip()
>>> favorite_language
'python'
# 剔除字符串开头的空白,或者同时剔除字符串两边的空白。分别使用方法lstrip() 和strip() :
❶ >>> favorite_language = ' python '
❷ >>> favorite_language.rstrip()
' python'
❸ >>> favorite_language.lstrip()
'python '
❹ >>> favorite_language.strip()
'python'
2.4 数
(1)整数、浮点数
在Python中,可对整数执行加(+
)减(-
)乘(*
)除(/
)运算。
- 在终端会话中,Python直接返回运算结果。Python使用两个乘号表示乘方运算;
- Python将所有带小数点的数称为浮点数 。但需要注意的是,结果包含的小数位数可能是不确定的。
- 将任意两个数相除时,结果总是浮点数,即便这两个数都是整数且能整除。
- 在其他任何运算中,如果一个操作数是整数,另一个操作数是浮点数,结果也总是浮点数。
- 无论是哪种运算,只要有操作数是浮点数,Python默认得到的总是浮点数,即便结果原本为整数也是如此。
>>> 3**2
9
>>> 0.1+0.2
0.30000000000000004
>>> 1+0.1
1.1
>>> 4/2
2.0
(2)数中的下划线
书写很大的数时,可使用下划线将其中的数字分组,使其更清晰易读,当你打印这种使用下划线定义的数时,Python不会打印其中的下划线。这是因为存储这种数时,Python会忽略其中的下划线。将数字分组时,即便不是将每三位分成一组,也不会影响最终的值。在Python看来,1000
与1_000
没什么不同,1_000
与10_00
也没什么不同。
>>> count=123_321_000
>>> print(count)
123321000
>>>
(2)同时给多个变量赋值
可在一行代码中给多个变量赋值,这有助于缩短程序并提高其可读性。
>>> x, y, z = 0, 0, 0
(3)常量
常量 类似于变量,但其值在程序的整个生命周期内保持不变。Python没有内置的常量类型,但Python程序员会使用全大写来指出应将某个变量视为常量,其值应始终不变.
MAX_CONNECTIONS = 5000
在代码中,要指出应将特定的变量视为常量,可将其字母全部大写。
2.5 注释
- 在Python中,注释用井号(
#
)标识。井号后面的内容都会被Python解释器忽略。
第 3 章 列表简介
3.1 列表是什么
列表 由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。列表通常包含多个元素,因此给列表指定一个表示复数的名称(如letters
、digits
或names
)是个不错的主意。
在Python中,用方括号([]
)表示列表,并用逗号分隔其中的元素。下面是一个简单的列表示例,其中包含几种自行车,如果让Python将列表打印出来,Python将打印列表的内部表示,包括方括号:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
结果:
['trek', 'cannondale', 'redline', 'specialized']
(1)访问列表元素
列表是有序集合,因此要访问列表的任意元素,只需将该元素的位置(索引 )告诉Python即可。要访问列表元素,可指出列表的名称,再指出元素的索引,并将后者放在方括号内。
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
message = f"My first bicycle was a {bicycles[0].title()}." # 使用bicycles[0] 的值生成了一个句子,并将其赋给变量message
print(bicycles[0]) # 索引从0而不是1开始
print(bicycles[-1]) # 访问最后一个列表元素,索引-2 返回倒数第二个列表元素,索引-3 返回倒数第三个列表元素,依此类推
print(message)
结果:
trek
specialized
My first bicycle was a Trek.
3.2 修改、添加和删除元素
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles[0] = 'ducati'
print(motorcycles)
(2)在列表中添加元素
在列表中添加新元素时,最简单的方式是将元素附加 (append)到列表。给列表附加元素时,它将添加到列表末尾。方法append()
将元素'ducati'
添加到列表末尾(见❶),而不影响列表中的其他所有元素.
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles.append('ducati')
print(motorcycles)
结果:
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha', 'suzuki', 'ducati']
方法append()
让动态地创建列表易如反掌。例如,你可以先创建一个空列表,再使用一系列函数调用append()
来添加元素。下面来创建一个空列表,再在其中添加元素'honda'
、'yamaha'
和'suzuki'
:
motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)
结果:
['honda', 'yamaha', 'suzuki']
(3)在列表中插入元素
使用方法insert()
可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值。方法insert()
在索引0
处添加空间,并将值'ducati'
存储到0位置。
motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
motorcycles.insert(0, 'ducati')
print(motorcycles)
结果:
['ducati', 'honda', 'yamaha', 'suzuki']
①使用del
语句删除元素
如果知道要删除的元素在列表中的位置,可使用del
语句。
②使用方法pop()
删除元素
术语弹出 (pop)源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[0]
print(motorcycles)
motorcycles_pop=motorcycles.pop()
print(motorcycles_pop)
结果:
['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']
suzuki
③弹出列表中任何位置处的元素
实际上,可以使用pop()
来删除列表中任意位置的元素,只需在圆括号中指定要删除元素的索引即可。如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del
语句;如果你要在删除元素后还能继续使用它,就使用方法pop()
。
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles_pop=motorcycles.pop(0)
print(motorcycles_pop)
结果:
['honda', 'yamaha', 'suzuki']
honda
④根据值删除元素
有时候,你不知道要从列表中删除的值所处的位置。如果只知道要删除的元素的值,可使用方法remove()
。
注意 方法remove()
只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来确保将每个值都删除。
motorcycles = ['honda', 'yamaha', 'suzuki','ducati']
print(motorcycles)
motorcycles.remove('ducati')
print(motorcycles)
结果:
['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'suzuki']
3.3 组织列表
(1)使用方法sort()
对列表永久排序
方法sort()
让你能够较为轻松地对列表进行排序。按字母顺序排列的,再也无法恢复到原来的排列顺序,还可以按与字母顺序相反的顺序排列列表元素,只需向sort()
方法传递参数reverse=True
即可。
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()
print(cars)
cars.sort(reverse=True)
print(cars)
结果:
['audi', 'bmw', 'subaru', 'toyota']
['toyota', 'subaru', 'bmw', 'audi']
(2)使用函数sorted()
对列表临时排序
要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted()
。函数sorted()
让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。
cars = ['bmw', 'audi', 'toyota', 'subaru']
print(cars)
print(sorted(cars))
print(cars)
结果:
['bmw', 'audi', 'toyota', 'subaru']
['audi', 'bmw', 'subaru', 'toyota']
['bmw', 'audi', 'toyota', 'subaru']
注意 在并非所有的值都是小写时,按字母顺序排列列表要复杂些。决定排列顺序时,有多种解读大写字母的方式,要指定准确的排列顺序,可能比我们这里所做的要复杂。然而,大多数排序方式是以本节介绍的知识为基础的。
reverse()
不是按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序:
cars = ['bmw', 'audi', 'toyota', 'subaru']
print(cars)
cars.reverse()
print(cars)
结果:
['bmw', 'audi', 'toyota', 'subaru']
['subaru', 'toyota', 'audi', 'bmw']
(4)确定列表的长度
使用函数len()
可快速获悉列表的长度。
第 4 章 操作列表
4.1 遍历整个列表
magicians = ['alice', 'david', 'carolina']
for magician in magicians: #让Python获取列表magicians 中的第一个值'alice' ,并将其与变量magician 相关联
print(magician)
结果:
alice
david
carolina
刚开始使用循环时请牢记,对列表中的每个元素,都将执行循环指定的步骤,而不管列表包含多少个元素。如果列表包含一百万个元素,Python就重复执行指定的步骤一百万次,且通常速度非常快。
(1)在for
循环结束后执行一些操作
开头两个函数调用print()
针对列表中的每位魔术师重复执行。然而,第三个函数调用print()
没有缩进,因此只执行一次
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(f"{magician.title()}, that was a great trick!")
print(f"I can't wait to see your next trick, {magician.title()}.\n")
print("Thank you, everyone. That was a great magic show!")
结果:
Alice, that was a great trick!
I can't wait to see your next trick, Alice.
David, that was a great trick!
I can't wait to see your next trick, David.
Carolina, that was a great trick!
I can't wait to see your next trick, Carolina.
Thank you, everyone. That was a great magic show!
4.2 避免缩进错误
(1)忘记缩进
对于位于for
语句后面且属于循环组成部分的代码行,一定要缩进。
(2)忘记缩进额外的代码行
有时候,循环能够运行且不会报告错误,但结果可能出人意料。试图在循环中执行多项任务,却忘记缩进其中的一些代码行时,就会出现这种情况。
Alice, that was a great trick!
David, that was a great trick!
Carolina, that was a great trick!
I can't wait to see your next trick, Carolina.
Thank you, everyone. That was a great magic show!
这是一个逻辑错误 。从语法上看,这些Python代码是合法的,但由于存在逻辑错误,结果并不符合预期。如果你预期某项操作将针对每个列表元素都执行一次,但它总共只执行了一次,请确定需要将一行还是多行代码缩进。
(3)不必要的缩进
为避免意外缩进错误,请只缩进需要缩进的代码。在前面编写的程序中,只有要在for
循环中对每个元素执行的代码需要缩进。
(4)循环后不必要的缩进
如果不小心缩进了应在循环结束后执行的代码,这些代码将针对每个列表元素重复执行。
(5)遗漏了冒号
for
语句末尾的冒号告诉Python,下一行是循环的第一行。
4.3 创建数值列表
(1)使用函数range()
Python函数range()
让你能够轻松地生成一系列数。
for value in range(1, 5):
print(value)
结果:
1
2
3
4
在这个示例中,range()
只打印数1~4。这是编程语言中常见的差一行为的结果。函数range()
让Python从指定的第一个值开始数,并在到达你指定的第二个值时停止。因为它在第二个值处停止,所以输出不包含该值(这里为5)。
使用range()
时,如果输出不符合预期,请尝试将指定的值加1或减1。
调用函数range()
时,也可只指定一个参数,这样它将从0开始。例如,range(6)
返回数0~5。
(2)使用range()
创建数字列表
要创建数字列表,可使用函数list()
将range()
的结果直接转换为列表。如果将range()
作为list()
的参数,输出将是一个数字列表。
numbers = list(range(1, 6))
print(numbers)
结果:
[1, 2, 3, 4, 5]
使用函数range()
时,还可指定步长。为此,可给这个函数指定第三个参数,Python将根据这个步长来生成数。
even_numbers = list(range(2, 11, 2))
#结果就是2~10的偶数
如下代码是先创建了空列表,然后运算平方,再把平方后的数值附加到列表末尾,最后输出。
squares = []
for value in range(1, 11):
square = value ** 2
squares.append(square)
print(squares)
结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
(3)对数字列表执行简单的统计计算
有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的最大值、最小值和总和:
>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> min(digits)
0
>>> max(digits)
9
>>> sum(digits)
45
(4)列表解析
前面介绍的生成列表squares
的方式包含三四行代码,而列表解析让你只需编写一行代码就能生成这样的列表。列表解析 将for
循环和创建新元素的代码合并成一行,并自动附加新元素。
squares = [value**2 for value in range(1, 11)]
print(squares)
要使用这种语法,首先指定一个描述性的列表名,如squares
。然后,指定一个左方括号,并定义一个表达式,用于生成要存储到列表中的值。在这个示例中,表达式为value**2
,它计算平方值。接下来,编写一个for
循环,用于给表达式提供值,再加上右方括号。在这个示例中,for
循环为for value in range(1,11)
,它将值1~10提供给表达式value**2
。请注意,这里的for
语句末尾没有冒号。
4.4 使用列表的一部分
在第3章中,学习了如何访问单个列表元素。在本章中,学习如何处理列表的所有元素。还可以处理列表的部分元素,Python称之为切片 。
(1)切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()
一样,Python在到达第二个索引之前的元素后停止。要输出列表中的前三个元素,需要指定索引0和3,这将返回索引为0、1和2的元素。
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])
结果:
['charles', 'martina', 'michael']
如果没有指定第一个索引,Python将自动从列表开头开始。
要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第三个元素到列表末尾的所有元素,可将起始索引指定为2
,并省略终止索引,Python将返回从第三个元素到列表末尾的所有元素,无论列表多长,这种语法都能够让你输出从特定位置到列表末尾的所有元素。
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:])
结果:
['michael', 'florence', 'eli']
上一章说过,负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任意切片。例如,如果要输出名单上的最后三名队员,可使用切片players[-3:]
。
注意 可在表示切片的方括号内指定第三个值。这个值告诉Python在指定范围内每隔多少元素提取一个。(步长)
(2)遍历切片
如果要遍历列表的部分元素,可在for
循环中使用切片。
players = ['charles', 'martina', 'michael', 'florence', 'eli']
for player in players[:3]:
print(player.title())
结果:
Charles
Martina
Michael
(3)复制列表
我们经常需要根据既有列表创建全新的列表。
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:]
)。这让Python创建一个始于第一个元素、终止于最后一个元素的切片,即整个列表的副本。
players = ['charles', 'martina', 'michael', 'florence', 'eli']
players_1=players[:]
print(players_1)
结果:
['charles', 'martina', 'michael', 'florence', 'eli']
如果直接用players=players_1,这个行不通。
4.5 元组
列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组 。
(1)定义元组
元组看起来很像列表,但使用圆括号而非中括号来标识。定义元组后,就可使用索引来访问其元素,就像访问列表元素一样。
dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])
结果:
200
50
如果 dimensions[0] = 250,会出现错误,因为元组是不可变的列表。
注意 严格地说,元组是由逗号标识的,圆括号只是让元组看起来更整洁、更清晰。如果你要定义只包含一个元素的元组,必须在这个元素后面加上逗号(my_t = (3,)).创建只包含一个元素的元组通常没有意义,但自动生成的元组有可能只有一个元素。
像列表一样,也可以使用for
循环来遍历元组中的所有值,就像遍历列表时一样,Python返回元组中所有的元素.
dimensions = (200, 50)
for dimension in dimensions:
print(dimension)
(3)修改元组变量
虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组.
首先定义一个元组,并将其存储的尺寸打印出来。接下来,将一个新元组关联到变量dimensions
。然后,打印新的尺寸。这次,Python不会引发任何错误,因为给元组变量重新赋值是合法的。
dimensions = (200, 50)
for dimension in dimensions:
print(dimension)
dimensions=(20,10)
for dimension in dimensions:
print(dimension)
结果:
200
50
20
10
相比于列表,元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期内都不变,就可以使用元组。
4.6 设置代码格式
随着你编写的程序越来越长,有必要了解一些代码格式设置约定。请花时间让你的代码尽可能易于阅读。这有助于你掌握程序是做什么的,也可以帮助他人理解你编写的代码。
为确保所有人编写的代码结构都大致一致,Python程序员会遵循一些格式设置约定。学会编写整洁的Python后,就能明白他人编写的Python代码的整体结构——只要他们和你遵循相同的指南。要成为专业程序员,应从现在开始就遵循这些指南,以养成良好的习惯。
要提出Python语言修改建议,需要编写Python改进提案 (Python Enhancement Proposal,PEP)。PEP 8 是最古老的PEP之一,向Python程序员提供了代码格式设置指南。PEP 8的篇幅很长,但基本上与复杂的编码结构相关。
(1)缩进:PEP 8建议每级缩进都使用四个空格。这既可提高可读性,又留下了足够的多级缩进空间。
(2)行长:很多Python程序员建议每行不超过80字符。
(3)空行:要将程序的不同部分分开,可使用空行。你应该使用空行来组织程序文件,但也不能滥用。只要按本书的示例展示的那样做,就能掌握其中的平衡。例如,如果你有五行创建列表的代码,还有三行处理该列表的代码,那么用一个空行将这两部分隔开是合适的。然而,你不应使用三四个空行将其隔开空行不会影响代码的运行,但会影响代码的可读性。Python解释器根据水平缩进情况来解读代码,但不关心垂直间距。