Python基础知识¶
约 3989 个字 277 行代码 预计阅读时间 17 分钟
Python中的注释¶
在Python中有两种注释的方式:
- 行内注释:使用
#
开头 - 多行注释:使用三个引号,既可以是单引号
'''
也可以是双引号"""
例如下面的代码:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
Python中的输入和输出¶
对于输入来说,在Python中可以使用input
函数进行输入,其可以传递一个字符串,表示提示文字。需要注意,在Python中,input
函数的返回值始终是一个字符串,如果输入的数值并且这个数值后面需要做算术运算,那么必须要进行强制类型转换
对于输出来说,在Python中可以使用print
函数进行输出,默认情况下,print
函数在输出完参数内容后会自动换行,如果不希望进行默认的换行,可以使用end=""
指定结尾转义字符,默认情况下是end="\n"
如果使用print
函数一次性输出多个内容,则这些内容需要使用逗号,
进行分隔,在输出结果中,每一个由逗号隔开的内容中间会多一个逗号,原因就是print
中的一个参数sep=' '
决定的,如果不希望该空格替换逗号,则可以考虑将空格替换为空字符串,即sep=''
与C语言/C++一样,可以在print
函数中使用格式化输出,对应的格式化字符与C语言/C++一致,但是对于包含格式化字符的字符串和待输出的值来说,二者中间的分隔符号为%
,对于待输出的值如果有多个,则需要使用括号包裹
Note
注意,不同于C语言/C++,在Python中不可以在结尾添加;
作为语句结尾符号
例如下面的代码:
Python | |
---|---|
1 2 3 4 5 6 7 8 |
|
如果不想使用格式化字符串,也可以使用f-string
,即带格式的字符串,使用在需要输出的字符串前写上f
,在常量字符串中使用{}
包裹需要输出的变量或者表达式(更多内容见Python输出与文件操作),例如下面的代码:
Python | |
---|---|
1 2 |
|
Python中的数据类型¶
定义变量¶
在Python中,定义变量的方式如下:
Python | |
---|---|
1 |
|
Note
需要注意,在Python中创建变量不需要关键字,注意和其他编程语言包括JavaScript进行区分
除了上面最基础的方式对变量进行赋值外,还可以通过连等对多个变量赋予同一个值,例如:
Python | |
---|---|
1 |
|
如果想对多个变量分别赋予不同的值,则可以使用元组赋值
在元组赋值中,第一个变量对应赋值符号右侧的第一个值,第二个变量对应赋值符号右侧的第二个值,以此类推
例如下面的代码:
Python | |
---|---|
1 2 |
|
Note
如果担心定义的变量名与关键字冲突,可以通过keyword
类中的属性kwlist
查看Python中的关键字,例如下面的代码:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 |
|
与JavaScript一样,这种赋值方式可以更容易实现变量值的交换,例如下面的代码:
Python | |
---|---|
1 2 3 4 5 6 7 |
|
学习JavaScript时,了解到JavaScript是动态弱类型语言,对于Python来说,其与JavaScript类似,但不完全是动态弱类型,例如下面的代码:
Python | |
---|---|
1 2 3 4 |
|
Python和JavaScript的部分区别
-
强类型 vs. 弱类型:
- JavaScript是一种弱类型语言,这意味着它在类型转换时更加宽松,允许不同类型之间进行隐式转换。例如,
"5" + 1
会得到"51"
,而不是抛出错误 - Python则是一种强类型语言,严格区分不同的数据类型。尝试在不同类型之间进行不明确的操作时,会抛出类型错误。例如,
"5" + 1
在Python中会引发TypeError
- JavaScript是一种弱类型语言,这意味着它在类型转换时更加宽松,允许不同类型之间进行隐式转换。例如,
-
类型提示:
- Python引入了类型提示(Type Hints),允许开发者在代码中明确指定变量的类型,这有助于提高代码的可读性和可维护性,并辅助静态类型检查工具(如
mypy
)进行类型检查 - JavaScript不原生支持类型提示,虽然可以通过使用TypeScript等超集语言来实现
- Python引入了类型提示(Type Hints),允许开发者在代码中明确指定变量的类型,这有助于提高代码的可读性和可维护性,并辅助静态类型检查工具(如
-
对象模型和继承:
- Python的对象模型更加严格,支持基于类的继承,并且提供了丰富的内置数据类型和方法,鼓励开发者遵循明确的接口和协议
- JavaScript的原型继承机制较为灵活,有时可能导致难以预料的行为,尤其是在大型项目中
-
错误处理:
- Python在类型错误和其他运行时错误方面更加严格,促使开发者在编写代码时更加注意类型的一致性
- JavaScript的错误处理机制较为宽容,某些类型错误可能被忽略或被隐式转换处理
定义常量¶
因为Python中定义变量不需要使用任何关键字,这就导致Python中的常量实际上就是变量,只是在命名习惯上,常量一般是所有字母都大写,变量只需要满足变量命名规则和规范即可,例如:
Python | |
---|---|
1 2 |
|
数据类型¶
在Python中,数据类型分为简单数据类型和组合数据类型:
-
简单数据类型:
- 整型(
int
) - 浮点型(
float
) - 布尔类型(
bool
) - 字符串类型(
str
)
- 整型(
-
组合数据类型:
- 复数类型(
Complex
) - 列表(
list
) - 元组(
tuple
) - 集合(
set
) - 字典(
dict
)
- 复数类型(
本次先介绍简单数据类型,对于组合数据类型会在后面单独讲解
在Python中,如果想查看一个数值或者变量的类型,可以使用type
函数或者isinstance
函数判断
Note
需要注意,在JavaScript中有一个typeof
关键字有着类似的功能,但是其是关键字,不是函数,所以使用时可以带括号,也可以不带,但是type
必须带括号,因为它是函数
整型:
在C语言/C++、Java和JavaScript中,整型都是有长度限制的,但是在Python中,理论上可以处理任意长度的整数,例如下面的代码:
Python | |
---|---|
1 2 |
|
布尔类型: 对于布尔类型来说,其值只有两种:True
和False
,但是需要注意值的大小写,在C++、Java和JavaScript中,布尔类型值都为true
和false
字符串类型: 对于字符串来说,与JavaScript一样,可以使用单引号或者双引号包裹,如果包裹的字符串中有单引号或者双引号可以看情况使用下面的两种方法:
- 内部是单引号,外部就用双引号,否则相反
- 使用
\
对内部的引号进行转义
在Python中,也可以使用原始字符串,通过在字符串前添加r
或R
来定义,告诉Python忽略字符串中的转义字符,这对于处理文件路径、正则表达式等需要大量反斜杠的场景非常有用,例如下面的代码:
Python | |
---|---|
1 2 3 4 5 6 7 |
|
注意,原始字符串不能以单个反斜杠结尾,例如r"C:\Users\Name\"
会导致语法错误
在Python中,字符串也可以通过索引取出其中的字符,索引可以为正数,也可以为负数,如果为正数,就是正向,否则就是反向,例如:
Python | |
---|---|
1 2 3 |
|
Python中的字符串有两种运算:
- 字符串加法:将不同的字符串进行拼接,但是注意,不可以将字符串和非字符串进行拼接,除非将非字符串通过强制转换为字符串
- 字符串乘法:将指定字符串重复指定次数
例如下面的代码:
Python | |
---|---|
1 2 3 4 5 6 |
|
因为字符串在Python中属于可迭代对象,所以可以使用切片:
可迭代对象
可迭代对象(Iterable
)是指可以逐一返回其成员的对象。在Python中,许多内置的数据类型都是可迭代的,这使得它们能够与for
循环、生成器表达式以及其他需要迭代的结构一起使用。理解可迭代对象对于编写高效、简洁的Python代码至关重要。
一个对象如果实现了特殊的方法__iter__()
或__getitem__()
,使得可以逐个访问其元素,那么它就是一个可迭代对象。这些对象可以被用于迭代器协议,允许我们使用for
循环来遍历它们的元素。
以下是Python中常见的可迭代对象:
- 字符串(
str
) - 列表(
list
) - 元组(
tuple
) - 字典(
dict
) - 集合(
set
) - 文件对象
- 生成器(Generators)
- 自定义可迭代对象
切片语法如下:
Python | |
---|---|
1 2 3 4 5 |
|
Note
注意,起始索引和终止索引可以是不同方向的,例如起始索引从-1开始,步长为-1,此时就是逆向遍历且每一次移动一个元素,若终止索引是1,则此时表示正向遍历的第二个元素
例如下面的代码:
Python | |
---|---|
1 2 3 |
|
例如下面的代码:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
其他数据类型与其他编程语言基本一致,此处不在赘述
强制类型转换¶
在Python中,可以使用下面的方式进行相关类型的强制转换:
int(x, [基数])
:将其他数据类型转换为整型,需要注意:- 如果待转换的类型是浮点类型,转换后的结果不会包括小数点及后面的数字(即截断)
- 如果待转换的类型是字符串类型,则字符串中不可以包含包括小数点在内的非数字字符
- 如果待转换的类型是布尔类型的值,则
True
值为1,False
值为0
float(x)
:将其他数据类型转换为浮点类型,需要注意:- 如果待转换的类型是整型,转换后的结果会自动加上
.0
- 如果转换的类型是字符串类型,则字符串中不可以包含除小数点和数字字符以外的字符
- 如果转换的类型是布尔类型的值,则
True
值为1.0,False
值为0.0
- 如果待转换的类型是整型,转换后的结果会自动加上
bool(x)
:将其他数据类型转换为布尔类型,在Python中,有下面几种值会被强制转换为False
:None
- 0
- 0.0
False
- 所有的空容器(空列表、空元组、空字典、空集合、空字符串)
str(x)
:将其他数据类型转换为字符串
关于None
在 Python 中,None
是一个特殊的常量,它代表空值或无。None
是NoneType
类型的唯一实例,通常用于表示缺少值、函数没有返回任何显式值的情况,或者作为默认参数来表示某个参数是可选的
- 表示缺失值:
当一个变量被初始化为 None
时,这意味着该变量目前没有任何实际的数据值。
Python | |
---|---|
1 |
|
-
函数返回值:
如果一个函数不显式地返回任何值,那么它将默认返回
None
。Python 1 2 3 4 5
def do_something(): print("Doing something") result = do_something() print(result) # 输出: None
-
默认参数:
在定义函数时,可以使用
None
作为参数的默认值,表示这个参数是可选的。Python 1 2 3 4 5 6 7 8
def greet(name=None): if name is None: print("Hello, stranger!") else: print(f"Hello, {name}!") greet() # 输出: Hello, stranger! greet("Alice") # 输出: Hello, Alice!
-
测试存在性:
None
常用于检查某个对象是否已经被赋值。Python 1 2 3 4 5
data = get_data_from_somewhere() if data is not None: process(data) else: print("No data available.")
-
清理引用:
在某些情况下,为了释放资源或明确表明不再需要某个变量,可以将其设置为
None
。Python 1 2 3
large_list = [i for i in range(1000000)] del large_list # 删除列表 large_list = None # 清理引用
-
比较操作:
使用
is
和is not
操作符来检查一个变量是否为None
。Python 1 2 3 4 5
x = None if x is None: print("x is None") if x is not None: print("x is not None")
-
数据结构中的占位符:
在字典或其他数据结构中,
None
可以用作占位符来表示键的存在但没有对应的值。Python 1
options = {"option1": "value1", "option2": None}
-
与布尔上下文的关系:
在布尔上下文中(如
if
语句),None
被视为False
。Python 1 2 3 4
if None: print("This will not be printed") else: print("None is treated as False in a boolean context")
注意:
- 在 Python 中,不要将
None
与其他类型的值进行直接比较,除了使用is
或is not
。例如,None == 0
或None == ""
都会返回False
- 尽管
None
在布尔上下文中被视为False
,但在判断一个变量是否真正为None
时,应使用is
或is not
来确保准确性
运算符¶
算术运算符¶
在Python中,有下面的几种算术运算符:
+
:加法-
:减法/
:浮点数除法*
:乘法//
:取整除法%
:取模运算**
:求幂运算
Note
注意,在Python中,%
代表的是取模运算,而不是取余运算,具体可见取余运算和取模运算
赋值运算符¶
除了最基本的赋值运算符=
外,还有前面的算术运算符与赋值运算结合的运算符,例如**=
、//=
等,计算方式与JavaScript一样,此处不再赘述
Note
在Python中没有自增运算符++
和自减运算符--
比较运算符¶
与C语言/C++、Java一样,此处不再赘述
逻辑运算符¶
and
(并且)or
(或者)not
(逻辑取反)
与其他编程语言不同的是,在表达数学中的表达式\(1 \le a \le 2\)时,在C、C++、Java或者JavaScript中都是表示为:
Text Only | |
---|---|
1 |
|
但是在Python中支持链式法则,即按照数学方式进行书写:
Python | |
---|---|
1 |
|
另外,Python的逻辑运算符运算结果参考JavaScript逻辑运算符的运算方式,二者完全相同
除了名字不同、计算结果和链式法则,使用和其他编程语言基本一样,但是注意,在Python中没有条件运算符? :
位运算符¶
与C语言/C++一样,此处不再赘述
成员运算符和身份运算符¶
在Python中,成员运算符用于测试序列中是否存在某个值。Python提供了两个成员运算符:
in
:判断一个元素是否存在于某个序列中not in
:判断一个元素是否不存在于某个序列中
语法如下:
Python | |
---|---|
1 2 |
|
基本使用如下:
Python | |
---|---|
1 2 3 |
|
身份运算符用于比较两个对象的内存地址是否相同。Python提供了两个身份运算符:
is
:判断两个变量是否引用自同一个对象()is not
:判断两个变量是否引用自不同的对象
is
和==
的区别
如果使用的是==
在比较时,比较的是内容,is
则比较的是地址
在Python中,可以使用id()
函数查看变量的编号,可以理解为变量的地址,对于值范围在[-5, 256]中的整数来说,存在「小整数优化」
小整数优化
当你在Python中创建一个整数对象时,Python会根据该整数的值动态地为其分配内存空间。对于小整数,Python会使用一种称为“小整数缓存”的机制来优化内存使用。这个缓存池中的整数对象会被重复利用,而不是为每个新创建的小整数分配新的内存空间。这样可以减少内存分配和释放的开销,提高程序的性能。
语法如下:
Python | |
---|---|
1 2 |
|
例如下面的代码:
Python | |
---|---|
1 2 3 4 5 6 |
|
Python运算符优先级¶
运算符 | 描述 |
---|---|
** | 指数 (最高优先级) |
~ 、+ 、- | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
* 、/ 、% 、// | 乘,除,取模和取整除 |
+ 、- | 加法减法 |
>> 、<< | 右移,左移运算符 |
& | 位 'AND' |
^ 、| | 位运算符 |
<= 、< 、> 、>= | 比较运算符 |
<> 、== 、!= | 等于运算符 |
= 、%= 、/= 、//= 、-= 、+= 、*= 、**= | 赋值运算符 |
is 、is not | 身份运算符 |
in 、not in | 成员运算符 |
not 、and 、or | 逻辑运算符 |
分支语句¶
Python语言是一个严格要求缩进(标准要求4个空格)的语言,其缩进代表层次,同一个层次为一个代码块,在执行程序时,会根据层次判断执行方式
Abstract
分支基本逻辑和C++相同,下面只讲述Python中的格式
if
语句和if-else
语句¶
在Python中,使用下面的格式书写if
语句
Python | |
---|---|
1 2 3 4 5 6 7 |
|
使用下面的格式书写if-else
语句:
Python | |
---|---|
1 2 3 4 5 |
|
例如实例:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
if-else if-else
语句¶
在Python中,也存在else if
语句,但是在代码中,else if
写为elif
,整体语法格式如下:
Python | |
---|---|
1 2 3 4 5 6 7 |
|
例如实例:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
match
匹配¶
在Python中没有switch
语句,但是有功能类似的match
语句,其基本写法如下:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
不同于其他语言的switch
语句,Python中的match还可以用于复杂匹配:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
在上面这个示例中,第一个case x if x < 10
表示当age < 10
成立时匹配,且赋值给变量x
,第二个case 10
仅匹配单个值,第三个case 11|12|...|18
能匹配多个值,多个值中间用|
分隔
除此之外,match还可以用于匹配列表:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Pass
语句¶
在Python中,pass
语句表示空语句,一般用于占位
Python | |
---|---|
1 2 3 4 5 6 |
|
上面的代码等价于:
Python | |
---|---|
1 2 |
|
循环语句¶
Abstract
基本逻辑与C++和Java类似,下面仅展示Python中的格式
while
循环¶
在Python中,while循环的基本结构如下:
Python | |
---|---|
1 2 3 |
|
例如实例:
Python | |
---|---|
1 2 3 4 5 6 |
|
for
循环¶
在Python中,for
循环的基本结构和C++差别比较大,下面是基本结构:
Python | |
---|---|
1 2 3 |
|
- 迭代变量:相当于C++中的循环变量,用于控制循环
- 起始值:迭代变量的初始值
- 终止值:迭代变量最大值,注意,最后迭代变量不会等于最大值
- 步长:可以理解为增量,起始值每一次循环需要加步长,默认情况下步长为1,步长也可以为负数
例如实例:
Python | |
---|---|
1 2 3 |
|
- 对于
range
部分来说,也可以选择迭代对象为其他类型,例如字符串
Python | |
---|---|
1 2 3 |
|
上面的代码中,使用字符串作为可迭代对象,此时打印的即为每一个字符串中的每一个字符
Note
Python中是没有字符的概念,上面代码中的每一个字符本质还是一个字符串
break
语句和continue
语句¶
Note
基本逻辑与C++相同,使用方式也基本一致,但是需要遵循Python的格式,可参考pass语句的书写方式
循环与else
语句¶
在Python中,循环可以结合else
语句,执行逻辑为:当循环未执行完毕时,正常执行循环不执行else
语句,否则执行else
语句,格式如下:
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Note
需要注意,如果循环是因为break
结束的,则else
语句依旧不会执行