Python基础(一)

一、变量和数据类型

1、基本变量的使用

1
2
3
4
message = "Hello Python world!"
print(message)
message = "Hello Python Crash Course World!"
print(message)

变量的值可以随时修改

变量的命名有一定的规则:

  • 变量名只能包含字母、数字和下划线。变量名能以字母或下划线打头,但不能以数字打头。例如,可将变量命名为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 。
  • 注意  就目前而言,应使用小写的Python变量名。虽然在变量名中使用大写字母不 会导致错误,但是大写字母在变量名中有特殊含义。
  • 变量是可以赋给值的标签,也可以说变量指向特定的值。

2、字符串

在python中,用引号括起的都是字符串,引号可以是单引号,也可以是双引号。这种灵活性让你能够在字符串中包含引号和撇号。

1
2
3
'I told my friend, "Python is my favorite language!"' 
"The language 'Python' is named after Monty Python, not the snake."
"One of Python's strengths is its diverse and supportive community."

一些常用方法:

1
2
3
4
5
6
str.title() # 将字符串中每个单词的首字母改为大写
str.upper() # 将字符串全部改为大写
str.lower() # 将字符串全部改为小写,存储数据时,方法lower() 很有用。
str.rstrip() # 去除字符串末尾的空白,不过只是暂时的,永久删除需要再关联到原来的变量
str.lstrip() # 删除字符串开头的空白
str.strip() # 删除字符串两边的空白

f字符串(在字符串中使用变量):

要在字符串中插入变量的值,可在前引号前加上字母f (见❶),再将要插入的变量放 在花括号内。这样,当Python显示字符串时,将把每个变量都替换为其值。

1
2
3
4
5
6
7
8
9
first_name = "ada" 
last_name = "lovelace"
full_name = f"{first_name} {last_name}"
print(full_name)

first_name = "ada"
last_name = "lovelace"
full_name = f"{first_name} {last_name}"
print(f"Hello, {full_name.title()}!")

注意  f字符串是Python 3.6引入的。如果你使用的是Python 3.5或更早的版本, 需要使用format() 方法,而非这种f语法。

1
full_name = "{} {}".format(first_name, last_name)

空白:泛指任何非打印字符,如空格、制表符和换行符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> print("Python") 
Python
>>> print("\tPython")
Python

>>> print("Languages:\nPython\nC\nJavaScript")
Languages:
Python
C
JavaScript

>>> print("Languages:\n\tPython\n\tC\n\tJavaScript")
Languages:
Python
C
JavaScript

3、数

整数

在Python中,可对整数执行加(+ )减(- )乘(* )除(/ )运算。

1
2
3
4
>>> 2 + 3 
5
>>> 3 - 2
1

在终端会话中,Python直接返回运算结果。Python使用两个乘号表示乘方运算:

1
2
3
4
>>> 3 ** 2 
9
>>> 3 ** 3
27

浮点数

Python将所有带小数点的数称为浮点数。大多数编程语言使用了这个术语,它指出了这 样一个事实:小数点可出现在数的任何位置。从很大程度上说,使用浮点数时无须考虑其行为。你只需输入要使用的数,Python通常 会按你期望的方式处理它们:

1
2
3
4
>>> 0.1 + 0.1 
0.2
>>> 0.2 + 0.2
0.4

但需要注意的是,结果包含的小数位数可能是不确定的:

1
2
3
4
>>> 0.2 + 0.1 
0.30000000000000004
>>> 3 * 0.1
0.30000000000000004

所有语言都存在这种问题,没有什么可担心的。Python会尽力找到一种精确表示结果的 方法,但鉴于计算机内部表示数的方式,这在有些情况下很难。就现在而言,暂时忽略 多余的小数位数即可。

整数和浮点数

将任意两个数相除时,结果总是浮点数,即便这两个数都是整数且能整除:

1
2
>>> 4/2 
2.0

在其他任何运算中,如果一个操作数是整数,另一个操作数是浮点数,结果也总是浮点 数:

1
2
3
4
>>> 1 + 2.0 
3.0
>>> 2 * 3.0
6.0

数中的下划线

书写很大的数时,可使用下划线将其中的数字分组,使其更清晰易读:

1
>>> universe_age = 14_000_000_000

当你打印这种使用下划线定义的数时,Python不会打印其中的下划线:

1
2
>>> print(universe_age) 
14000000000

这是因为存储这种数时,Python会忽略其中的下划线。将数字分组时,即便不是将每三 位分成一组,也不会影响最终的值。在Python看来,1000 与1_000 没什么不同, 1_000 与10_00 也没什么不同。这种表示法适用于整数和浮点数,但只有Python 3.6 和更高的版本支持。

同时给多个变量赋值

1
>>> x, y, z = 0, 0, 0

常量

常量 类似于变量,但其值在程序的整个生命周期内保持不变。Python没有内置的常量类 型,但Python程序员会使用全大写来指出应将某个变量视为常量,其值应始终不变:

1
MAX_CONNECTIONS = 5000

在代码中,要指出应将特定的变量视为常量,可将其字母全部大写。

4、注释

在Python中,注释用井号(# )标识。井号后面的内容都会被Python解释器忽略,如下 所示:

1
2
# 向大家问好。 
print("Hello Python people!")

编写注释的主要目的是阐述代码要做什么,以及是如何做的。

要成为专业程序员或与其他程序员合作,就必须编写有意义的注释。

如果不确定是否要编写注释,就问问自己:在找到合理的解决方案之前,考虑了多个解 决方案吗?如果答案是肯定的,就编写注释对你的解决方案进行说明吧。相比回过头去 再添加注释,删除多余的注释要容易得多。

5、python之禅

Python社区的理念都包含在Tim Peters撰写的 “Python之禅”中。要获悉这些有关编写优秀Python代码的指导原则,只需在解释器中 执行命令import this 。

1
2
3
>>> import this 
The Zen of Python, by Tim Peters
Beautiful is better than ugly.

二、列表

1、列表是什么

列表 由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0 ~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没 有任何关系。列表通常包含多个元素,因此给列表指定一个表示复数的名称(如 letters 、digits 或names )是个不错的主意。

在Python中,用方括号([] )表示列表,并用逗号分隔其中的元素。下面是一个简单的 列表示例,其中包含几种自行车:

1
2
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] 
print(bicycles)

如果让Python将列表打印出来,Python将打印列表的内部表示,包括方括号:

1
['trek', 'cannondale', 'redline', 'specialized']

列表元素的访问

1
2
3
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] 
print(bicycles[0])
print(bicycles[0].title())

索引从0而不是1开始

在Python中,第一个列表元素的索引为0,而不是1。

第二个列表元素的索引为1。根据这种简单的计数方式,要访问列表的任何元素,都可将 其位置减1,并将结果作为索引。

Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1 ,可让 Python返回最后一个列表元素:

1
2
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] 
print(bicycles[-1])

使用列表中的各个值,可以像使用其他变量一样使用列表中的各个值。例如,可以使用f字符串根据列表中的 值来创建消息。

1
2
3
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] 
message = f"My first bicycle was a {bicycles[0].title()}."
print(message)

2、修改、添加和删除元素的一些方法

1
2
3
4
5
6
list.append() # 在列表末尾添加元素
list.insert(0, 'asdasd') # 可在列表的任何位置添加元素,需要指定新元素的索引和值
del list[0] # 如果知道要删除的元素在列表中的位置,可使用del 语句。
list.pop() # 默认弹出最后一个元素,也可以用索引;可以将弹出的元素赋给一个变量
list.pop(0)
list.remove('asdasd') # 根据值删除元素, 使用remove() 从列表中删除元素时,也可接着使用它的值。

如果你不确定该使用del 语句还是pop() 方法,下面是一个简单的判断标准:如果 你要从列表中删除一个元素,且不再以任何方式使用它,就使用del 语句;如果你 要在删除元素后还能继续使用它,就使用方法pop() 。

注意 方法remove() 只删除第一个指定的值。如果要删除的值可能在列表中 出现多次,就需要使用循环来确保将每个值都删除。

3、组织列表

排序

  • 永久排序sort

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cars = ['bmw', 'audi', 'toyota', 'subaru'] 
    cars.sort()
    print(cars)
    # 方法sort()永久性地修改列表元素的排列顺序。现在,汽车是按字母顺序排列的,再也无法恢复到原来的排列顺序:
    ['audi', 'bmw', 'subaru', 'toyota']
    # 还可以按与字母顺序相反的顺序排列列表元素,只需向sort() 方法传递参数reverse=True 即可。
    cars = ['bmw', 'audi', 'toyota', 'subaru']
    cars.sort(reverse=True)
    print(cars)
    ['toyota', 'subaru', 'bmw', 'audi']
  • 函数 sorted() 对列表临时排序

    调用函数sorted() 后,原列表元素的排列顺序不会改变。如果要按 与字母顺序相反的顺序显示列表,也可向函数sorted() 传递参数reverse=True。

注意 在并非所有的值都是小写时,按字母顺序排列列表要复杂些。决定排列 顺序时,有多种解读大写字母的方式,要指定准确的排列顺序,可能比我们这 里所做的要复杂。

倒着打印列表

要反转列表元素的排列顺序,可使用方法reverse() 。

方法reverse() 永久性地修改列表元素的排列顺序,但可随时恢复到原来的排列 顺序,只需对列表再次调用reverse() 即可。

确定列表的长度

使用函数len() 可快速获悉列表的长度。在下面的示例中,列表包含四个元素,因 此其长度为4 :

1
2
3
>>> cars = ['bmw', 'audi', 'toyota', 'subaru'] 
>>> len(cars)
4

4、遍历整个列表

可以用for循环来遍历整个列表

1
2
3
magicians = ['alice', 'david', 'carolina'] 
for magician in magicians:
print(magician)

使用for循环的时候要注意缩进,不要忘记for后面的冒号

5、创建数值列表

Python函数range() 让你能够轻松地生成一系列数。例如,可以像下面这样使用函 数range() 来打印一系列数:

1
2
3
4
5
6
for value in range(1, 5): 
print(value)
1
2
3
4

在这个示例中,range() 只打印数1~4。这是编程语言中常见的差一行为的结果。 函数range() 让Python从指定的第一个值开始数,并在到达你指定的第二个值时停 止。因为它在第二个值处停止,所以输出不包含该值(这里为5)。

调用函数range() 时,也可只指定一个参数,这样它将从0开始。例如, range(6) 返回数0~5。

要创建数字列表,可使用函数list() 将range() 的结果直接转换为列表。如果将 range() 作为list() 的参数,输出将是一个数字列表。

1
2
3
numbers = list(range(1, 6)) 
print(numbers)
[1, 2, 3, 4, 5]

使用函数range() 时,还可指定步长。为此,可给这个函数指定第三个参数, Python将根据这个步长来生成数。

1
2
3
even_numbers = list(range(2, 11, 2)) 
print(even_numbers)
[2, 4, 6, 8, 10]

有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的 最大值、最小值和总和:

1
2
3
4
5
6
7
>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 
>>> min(digits)
0
>>> max(digits)
9
>>> sum(digits)
45

列表解析,列表解析 将for 循环和创建新元素的代码合并成一 行,并自动附加新元素。

1
2
3
squares = [value**2 for value in range(1, 11)] 
print(squares)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

要使用这种语法,首先指定一个描述性的列表名,如squares 。然后,指定一个左 方括号,并定义一个表达式,用于生成要存储到列表中的值。在这个示例中,表达 式为value 2 ,它计算平方值。接下来,编写一个for 循环,用于给表达式提供 值,再加上右方括号。在这个示例中,for 循环为for value in range(1,11) ,它将值1~10提供给表达式value 2 。请注意,这里的for 语句末尾没有冒 号。

6、列表切片

要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range() 一样,Python在到达第二个索引之前的元素后停止。要输出列表中的前三个元素, 需要指定索引0和3,这将返回索引为0、1和2的元素。

1
2
3
4
5
6
7
8
9
players = ['charles', 'martina', 'michael', 'florence', 'eli'] 
print(players[0:3])
print(players[1:4])
print(players[:4])
print(players[2:])
['charles', 'martina', 'michael']
['martina', 'michael', 'florence']
['charles', 'martina', 'michael', 'florence']
['michael', 'florence', 'eli']

你可以生成列表的任意子集。例如,如果要提取列表的第二、第三和第四个元素, 可将起始索引指定为1 ,并将终止索引指定为4

如果没有指定第一个索引,Python将自动从列表开头开始

要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第三个元素 到列表末尾的所有元素,可将起始索引指定为2 ,并省略终止索引

负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任 意切片。例如,如果要输出名单上的最后三名队员,可使用切片players[-3:]

注意 可在表示切片的方括号内指定第三个值。这个值告诉Python在指定范围内每隔多少元素提取一个。

遍历切片

如果要遍历列表的部分元素,可在for 循环中使用切片。

1
2
3
4
players = ['charles', 'martina', 'michael', 'florence', 'eli'] 
print("Here are the first three players on my team:")
for player in players[:3]:
print(player.title())

复制列表

要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索 引([:] )。这让Python创建一个始于第一个元素、终止于最后一个元素的切片, 即整个列表的副本。

1
2
3
4
5
6
7
8
my_foods = ['pizza', 'falafel', 'carrot cake'] 
friend_foods = my_foods[:]

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)

注意,如果只是单纯的将列表赋给另外一个列表是不行的

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
my_foods = ['pizza', 'falafel', 'carrot cake'] 

# 这行不通:
❶ friend_foods = my_foods

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)

这里将my_foods 赋给friend_foods ,而不是将my_foods 的副本赋给 friend_foods (见❶)。这种语法实际上是让Python将新变量friend_foods 关联到已与my_foods 相关联的列表,因此这两个变量指向同一个列表。

7、元组

Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组。

元组定义

元组看起来很像列表,但使用圆括号而非中括号来标识。定义元组后,就可使用索引来访问其元素,就像访问列表元素一样。

1
2
3
dimensions = (200, 50) 
print(dimensions[0])
print(dimensions[1])

元组中的值一经定义便无法修改,试图修元组中的值会使Python报错

注意  严格地说,元组是由逗号标识的,圆括号只是让元组看起来更整洁、更 清晰。如果你要定义只包含一个元素的元组,必须在这个元素后面加上逗号:

1
my_t = (3,)

创建只包含一个元素的元组通常没有意义,但自动生成的元组有可能只有一个 元素。

元组遍历

像列表一样,也可以使用for 循环来遍历元组中的所有值:

1
2
3
dimensions = (200, 50) 
for dimension in dimensions:
print(dimension)

修改元组的变量

虽然不能修改元组的元素,但可以给存储元组的变量赋值。

1
2
3
4
5
6
7
8
9
dimensions = (200, 50) 
print("Original dimensions:")
for dimension in dimensions:
print(dimension)

dimensions = (400, 100)
print("\nModified dimensions:")
for dimension in dimensions:
print(dimension)

8、设置代码格式

缩进

PEP 8建议每级缩进都使用四个空格。这既可提高可读性,又留下了足够的多级缩进空间。

在字处理文档中,大家常常使用制表符而不是空格来缩进。对于字处理文档来说, 这样做的效果很好,但混合使用制表符和空格会让Python解释器感到迷惑。每款文 本编辑器都提供了一种设置,可将你输入的制表符转换为指定数量的空格。你在编 写代码时绝对应该使用制表符键,但一定要对编辑器进行设置,使其在文档中插入 空格而不是制表符。

行长

很多Python程序员建议每行不超过80字符。最初制定这样的指南时,在大多数计算 机中,终端窗口每行只能容纳79字符。

PEP 8还建议注释的行长不应超过72字符,因为有些 工具为大型项目自动生成文档时,会在每行注释开头添加格式化字符。

在大多数编辑器中,可以设置一个视觉标志(通常是一条竖 线),让你知道不能越过的界线在什么地方。

空行

要将程序的不同部分分开,可使用空行。应该使用空行来组织程序文件,但也不能滥用。

以上建议参考PEP 8