Python基础知识巧学:简洁易懂的入门教程
Python基础知识巧学:简洁易懂的入门教程
Valyn前言
鉴于测试需要用到Python,特此学习总结了以下内容,以供以后复习所用
Python基础
Python 简介
什么是 Python?
Python 是一门流行的编程语言。它由 Guido van Rossum 创建,于 1991 年发布。
它用于:
- web开发(服务器端)
- 软件开发
- 数学
- 系统脚本
Python 入门
Python 是一门解释型编程语言,这意味着作为开发人员,您可以在文本编辑器中编写 Python(.py)文件,然后将这些文件放入 python 解释器中执行。
在命令行上运行 python 文件的方式如下:
1 | C:\Users\Your Name>python helloworld.py |
任何一门语言的入门都以HelloWorld开始,现在让我们也以HelloWorld为练习敲开Python的大门。
1 | print("Hello, World!") |
Python 缩进
缩进指的是代码行开头的空格。
在其他编程语言中,代码缩进仅出于可读性的考虑,而 Python 中的缩进非常重要。
Python 使用缩进来指示代码块。
1 | if 5 > 2: |
如果省略缩进,Python 会出错
Python 没有声明变量的命令。(弱数据类型,不用像Java一样声明数据的类型)
注释
单行注释
Python 拥有对文档内代码进行注释的功能。
注释以 # 开头,Python 将其余部分作为注释呈现:
1 | # This is a comment. |
多行注释
由于 Python 将忽略未分配给变量的字符串文字,因此您可以在代码中添加多行字符串(三引号),并在其中添加注释:
1 | """ |
Python 变量
创建变量
变量是存放数据值的容器。
与其他编程语言不同,Python 没有声明变量的命令。(弱数据类型,与Java强数据类型不同,Java需显示声明数据的类型)
首次为其赋值时,才会创建变量。
1 | x = 5 |
Python 变量不需要使用任何特定类型声明,甚至可以在设置后更改其类型。
1 | x = 4 # x 是 int 类型 |
字符串变量可以使用单引号或双引号进行声明:
1 | x = "John" |
变量名称
变量可以使用短名称(如 x 和 y)或更具描述性的名称(age、carname、total_volume)。
Python 变量命名规则:
变量名必须以字母或下划线字符开头
变量名称不能以数字开头
变量名只能包含字母数字字符和下划线(A-z、0-9 和 _)
变量名称区分大小写(age、Age 和 AGE 是三个不同的变量)
1
2
3
4
5
6
7
8
9
10
11
12# 合法的变量名:
myvar = "John"
my_var = "John"
_my_var = "John"
myVar = "John"
MYVAR = "John"
myvar2 = "John"
# 非法变量名:
2myvar = "John"
my-var = "John"
my var = "John"
请记住,变量名称区分大小写
向多个变量赋值
Python 允许您在一行中为多个变量赋值:
1 | x, y, z = "Orange", "Banana", "Cherry" |
您可以在一行中为多个变量分配相同的值:
1 | x = y = z = "Orange" |
输出变量
Python 的 print
语句通常用于输出变量。
如需结合文本和变量,Python 使用 +
字符:
1 | x = "awesome" |
您还可以使用 + 字符将变量与另一个变量相加:
1 | x = "Python is " |
对于数字,+
字符用作数学运算符:
1 | x = 5 |
如果您尝试组合字符串和数字,Python 会给出错误(与Java和JavaScript中会做字符串的拼接不同)
全局变量
在函数外部创建的变量(如上述所有实例所示)称为全局变量。
全局变量可以被函数内部和外部的每个人使用。
1 | x = "awesome" |
如果在函数内部创建具有相同名称的变量,则该变量将是局部变量,并且只能在函数内部使用。具有相同名称的全局变量将保留原样,并拥有原始值。
1 | x = "awesome" |
global 关键词
通常,在函数内部创建变量时,该变量是局部变量,只能在该函数内部使用。
要在函数内部创建全局变量,您可以使用global
关键字。
1 | def myfunc(): |
另外,如果要在函数内部更改全局变量,请使用 global 关键字。
1 | x = "awesome" |
Python 数据类型
内置数据类型
在编程中,数据类型是一个重要的概念。
变量可以存储不同类型的数据,并且不同类型可以执行不同的操作。
在这些类别中,Python 默认拥有以下内置数据类型:
文本类型: | str |
---|---|
数值类型: | int , float , complex |
序列类型: | list , tuple , range |
映射类型: | dict |
集合类型: | set , frozenset |
布尔类型: | bool |
二进制类型: | bytes , bytearray , memoryview |
获取数据类型
您可以使用 type()
函数获取任何对象的数据类型:
1 | x = 5 |
设置数据类型
在 Python 中,当您为变量赋值时,会设置数据类型:
实例 | 数据类型 |
---|---|
x = “Hello World” | str |
x = 20 | int |
x = 20.5 | float |
x = 1j | complex |
x = [“apple”, “banana”, “cherry”] | list |
x = (“apple”, “banana”, “cherry”) | tuple |
x = range(6) | range |
x = {“name” : “John”, “age” : 36} | dict |
x = {“apple”, “banana”, “cherry”} | set |
x = frozenset({“apple”, “banana”, “cherry”}) | frozenset |
x = True | bool |
x = b”Hello” | bytes |
x = bytearray(5) | bytearray |
x = memoryview(bytes(5)) | memoryview |
设定特定的数据类型
如果希望指定数据类型,则您可以使用以下构造函数:
实例 | 数据类型 |
---|---|
x = str(“Hello World”) | str |
x = int(20) | int |
x = float(20.5) | float |
x = complex(1j) | complex |
x = list((“apple”, “banana”, “cherry”)) | list |
x = tuple((“apple”, “banana”, “cherry”)) | tuple |
x = range(6) | range |
x = dict(name=”John”, age=36) | dict |
x = set((“apple”, “banana”, “cherry”)) | set |
x = frozenset((“apple”, “banana”, “cherry”)) | frozenset |
x = bool(5) | bool |
x = bytes(5) | bytes |
x = bytearray(5) | bytearray |
x = memoryview(bytes(5)) | memoryview |
Python 数值类型
Python 数值
Python 中有三种数值类型:
int
float
complex
为变量赋值时,将创建数值类型的变量:
1 | x = 1 # int |
Int
Int 或整数是完整的数字,正数或负数,没有小数,长度不限。
1 | x = 1 |
Float
浮动或”浮点数”是包含小数的正数或负数。
1 | x = 1.10 |
浮点数也可以是带有”e”的科学数字,表示 10 的幂。
1 | x = 35e3 |
复数
复数用 “j” 作为虚部编写:
1 | x = 3+5j |
类型转换
您可以使用 int()
, float()
, complex()
方法从一种类型转换为另一种类型
1 | x = 1 # int |
注释: 您无法将复数转换为其他数字类型。
随机数
Python 没有 random()
函数来创建随机数,但 Python 有一个名为 random
的内置模块,可用于生成随机数:
1 | import random |
Python 类型转换
指定变量类型
有时您可能需要为变量指定类型。这可以通过类型转换来完成。 Python 是一门面向对象的语言,因此它使用类来定义数据类型,包括其原始类型。
因此,使用构造函数完成在 python 中的转换:
- int() - 用整数字面量、浮点字面量构造整数(通过对数进行下舍入),或者用表示完整数字的字符串字面量
- float() - 用整数字面量、浮点字面量,或字符串字面量构造浮点数(提供表示浮点数或整数的字符串)
- str() - 用各种数据类型构造字符串,包括字符串,整数字面量和浮点字面量
1 | # 整数: |
Python 字符串
字符串字面量
python 中的字符串字面量由单引号或双引号括起。
‘hello’ 等同于 “hello”.
您可以使用 print()
函数显示字符串字面量:
1 | print("Hello") |
用字符串向变量赋值
通过使用变量名称后跟等号和字符串,可以把字符串赋值给变量:
1 | a = "Hello" |
多行字符串
您可以使用三个引号将多行字符串赋值给变量:
1 | a = """Lorem ipsum dolor sit amet, |
或三个单引号:
1 | a = '''Lorem ipsum dolor sit amet, |
注释: 在结果中,换行符插入与代码中相同的位置.
字符串是数组
像许多其他流行的编程语言一样,Python 中的字符串是表示 unicode 字符的字节数组。
但是,Python 没有字符数据类型,单个字符就是长度为 1 的字符串。
方括号可用于访问字符串的元素。
1 | # 获取位置 1 处的字符(请记住第一个字符的位置为 0): |
裁切
您可以使用裁切语法返回一定范围的字符。
指定开始索引和结束索引,以冒号分隔,以返回字符串的一部分。
1 | # 获取从位置 2 到位置 5(不包括)的字符: |
负的索引(从-1开始)
使用负索引从字符串末尾开始切片:
1 | # 获取从位置 5 到位置 1 的字符,从字符串末尾开始计数: |
字符串长度
如需获取字符串的长度,请使用 len()
函数。
1 | a = "Hello, World!" |
字符串方法
Python 有一组可用于字符串的内置方法。
1 | # strip() 方法删除开头和结尾的空白字符: |
检查字符串
如需检查字符串中是否存在特定短语或字符,我们可以使用 in
或 not in
关键字。
1 | txt = "The rain in Spain stays mainly in the plain" |
字符串级联(串联)
如需串联或组合两个字符串,您可以使用 + 运算符。
1 | a = "Hello" |
字符串格式
正如在 Python 变量一章中所学到的,我们不能像这样组合字符串和数字:
1 | age = 36 |
但是我们可以使用 format()
方法组合字符串和数字!
format()
方法接受传递的参数,格式化它们,并将它们放在占位符 {}
所在的字符串中:
1 | age = 36 |
format() 方法接受不限数量的参数,并放在各自的占位符中:
1 | quantity = 3 |
您可以使用索引号 {0}
来确保参数被放在正确的占位符中:
1 | quantity = 3 |
转义字符
要在字符串中插入非法字符,请使用转义字符。
转义字符是反斜杠 \
后跟要插入的字符。
非法字符的一个例子是双引号括起来的字符串中的双引号:
1 | txt = "We are the so-called "Vikings" from the north." # 报错 |
要解决此问题,请使用转义字符 \"
:
1 | txt = "We are the so-called \"Vikings\" from the north." |
Python 中使用的其他转义字符:
代码 | 结果 |
---|---|
' | Single Quote |
\ | Backslash |
\n | New Line |
\r | Carriage Return |
\t | Tab |
\b | Backspace |
\f | Form Feed |
\ooo | Octal value |
\xhh | Hex value |
字符串方法
Python 有一组可以在字符串上使用的内建方法。
注释: 所有字符串方法都返回新值。它们不会更改原始字符串。
方法 | 描述 |
---|---|
capitalize() | 把首字符转换为大写。 |
casefold() | 把字符串转换为小写。 |
center() | 返回居中的字符串。 |
count() | 返回指定值在字符串中出现的次数。 |
encode() | 返回字符串的编码版本。 |
endswith() | 如果字符串以指定值结尾,则返回 true。 |
expandtabs() | 设置字符串的 tab 尺寸。 |
find() | 在字符串中搜索指定的值并返回它被找到的位置。 |
format() | 格式化字符串中的指定值。 |
format_map() | 格式化字符串中的指定值。 |
index() | 在字符串中搜索指定的值并返回它被找到的位置。 |
isalnum() | 如果字符串中的所有字符都是字母数字,则返回 True。 |
isalpha() | 如果字符串中的所有字符都在字母表中,则返回 True。 |
isdecimal() | 如果字符串中的所有字符都是小数,则返回 True。 |
isdigit() | 如果字符串中的所有字符都是数字,则返回 True。 |
isidentifier() | 如果字符串是标识符,则返回 True。 |
islower() | 如果字符串中的所有字符都是小写,则返回 True。 |
isnumeric() | 如果字符串中的所有字符都是数,则返回 True。 |
isprintable() | 如果字符串中的所有字符都是可打印的,则返回 True。 |
isspace() | 如果字符串中的所有字符都是空白字符,则返回 True。 |
istitle() | 如果字符串遵循标题规则,则返回 True。 |
isupper() | 如果字符串中的所有字符都是大写,则返回 True。 |
join() | 把可迭代对象的元素连接到字符串的末尾。 |
ljust() | 返回字符串的左对齐版本。 |
lower() | 把字符串转换为小写。 |
lstrip() | 返回字符串的左修剪版本。 |
maketrans() | 返回在转换中使用的转换表。 |
partition() | 返回元组,其中的字符串被分为三部分。 |
replace() | 返回字符串,其中指定的值被替换为指定的值。 |
rfind() | 在字符串中搜索指定的值,并返回它被找到的最后位置。 |
rindex() | 在字符串中搜索指定的值,并返回它被找到的最后位置。 |
rjust() | 返回字符串的右对齐版本。 |
rpartition() | 返回元组,其中字符串分为三部分。 |
rsplit() | 在指定的分隔符处拆分字符串,并返回列表。 |
rstrip() | 返回字符串的右边修剪版本。 |
split() | 在指定的分隔符处拆分字符串,并返回列表。 |
splitlines() | 在换行符处拆分字符串并返回列表。 |
startswith() | 如果以指定值开头的字符串,则返回 true。 |
strip() | 返回字符串的剪裁版本。 |
swapcase() | 切换大小写,小写成为大写,反之亦然。 |
title() | 把每个单词的首字符转换为大写。 |
translate() | 返回被转换的字符串。 |
upper() | 把字符串转换为大写。 |
zfill() | 在字符串的开头填充指定数量的 0 值。 |
Python 布尔值
布尔表示两值之一: True
或 False
.
布尔值
在编程中,您通常需要知道表达式是 True
或 False
。
您可以计算 Python 中的任何表达式,并获得两个答案之一,即True
或 False
。
比较两个值时,将对表达式求值,Python 返回布尔值答案:
1 | print(10 > 9) |
当在 if 语句中运行条件时,Python 返回 True
或 False
:
1 | a = 200 |
评估值和变量
bool()函数可让您评估任何值,并为您返回 True 或 False
1 | print(bool("Hello")) |
大多数值都为 True
如果有某种内容,则几乎所有值都将评估为 True。
除空字符串外,任何字符串均为 True。
除 0 外,任何数字均为 True。
除空列表外,任何列表、元组、集合和字典均为 True。
1 | bool("abc") |
某些值为 False
实际上,除空值(例如 ()
, []
, {}
, ""
, 数字 0
, 和值 None
)外,没有多少值会被评估为 False
。 当然,值 False
的计算结果为 False
。
1 | bool(False) |
在这种情况下,一个值或对象的计算结果为 False,即如果对象由带有 len 函数的类生成的,且该函数返回 0 或 False:
1 | class myclass(): |
函数可返回布尔
可以创建返回布尔值的函数
1 | def myFunction() : |
Python 还有很多返回布尔值的内置函数,例如 isinstance()
函数,该函数可用于确定对象是否具有某种数据类型:
1 | x = 200 |
Python 运算符
Python 运算符
运算符用于对变量和值执行操作。
Python 在以下组中划分运算符:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 身份运算符
- 成员运算符
- 位运算符
Python 算术运算符
算术运算符与数值一起使用来执行常见的数学运算:
运算符 | 名称 | 实例 |
---|---|---|
+ | 加法 | x + y |
- | 减法 | x - y |
* | 乘法 | x * y |
/ | 除法 | x / y |
% | 取模 | x % y |
** | 幂 | x ** y |
// | 地板除(取整除) | x // y |
Python 赋值运算符
赋值运算符用于为变量赋值:
运算符 | 实例 | 等同于 |
---|---|---|
= | x = 5 | x = 5 |
+= | x += 3 | x = x + 3 |
-= | x -= 3 | x = x - 3 |
*= | x *= 3 | x = x * 3 |
/= | x /= 3 | x = x / 3 |
%= | x %= 3 | x = x % 3 |
//= | x //= 3 | x = x // 3 |
**= | x **= 3 | x = x ** 3 |
&= | x &= 3 | x = x & 3 |
|= | x |= 3 | x = x | 3 |
^= | x ^= 3 | x = x ^ 3 |
>>= | x >>= 3 | x = x >> 3 |
<<= | x <<= 3 | x = x << 3 |
Python 比较运算符
比较运算符用于比较两个值:
运算符 | 名称 | 实例 |
---|---|---|
== | 等于 | x == y |
!= | 不等于 | x != y |
> | 大于 | x > y |
< | 小于 | x < y |
>= | 大于或等于 | x >= y |
<= | 小于或等于 | x <= y |
Python 逻辑运算符
逻辑运算符用于组合条件语句:
运算符 | 描述 | 实例 |
---|---|---|
and | 如果两个语句都为真,则返回 True。 | x < 5 and x < 10 |
or | 如果其中一个语句为真,则返回 True。 | x < 5 or x < 4 |
not | 反转结果,如果结果为 true,则返回 False | not(x < 5 and x < 10) |
Python 身份运算符
身份运算符用于比较对象,不是比较它们是否相等,但如果它们实际上是同一个对象,则具有相同的内存位置:
运算符 | 描述 | 实例 |
---|---|---|
is | 如果两个变量是同一个对象,则返回 true。 | x is y |
is not | 如果两个变量不是同一个对象,则返回 true。 | x is not y |
Python 成员运算符
成员资格运算符用于测试序列是否在对象中出现:
运算符 | 描述 | 实例 |
---|---|---|
in | 如果对象中存在具有指定值的序列,则返回 True。 | x in y |
not in | 如果对象中不存在具有指定值的序列,则返回 True。 | x not in y |
Python 位运算符
位运算符用于比较(二进制)数字:
运算符 | 名称 | 描述 |
---|---|---|
& | AND | 如果两个位均为 1,则将每个位设为 1。 |
| | OR | 如果两位中的一位为 1,则将每个位设为 1。 |
^ | XOR | 如果两个位中只有一位为 1,则将每个位设为 1。 |
~ | NOT | 反转所有位。 |
<< | Zero fill left shift | 通过从右侧推入零来向左移动,推掉最左边的位。 |
>> | Signed right shift | 通过从左侧推入最左边的位的副本向右移动,推掉最右边的位。 |
Python 列表
Python 集合(数组)
Python 编程语言中有四种集合数据类型:
- 列表(List) 是一种有序和可更改的集合。允许重复的成员。
- 元组(Tuple) 是一种有序且不可更改的集合。允许重复的成员。
- 集合(Set) 是一个无序和无索引的集合。没有重复的成员。
- 词典(Dictionary) 是一个无序,可变和有索引的集合。没有重复的成员。
选择集合类型时,了解该类型的属性很有用。
为特定数据集选择正确的类型可能意味着保留含义,并且可能意味着提高效率或安全性。
列表
列表是一个有序且可更改的集合。在 Python 中,列表用方括号编写。
创建列表
1 | thislist = ["apple", "banana", "cherry"] |
访问列表
1 | thislist = ["apple", "banana", "cherry"] |
负的索引
负索引表示从末尾开始,-1 表示最后一个项目,-2 表示倒数第二个项目,依此类推。
1 | thislist = ["apple", "banana", "cherry"] |
索引范围
您可以通过指定范围的起点和终点来指定索引范围。
指定范围后,返回值将是包含指定项目的新列表。
1 | # 返回第三、第四、第五项: |
通过省略起始值,范围将从第一项开始:
1 | thislist = ["apple", "banana", "cherry", "orange", "kiwi", "melon", "mango"] |
通过省略结束值,范围将继续到列表的末尾:
1 | thislist = ["apple", "banana", "cherry", "orange", "kiwi", "melon", "mango"] |
负指数范围
如果要从列表末尾开始搜索,请指定负索引:
1 | thislist = ["apple", "banana", "cherry", "orange", "kiwi", "melon", "mango"] |
更改项目值
如需更改特定项目的值,请引用索引号:
1 | thislist = ["apple", "banana", "cherry"] |
遍历列表
您可以使用 for
循环遍历列表项:
1 | thislist = ["apple", "banana", "cherry"] |
检查项目是否存在
如需确定列表中是否存在指定的项,请使用 in
关键字:
1 | thislist = ["apple", "banana", "cherry"] |
列表长度
如需确定列表中有多少项,请使用 len()
方法:
1 | thislist = ["apple", "banana", "cherry"] |
添加项目
如需将项目添加到列表的末尾,请使用 append() 方法:
1 | thislist = ["apple", "banana", "cherry"] |
要在指定的索引处添加项目,请使用 insert() 方法:
1 | thislist = ["apple", "banana", "cherry"] |
删除项目
有几种方法可以从列表中删除项目:
1 | # remove() 方法删除指定的项目: |
复制列表
您只能通过键入 list2 = list1
来复制列表,因为:list2
将只是对 list1
的引用, list1
中所做的更改也将自动在 list2
中进行。
有一些方法可以进行复制,一种方法是使用内置的 List 方法 copy()
。
1 | thislist = ["apple", "banana", "cherry"] |
制作副本的另一种方法是使用内建的方法 list()
。
1 | thislist = ["apple", "banana", "cherry"] |
合并两个列表
在 Python 中,有几种方法可以连接或串联两个或多个列表。
最简单的方法之一是使用 +
运算符。
1 | list1 = ["a", "b" , "c"] |
连接两个列表的另一种方法是将 list2 中的所有项一个接一个地追加到 list1 中:
1 | list1 = ["a", "b" , "c"] |
或者,您可以使用 extend()
方法,其目的是将一个列表中的元素添加到另一列表中:
1 | list1 = ["a", "b" , "c"] |
list() 构造函数
也可以使用 list() 构造函数创建一个新列表。
1 | thislist = list(("apple", "banana", "cherry")) # 注意双圆括号 |
列表方法
Python 有一组可以在列表上使用的内建方法。
方法 | 描述 |
---|---|
append() | 在列表的末尾添加一个元素 |
clear() | 删除列表中的所有元素 |
copy() | 返回列表的副本 |
count() | 返回具有指定值的元素数量。 |
extend() | 将列表元素(或任何可迭代的元素)添加到当前列表的末尾 |
index() | 返回具有指定值的第一个元素的索引 |
insert() | 在指定位置添加元素 |
pop() | 删除指定位置的元素 |
remove() | 删除具有指定值的项目 |
reverse() | 颠倒列表的顺序 |
sort() | 对列表进行排序 |
Python 元组
元组(Tuple)
元组是有序且不可更改的集合。在 Python 中,元组是用圆括号编写的。
创建元组
1 | thistuple = ("apple", "banana", "cherry") |
访问元组
1 | thistuple = ("apple", "banana", "cherry") |
负索引
负索引表示从末尾开始,-1 表示最后一个项目,-2 表示倒数第二个项目,依此类推。
1 | thistuple = ("apple", "banana", "cherry") |
索引范围
您可以通过指定范围的起点和终点来指定索引范围。
指定范围后,返回值将是带有指定项目的新元组。
1 | thistuple = ("apple", "banana", "cherry", "orange", "kiwi", "melon", "mango") |
注释: 搜索将从索引 2(包括)开始,到索引 5(不包括)结束。
Range of Negative Indexes
如果要从元组的末尾开始搜索,请指定负索引:
1 | thistuple = ("apple", "banana", "cherry", "orange", "kiwi", "melon", "mango") |
更改元组值
创建元组后,您将无法更改其值。元组是不可变的,或者也称为恒定的。
但是有一种解决方法。您可以将元组转换为列表,更改列表,然后将列表转换回元组。
1 | x = ("apple", "banana", "cherry") |
遍历元组
您可以使用 for
循环遍历元组项目。
1 | thistuple = ("apple", "banana", "cherry") |
检查项目是否存在
要确定元组中是否存在指定的项,请使用 in
关键字:
1 | thistuple = ("apple", "banana", "cherry") |
元组长度
要确定元组有多少项,请使用 len()
方法:
1 | thistuple = ("apple", "banana", "cherry") |
添加项目
元组一旦创建,您就无法向其添加项目。元组是不可改变的。
创建有一个项目的元组
如需创建仅包含一个项目的元组,您必须在该项目后添加一个逗号,否则 Python 无法将变量识别为元组。
1 | # 单项元组,别忘了逗号: |
删除项目
注释: 您无法删除元组中的项目。
元组是不可更改的,因此您无法从中删除项目,但您可以完全删除元组:
1 | # del 关键字可以完全删除元组: |
合并两个元组
如需连接两个或多个元组,您可以使用 +
运算符:
1 | tuple1 = ("a", "b" , "c") |
tuple() 构造函数
也可以使用 tuple() 构造函数来创建元组。
1 | thistuple = tuple(("apple", "banana", "cherry")) # 注意双圆括号 |
元组方法
Python 提供两个可以在元组上使用的内建方法。
方法 | 描述 |
---|---|
count() | 返回元组中指定值出现的次数。 |
index() | 在元组中搜索指定的值并返回它被找到的位置。 |
Python 集合
集合(Set)
集合是无序和无索引的集合。在 Python 中,集合用花括号编写。
创建集合
1 |
|
访问集合
您无法通过引用索引来访问 set 中的项目,因为 set 是无序的,项目没有索引。
但是您可以使用 for 循环遍历 set 项目,或者使用 in 关键字查询集合中是否存在指定值。
1 | thisset = {"apple", "banana", "cherry"} |
更改项目
集合一旦创建,您就无法更改项目,但是您可以添加新项目。
Add Items
要将一个项添加到集合,请使用 add()
方法。
要向集合中添加多个项目,请使用 update()
方法。
1 | thisset = {"apple", "banana", "cherry"} |
获取 Set 的长度
要确定集合中有多少项,请使用 len()
方法。
1 | thisset = {"apple", "banana", "cherry"} |
删除项目
要删除集合中的项目,请使用 remove()
, 或 discard()
方法。
1 | thisset = {"apple", "banana", "cherry"} |
注释: 如果要删除的项目不存在,则 remove()
将引发错误。
1 | thisset = {"apple", "banana", "cherry"} |
注释: 如果要删除的项目不存在,则 discard()
不会引发错误。
您还可以使用 pop()
方法删除项目,但此方法将删除最后一项。请记住,set 是无序的,因此您不会知道被删除的是什么项目。
pop()
方法的返回值是被删除的项目。
1 | thisset = {"apple", "banana", "cherry"} |
注释: 集合是无序的,因此在使用 pop()
方法时,您不会知道删除的是哪个项目。
1 | # clear() 方法清空集合: |
合并两个集合
在 Python 中,有几种方法可以连接两个或多个集合。
您可以使用 union()
方法返回包含两个集合中所有项目的新集合,也可以使用 update()
方法将一个集合中的所有项目插入另一个集合中:
1 | # union() 方法返回一个新集合,其中包含两个集合中的所有项目: |
注释: union()
和 update()
都将排除任何重复项。
还有其他方法将两个集合连接起来,并且仅保留重复项,或者永远不保留重复项,请查看此页面底部的集合方法完整列表。
set() 构造函数
也可以使用 set() 构造函数来创建集合。
1 | thisset = set(("apple", "banana", "cherry")) # 注意双圆括号 |
Set 方法
Python 拥有一套能够在集合(set)上使用的内建方法。
方法 | 描述 |
---|---|
add() | 向集合添加元素。 |
clear() | 删除集合中的所有元素。 |
copy() | 返回集合的副本。 |
difference() | 返回包含两个或更多集合之间差异的集合。 |
difference_update() | 删除此集合中也包含在另一个指定集合中的项目。 |
discard() | 删除指定项目。 |
intersection() | 返回为两个其他集合的交集的集合。 |
intersection_update() | 删除此集合中不存在于其他指定集合中的项目。 |
isdisjoint() | 返回两个集合是否有交集。 |
issubset() | 返回另一个集合是否包含此集合。 |
issuperset() | 返回此集合是否包含另一个集合。 |
pop() | 从集合中删除一个元素。 |
remove() | 删除指定元素。 |
symmetric_difference() | 返回具有两组集合的对称差集的集合。 |
symmetric_difference_update() | 插入此集合和另一个集合的对称差集。 |
union() | 返回包含集合并集的集合。 |
update() | 用此集合和其他集合的并集来更新集合。 |
Python 字典
字典(Dictionary)
字典是一个无序、可变和有索引的集合。在 Python 中,字典用花括号编写,拥有键和值。
创建字典
1 | thisdict = { |
访问项目
您可以通过在方括号内引用其键名来访问字典的项目:
1 | x = thisdict["model"] |
还有一个名为 get()
的方法会给你相同的结果:
1 | x = thisdict.get("model") |
更改值
您可以通过引用其键名来更改特定项的值:
1 | thisdict = { |
遍历字典
您可以使用 for
循环遍历字典。
循环遍历字典时,返回值是字典的键,但也有返回值的方法。
1 | # 逐个打印字典中的所有键名: |
检查键是否存在
要确定字典中是否存在指定的键,请使用 in
关键字:
1 | thisdict = { |
字典长度
要确定字典有多少项目(键值对),请使用 len()
方法。
1 | print(len(thisdict)) |
添加项目
通过使用新的索引键并为其赋值,可以将项目添加到字典中:
1 | thisdict = { |
删除项目
有几种方法可以从字典中删除项目:
1 | # pop() 方法删除具有指定键名的项: |
复制字典
您不能通过键入 dict2 = dict1
来复制字典,因为:dict2
只是对 dict1
的引用, 而 dict1
中的更改也将自动在 dict2
中进行。
有一些方法可以进行复制,一种方法是使用内建的字典方法 copy()
。
1 | thisdict = { |
制作副本的另一种方法是使用内建方法 dict()
。
1 | thisdict = { |
嵌套字典
词典也可以包含许多词典,这被称为嵌套词典。
1 | myfamily = { |
或者,如果您想嵌套三个已经作为字典存在的字典:
1 | child1 = { |
dict() 构造函数
也可以使用 dict() 构造函数创建新的字典:
1 | thisdict = dict(brand="Ford", model="Mustang", year=1964) |
字典方法
Python 提供一组可以在字典上使用的内建方法。
方法 | 描述 |
---|---|
clear() | 删除字典中的所有元素 |
copy() | 返回字典的副本 |
fromkeys() | 返回拥有指定键和值的字典 |
get() | 返回指定键的值 |
items() | 返回包含每个键值对的元组的列表 |
keys() | 返回包含字典键的列表 |
pop() | 删除拥有指定键的元素 |
popitem() | 删除最后插入的键值对 |
setdefault() | 返回指定键的值。如果该键不存在,则插入具有指定值的键。 |
update() | 使用指定的键值对字典进行更新 |
values() | 返回字典中所有值的列表 |
Python If … Else 语句
Python 条件和 If 语句
Python 支持来自数学的常用逻辑条件:
- 等于:a == b
- 不等于:a != b
- 小于:a < b
- 小于等于:a <= b
- 大于:a > b
- 大于等于:a >= b
这些条件能够以多种方式使用,最常见的是”if 语句”和循环。
if 语句使用 if 关键词来写。
1 | a = 33 |
缩进
Python 依赖缩进,使用空格来定义代码中的范围。其他编程语言通常使用花括号来实现此目的。
Elif
elif 关键字是 python 对”如果之前的条件不正确,那么试试这个条件”的表达方式。
1 | a = 33 |
Else
else 关键字捕获未被之前的条件捕获的任何内容。
1 | a = 200 |
简写 If
如果只有一条语句要执行,则可以将其与 if 语句放在同一行。
1 | if a > b: print("a is greater than b") |
简写 If … Else
如果只有两条语句要执行,一条用于 if,另一条用于 else,则可以将它们全部放在同一行:
1 | a = 2 |
And
and 关键字是一个逻辑运算符,用于组合条件语句:
1 | a = 200 |
Or
or
关键字也是逻辑运算符,用于组合条件语句:
1 | a = 200 |
嵌套 If
您可以在 if 语句中包含 if 语句,这称为嵌套 if 语句。
1 | x = 41 |
pass 语句
if 语句不能为空,但是如果您处于某种原因写了无内容的 if 语句,请使用 pass
语句来避免错误。
1 | a = 33 |
Python While 循环
Python 循环
Python 有两个原始的循环命令:
- while 循环
- for 循环
while 循环
如果使用 while 循环,只要条件为真,我们就可以执行一组语句。
1 | i = 1 |
注释: 请记得递增 i,否则循环会永远继续。
while 循环需要准备好相关的变量。在这个实例中,我们需要定义一个索引变量 i,我们将其设置为 1。
break 语句
如果使用 break 语句,即使 while 条件为真,我们也可以停止循环:
1 | i = 1 |
continue 语句
如果使用 continue 语句,我们可以停止当前的迭代,并继续下一个:
1 | i = 0 |
else 语句
通过使用 else 语句,当条件不再成立时,我们可以运行一次代码块:
1 | i = 1 |
Python For 循环
Python For 循环
for 循环用于迭代序列(即列表,元组,字典,集合或字符串)。
这与其他编程语言中的 for 关键字不太相似,而是更像其他面向对象编程语言中的迭代器方法。
通过使用 for 循环,我们可以为列表、元组、集合中的每个项目等执行一组语句。
1 | fruits = ["apple", "banana", "cherry"] |
for 循环不需要预先设置索引变量。
循环遍历字符串
甚至连字符串都是可迭代的对象,它们包含一系列的字符:
1 | for x in "banana": |
break 语句
通过使用 break 语句,我们可以在循环遍历所有项目之前停止循环:
1 | # 如果 x 是 "banana",则退出循环: |
continue 语句
通过使用 continue 语句,我们可以停止循环的当前迭代,并继续下一个:
1 | fruits = ["apple", "banana", "cherry"] |
range() 函数
如需循环一组代码指定的次数,我们可以使用 range() 函数,
range() 函数返回一个数字序列,默认情况下从 0 开始,并递增 1(默认地),并以指定的数字结束。
1 | for x in range(6): |
注意: range(10) 不是 0 到 10 的值,而是值 0 到 9。
range() 函数默认 0 为起始值,不过可以通过添加参数来指定起始值: range(3, 10),这意味着值为 3 到 10(但不包括 10):
1 | for x in range(2, 6): |
range() 函数默认将序列递增 1,但是可以通过添加第三个参数来指定增量值: range(2, 30, 3):
1 | # 使用 3 递增序列(默认值为 1): |
For 循环中的 Else
for 循环中的 else
关键字指定循环结束时要执行的代码块:
1 | for x in range(6): |
嵌套循环
嵌套循环是循环内的循环。
“外循环”每迭代一次,”内循环”将执行一次:
1 | adj = ["red", "big", "tasty"] |
pass 语句
for 语句不能为空,但是如果您处于某种原因写了无内容的 for 语句,请使用 pass
语句来避免错误。
1 | for x in [0, 1, 2]: |
Python 函数
函数是一种仅在调用时运行的代码块。
您可以将数据(称为参数)传递到函数中。
函数可以把数据作为结果返回。
创建函数
在 Python 中,使用 def 关键字定义函数:
1 | def my_function(): |
调用函数
如需调用函数,请使用函数名称后跟括号:
1 | def my_function(): |
参数
信息可以作为参数传递给函数。
参数在函数名后的括号内指定。您可以根据需要添加任意数量的参数,只需用逗号分隔即可。
下面的例子有一个带参数(fname)的函数。当调用此函数时,我们传递一个名字,在函数内部使用它来打印全名:
1 | def my_function(fname): |
在Python文档中,参数 Arguments 通常被缩写为 args。
形式参数或实际参数?
parameter 和 argument 这两个术语可用于同一事物:传递给函数的信息。
从函数的角度来看:
parameter形式参数是函数定义中括号内列出的变量。
argument实际参数是在调用函数时发送给函数的值。
参数个数
默认情况下,必须使用正确数量的参数调用函数。 这意味着如果您的函数需要 2 个参数,则必须使用 2 个参数调用该函数,即不是更多,也不是更少。
1 | def my_function(fname, lname): |
任意参数 *args
如果您不知道将传递给函数的参数数量,请在函数定义中的参数名称前添加 *
。
这样,函数将接收 tuple 元组参数,并可以相应地访问项目:
1 | # 如果实际参数个数未知,在形式参数名前加一个*: |
Arbitrary Arguments 在 Python 文档中通常缩写为 *args。
Keyword Arguments 关键字参数
您还可以使用 key = value 语法发送参数。
这样参数的顺序无关紧要。
1 | def my_function(child3, child2, child1): |
短语 Keyword Arguments 在 Python 文档中通常缩写为 kwargs。
任意关键字参数 **kwargs
如果您不知道将传递给函数的关键字实际参数的数量,请在函数定义中的形式参数名称前添加两个星号:**
。< /p>
这样,函数将接收一个dictionary 字典参数,并可以相应地访问项目:
1 | # 如果关键字实参个数未知,在参数名前加一个双**: |
Arbitrary Kword Arguments 在 Python 文档中通常缩写为 **kwargs。
默认参数值
下面的例子展示如何使用默认参数值。
如果我们调用了不带参数的函数,则使用默认值:
1 | def my_function(country = "Norway"): |
以 List 传参
您发送到函数的参数可以是任何数据类型(字符串、数字、列表、字典等),并且在函数内其将被视为相同数据类型。
例如,如果您将 List 作为参数发送,它到达函数时仍将是 List(列表):
1 | def my_function(food): |
返回值
如需使函数返回值,请使用 return
语句:
1 | def my_function(x): |
pass 语句
函数定义不能为空,但是如果您出于某种原因写了无内容的函数定义,请使用 pass
语句来避免错误。
1 | def myfunction(): |
递归
Python 也接受函数递归,这意味着定义的函数能够调用自身。
递归是一种常见的数学和编程概念。它意味着函数调用自身。这样做的好处是可以循环访问数据以达成结果。
开发人员应该非常小心递归,因为它可以很容易地编写一个永不终止的,或者使用过量内存或处理器能力的函数。但是,在被正确编写后,递归可能是一种非常有效且数学上优雅的编程方法。
在这个例子中,tri_recursion() 是我们定义为调用自身 (“recurse”) 的函数。 我们使用 k 变量作为数据,每次递归时递减(-1)。 当条件不大于 0 时(比如当它为 0 时),递归结束。
对于新的开发人员来说,可能需要一些时间来搞清楚其工作原理,最好的方法是测试并修改它。
1 | def tri_recursion(k): |
Python Lambda 函数
lambda 函数是一种小的匿名函数。
lambda 函数可接受任意数量的参数,但只能有一个表达式。
语法
1 | lambda arguments : expression |
1 | # 将10添加到参数 a,并返回结果: |
lambda 函数可接受任意数量的参数:
1 | x = lambda a, b : a * b |
为何使用 Lambda 函数?
当您把 lambda 用作另一个函数内的匿名函数时,会更好地展现 lambda 的强大能力。
假设您有一个带一个参数的函数定义,并且该参数将乘以未知数字:
1 | def myfunc(n): |
使用该函数定义来创建一个总是使所发送数字加倍的函数:
1 | def myfunc(n): |
如果在短时间内需要匿名函数,请使用 lambda 函数。
Python 数组
请注意,Python 没有内置对数组的支持,但可以使用 Python 列表代替。
数组
数组用于在单个变量中存储多个值:
1 | cars = ["Ford", "Volvo", "BMW"] |
什么是数组?
数组是一种特殊变量,能够一次包含多个值。
如果您有一个项目列表(例如,汽车品牌列表),将牌子存储在单个变量中可能如下所示:
1 | car1 = "Ford" |
但是,如果您想遍历这些品牌并找到特定的汽车品牌怎么办?如果不是 3 辆车,而是 300 辆怎么办?
解决方案是数组!
数组可以在单个名称下保存多个值,您可以通过引用索引号来访问这些值。
访问数组元素
通过索引号来引用数组元素。
1 | x = cars[0] |
修改首个数组项目的值:
1 | cars[0] = "Toyota" |
数组长度
使用 len()
方法来返回数组的长度(数组中的元素数量)。
1 | x = len(cars) |
注释: 数组长度总是比最高的数组索引大一个。
循环数组元素
您可以使用 for in
循环遍历数组的所有元素。
1 | for x in cars: |
添加数组元素
您可以使用 append()
方法把元素添加到数组中。
1 | cars.append("Honda") |
删除数组元素
您可以使用 pop()
方法从数组中删除元素。
1 | cars.pop(1) |
您也可以使用 remove()
方法从数组中删除元素。
1 | cars.remove("Volvo") |
注释: 列表的 remove()
方法仅删除首次出现的指定值。
数组方法
Python 提供一组可以在列表或数组上使用的内建方法。
方法 | 描述 |
---|---|
append() | 在列表的末尾添加一个元素 |
clear() | 删除列表中的所有元素 |
copy() | 返回列表的副本 |
count() | 返回具有指定值的元素数量。 |
extend() | 将列表元素(或任何可迭代的元素)添加到当前列表的末尾 |
index() | 返回具有指定值的第一个元素的索引 |
insert() | 在指定位置添加元素 |
pop() | 删除指定位置的元素 |
remove() | 删除具有指定值的项目 |
reverse() | 颠倒列表的顺序 |
sort() | 对列表进行排序 |
注释: Python 没有内置对数组的的支持,但可以使用 Python 列表代替。
Python 类和对象
Python 是一种面向对象的编程语言。
Python 中的几乎所有东西都是对象,拥有属性和方法。
类(Class)类似对象构造函数,或者是用于创建对象的”蓝图”。
创建类
如需创建类,请使用 class 关键字:
1 | class MyClass: |
创建对象
现在我们可以使用名为 myClass 的类来创建对象:
1 | p1 = MyClass() |
init() 函数
上面的例子是最简单形式的类和对象,在实际应用程序中并不真正有用。
要理解类的含义,我们必须先了解内置的 init() 函数。
所有类都有一个名为 init() 的函数,它始终在启动类时执行。
使用 init() 函数将值赋给对象属性,或者在创建对象时需要执行的其他操作:
1 | # 创建名为 Person 的类,使用 __init__() 函数为 name 和 age 赋值: |
注释: 每次使用类创建新对象时,都会自动调用 init() 函数。
对象方法
对象也可以包含方法。对象中的方法是属于该对象的函数。
让我们在 Person 类中创建方法:
1 | # 插入一个打印问候语的函数,并在 p1 对象上执行它: |
注释: self
参数是对类的当前实例的引用,用于访问属于该类的变量。
self 参数
self 参数是对类的当前实例的引用,用于访问属于该类的变量。
它不必被命名为 self,您可以随意调用它,但它必须是类中任意函数的首个参数:
1 | # 使用单词 mysillyobject 和 abc 代替 self: |
修改对象属性
您可以这样修改对象的属性:
1 | p1.age = 40 |
删除对象属性
您可以使用 del 关键字删除对象的属性:
1 | del p1.age |
删除对象
使用 del 关键字删除对象:
1 | del p1 |
pass 语句
class
类定义不能为空,但是如果您处于某种原因写了无内容的类定义语句,请使用 pass
语句来避免错误。
1 | class Person: |
Python 继承
继承允许我们定义继承另一个类的所有方法和属性的类。
父类是继承的类,也称为基类。
子类是从另一个类继承的类,也称为派生类。
创建父类
任何类都可以是父类,因此语法与创建任何其他类相同:
1 | # 创建一个名为 Person 的类,其中包含 firstname 和 lastname 属性以及 printname 方法: |
创建子类
要创建从其他类继承功能的类,请在创建子类时将父类作为参数发送:
1 | # 创建一个名为 Student 的类,它将从 Person 类继承属性和方法: |
注释: 如果您不想向该类添加任何其他属性或方法,请使用 pass 关键字。
现在,Student 类拥有与 Person 类相同的属性和方法。
1 | # 使用 Student 类创建一个对象,然后执行 printname 方法: |
添加 init() 函数
到目前为止,我们已经创建了一个子类,它继承了父类的属性和方法。
我们想要把 init() 函数添加到子类(而不是 pass 关键字)。
注释: 每次使用类创建新对象时,都会自动调用 __init__()
函数。
1 | # 为 Student 类添加 __init__() 函数: |
当您添加 __init__()
函数时,子类将不再继承父的 __init__()
函数。
注释: 子的 init() 函数会覆盖对父的 init() 函数的继承。
如需保持父的 init() 函数的继承,请添加对父的 init() 函数的调用:
1 | class Student(Person): |
现在,我们已经成功添加了 init() 函数,并保留了父类的继承,我们准备好在 init() 函数中添加功能了。
使用 super() 函数
Python 还有一个 super() 函数,它会使子类从其父继承所有方法和属性:
1 | class Student(Person): |
通过使用 super() 函数,您不必使用父元素的名称,它将自动从其父元素继承方法和属性。
添加属性
1 | # 把名为 graduationyear 的属性添加到 Student 类: |
在这例子中,2019 年应该是一个变量,并在创建 student 对象时传递到 Student 类。为此,请在 init() 函数中添加另一个参数:
1 | # 添加 year 参数,并在创建对象时传递正确的年份: |
添加方法
1 | # 把名为 welcome 的方法添加到 Student 类: |
如果您在子类中添加一个与父类中的函数同名的方法,则将覆盖父方法的继承。
Python 迭代器
迭代器是一种对象,该对象包含值的可计数数字。
迭代器是可迭代的对象,这意味着您可以遍历所有值。
从技术上讲,在 Python 中,迭代器是实现迭代器协议的对象,它包含方法 iter() 和 next()。
迭代器 VS 可迭代对象(Iterable)
列表、元组、字典和集合都是可迭代的对象。它们是可迭代的容器,您可以从中获取迭代器(Iterator)。
所有这些对象都有用于获取迭代器的 iter() 方法:
1 | # 从元组返回一个迭代器,并打印每个值: |
甚至连字符串都是可迭代的对象,并且可以返回迭代器:
1 | # 字符串也是可迭代的对象,包含一系列字符: |
遍历迭代器
我们也可以使用 for
循环遍历可迭代对象:
1 | # 迭代元组的值: |
1 | # 迭代字符串中的字符: |
for
循环实际上创建了一个迭代器对象,并为每个循环执行 next() 方法。
创建迭代器
要把对象/类创建为迭代器,必须为对象实现 iter() 和 next() 方法。
正如您在 Python 类/对象 一章中学到的,所有类都有名为 init() 的函数,它允许您在创建对象时进行一些初始化。
iter() 方法的作用相似,您可以执行操作(初始化等),但必须始终返回迭代器对象本身。
next() 方法也允许您执行操作,并且必须返回序列中的下一个项目。
1 | # 创建一个返回数字的迭代器,从 1 开始,每个序列将增加 1(返回 1、2、3、4、5 等): |
StopIteration
如果你有足够的 next() 语句,或者在 for 循环中使用,则上面的例子将永远进行下去。
为了防止迭代永远进行,我们可以使用 StopIteration 语句。
在 next() 方法中,如果迭代完成指定的次数,我们可以添加一个终止条件来引发错误:
1 | # 在 20 个迭代之后停止: |
Python 作用域
变量仅在创建区域内可用。这称为作用域。
局部作用域
在函数内部创建的变量属于该函数的局部作用域,并且只能在该函数内部使用。
1 | # 在函数内部创建的变量在该函数内部可用: |
函数内部的函数
如上例中所示,变量 x 在函数外部不可用,但对于函数内部的任何函数均可用:
1 | def myfunc(): |
全局作用域
在 Python 代码主体中创建的变量是全局变量,属于全局作用域。
全局变量在任何范围(全局和局部)中可用。
1 | # 在函数外部创建的变量是全局变量,任何人都可以使用: |
命名变量
如果在函数内部和外部操作同名变量,Python 会将它们视为两个单独的变量,一个在全局范围内可用(在函数外部),而一个在局部范围内可用(在函数内部):
1 | # 该函数将打印局部变量 x,然后代码还会打印全局变量 x: |
Global 关键词
如果您需要创建一个全局变量,但被卡在本地作用域内,则可以使用 global
关键字。
global
关键字使变量成为全局变量。
1 | # 如果使用 global 关键字,则该变量属于全局范围: |
另外,如果要在函数内部更改全局变量,也请使用 global 关键字。
1 | # 要在函数内部更改全局变量的值,请使用 global 关键字引用该变量: |
Python 模块
什么是模块?
请思考与代码库类似的模块。
模块是包含一组函数的文件,希望在应用程序中引用。
创建模块
如需创建模块,只需将所需代码保存在文件扩展名为 .py 的文件中:
1 | # 在名为 mymodule.py 的文件中保存代码: |
使用模块
现在,我们就可以用 import 语句来使用我们刚刚创建的模块:
1 | # 导入名为 mymodule 的模块,并调用 greeting 函数: |
注释: 如果使用模块中的函数时,请使用以下语法: module_name.function_name
模块中的变量
模块可以包含已经描述的函数,但也可以包含各种类型的变量(数组、字典、对象等):
在文件 mymodule.py 中保存代码:
1 | person1 = { |
1 | # 导入名为 mymodule 的模块,并访问 person1 字典: |
为模块命名
您可以随意对模块文件命名,但是文件扩展名必须是 .py。
重命名模块
您可以在导入模块时使用 as 关键字创建别名:
1 | # 为 mymodule 创建别名 mx: |
内建模块
Python 中有几个内建模块,您可以随时导入。
1 | # 导入并使用 platform 模块: |
使用 dir() 函数
有一个内置函数可以列出模块中的所有函数名(或变量名)。dir() 函数:
1 | # 列出属于 platform 模块的所有已定义名称: |
注释: The dir() 函数可用于所有模块,也可用于您自己创建的模块。
从模块导入
您可以使用 from 关键字选择仅从模块导入部件。
1 | # 名为 mymodule 的模块拥有一个函数和一个字典: |
1 | # 仅从模块导入 person1 字典: |
注释: 在使用 from 关键字导入时,请勿在引用模块中的元素时使用模块名称。示例:person1[“age”],而不是 mymodule.person1[“age”]。
Python 日期时间
Python 日期
Python 中的日期不是其自身的数据类型,但是我们可以导入名为 datetime 的模块,把日期视作日期对象进行处理。
1 | # 导入 datetime 模块并显示当前日期: |
日期输出
如果我们执行上面的代码,结果将是:
1 | 2023-10-02 04:19:15.475555 |
日期包含年、月、日、小时、分钟、秒和微秒。
datetime 模块有许多方法可以返回有关日期对象的信息。
以下是一些例子,您将在本章稍后详细学习它们:
1 | # 返回 weekday 的名称和年份: |
创建日期对象
如需创建日期,我们可以使用 datetime 模块的 datetime() 类(构造函数)。
datetime() 类需要三个参数来创建日期:年、月、日。
1 | # 创建日期对象: |
datetime() 类还接受时间和时区(小时、分钟、秒、微秒、tzone)的参数,不过它们是可选的,默认值为 0,(时区默认为 None)。
strftime() 方法
datetime 对象拥有把日期对象格式化为可读字符串的方法。
该方法称为 strftime(),并使用一个 format 参数来指定返回字符串的格式:
1 | # 显示月份的名称: |
所有合法格式代码的参考:
指令 | 描述 | 实例 |
---|---|---|
%a | Weekday,短版本 | Wed |
%A | Weekday,完整版本 | Wednesday |
%w | Weekday,数字 0-6,0 为周日 | 3 |
%d | 日,数字 01-31 | 31 |
%b | 月名称,短版本 | Dec |
%B | 月名称,完整版本 | December |
%m | 月,数字01-12 | 12 |
%y | 年,短版本,无世纪 | 18 |
%Y | 年,完整版本 | 2018 |
%H | 小时,00-23 | 17 |
%I | 小时,00-12 | 05 |
%p | AM/PM | PM |
%M | 分,00-59 | 41 |
%S | 秒,00-59 | 08 |
%f | 微妙,000000-999999 | 548513 |
%z | UTC 偏移 | +0100 |
%Z | 时区 | CST |
%j | 天数,001-366 | 365 |
%U | 周数,每周的第一天是周日,00-53 | 52 |
%W | 周数,每周的第一天是周一,00-53 | 52 |
%c | 日期和时间的本地版本 | Mon Dec 31 17:41:00 2018 |
%x | 日期的本地版本 | 12/31/18 |
%X | 时间的本地版本 | 17:41:00 |
%% | A % character | % |
Python 数学运算
Python 有一组内置的数学函数,包括一个扩展的数学模块,可让您对数字执行数学任务。
内置数学函数
min()
和 max()
函数可用于在 一个可迭代的:
1 | x = min(5, 10, 25) |
abs()
函数返回指定数字的绝对(正)值:
1 | x = abs(-7.25) |
pow(*x*, *y*)
函数返回 x 的 y 次方 (x y)。
1 | # 返回 4 的 3 次方(与 4 * 4 * 4 相同): |
数学模块
Python 还有一个名为 math
的内置模块,它扩展了数学函数列表。
要使用它,你必须导入 math
模块:
1 | import math |
导入math
模块后,就可以开始使用模块的方法和常量了。
math.sqrt()
方法例如,返回一个数的平方根:
1 | import math |
math.ceil()
方法将数字向上舍入到最接近的整数,math.floor()
方法将数字向下舍入到最接近的整数,并返回结果:
1 | import math |
math.pi
常量,返回 PI (3.14…) 的值:
1 | import math |
Python JSON
JSON 是用于存储和交换数据的语法。
JSON 是用 JavaScript 对象表示法(JavaScript object notation)编写的文本。
Python 中的 JSON
Python 有一个名为 json 的内置包,可用于处理 JSON 数据。
导入 json 模块:
1 | import json |
解析 JSON - 把 JSON 转换为 Python
若有 JSON 字符串,则可以使用 json.loads() 方法对其进行解析。
结果将是 Python 字典。
把 JSON 转换为 Python:
1 | import json |
把 Python 转换为 JSON
若有 Python 对象,则可以使用 json.dumps() 方法将其转换为 JSON 字符串。
1 | import json |
您可以把以下类型的 Python 对象转换为 JSON 字符串:
- dict
- list
- tuple
- string
- int
- float
- True
- False
- None
1 | import json |
当 Python 转换为 JSON 时,Python 对象会被转换为 JSON(JavaScript)等效项:
Python | JSON |
---|---|
dict | Object |
list | Array |
tuple | Array |
str | String |
int | Number |
float | Number |
True | true |
False | false |
None | null |
转换包含所有合法数据类型的 Python 对象:
1 | import json |
格式化结果
上面的实例打印一个 JSON 字符串,但它不是很容易阅读,没有缩进和换行。
json.dumps()
方法提供了令结果更易读的参数:
1 | # 使用 indent 参数定义缩进数: |
您还可以定义分隔符,默认值为(”, “, “: “),这意味着使用逗号和空格分隔每个对象,使用冒号和空格将键与值分开:
1 | # 使用 separators 参数来更改默认分隔符: |
对结果排序
json.dumps() 方法提供了对结果中的键进行排序的参数:
1 | # 使用 sort_keys 参数来指定是否应对结果进行排序: |
Python 正则表达式
RegEx 或正则表达式是形成搜索模式的字符序列。
RegEx 可用于检查字符串是否包含指定的搜索模式。
RegEx 模块
Python 提供名为 re 的内置包,可用于处理正则表达式。
导入 re 模块:
1 | import re |
Python 中的 RegEx
导入 re 模块后,就可以开始使用正则表达式了:
1 | # 检索字符串以查看它是否以 "The" 开头并以 "Spain" 结尾: |
RegEx 函数
re 模块提供了一组函数,允许我们检索字符串以进行匹配:
函数 | 描述 |
---|---|
findall | 返回包含所有匹配项的列表 |
search | 如果字符串中的任意位置存在匹配,则返回 Match 对象 |
split | 返回在每次匹配时拆分字符串的列表 |
sub | 用字符串替换一个或多个匹配项 |
元字符
元字符是具有特殊含义的字符:
字符 | 描述 | 实例 |
---|---|---|
[] | 一组字符 | “[a-m]” |
\ | 示意特殊序列(也可用于转义特殊字符) | “\d” |
. | 任何字符(换行符除外) | “he..o” |
^ | 起始于 | “^hello” |
$ | 结束于 | “world$” |
* | 零次或多次出现 | “aix*” |
+ | 一次或多次出现 | “aix+” |
{} | 确切地指定的出现次数 | “al{2}” |
| | 两者任一 | “falls|stays” |
() | 捕获和分组 |
特殊序列
特殊序列指的是 \ 后跟下表中的某个字符,拥有特殊含义:
字符 | 描述 | 实例 |
---|---|---|
\A | 如果指定的字符位于字符串的开头,则返回匹配项 | “\AThe” |
\b | 返回指定字符位于单词的开头或末尾的匹配项 | r”\bain” r”ain\b” |
\B | 返回指定字符存在的匹配项,但不在单词的开头(或结尾处) | r”\Bain” r”ain\B” |
\d | 返回字符串包含数字的匹配项(数字 0-9) | “\d” |
\D | 返回字符串不包含数字的匹配项 | “\D” |
\s | 返回字符串包含空白字符的匹配项 | “\s” |
\S | 返回字符串不包含空白字符的匹配项 | “\S” |
\w | 返回一个匹配项,其中字符串包含任何单词字符 (从 a 到 Z 的字符,从 0 到 9 的数字和下划线 _ 字符) | “\w” |
\W | 返回一个匹配项,其中字符串不包含任何单词字符 | “\W” |
\Z | 如果指定的字符位于字符串的末尾,则返回匹配项 | “Spain\Z” |
集合(Set)
集合(Set)是一对方括号 [] 内的一组字符,具有特殊含义:
集合 | 描述 |
---|---|
[arn] | 返回一个匹配项,其中存在指定字符(a,r 或 n)之一 |
[a-n] | 返回字母顺序 a 和 n 之间的任意小写字符匹配项 |
[^arn] | 返回除 a、r 和 n 之外的任意字符的匹配项 |
[0123] | 返回存在任何指定数字(0、1、2 或 3)的匹配项 |
[0-9] | 返回 0 与 9 之间任意数字的匹配 |
[0-5][0-9] | 返回介于 0 到 9 之间的任何数字的匹配项 |
[a-zA-Z] | 返回字母顺序 a 和 z 之间的任何字符的匹配,小写或大写 |
[+] | 在集合中,+、*、.、|、()、$、{} 没有特殊含义,因此 [+] 表示:返回字符串中任何 + 字符的匹配项 |
findall() 函数
findall() 函数返回包含所有匹配项的列表。
1 | # 打印所有匹配的列表: |
这个列表以被找到的顺序包含匹配项。
如果未找到匹配项,则返回空列表:
1 | # 如果未找到匹配,则返回空列表: |
search() 函数
search() 函数搜索字符串中的匹配项,如果存在匹配则返回 Match 对象。
如果有多个匹配,则仅返回首个匹配项:
1 | # 在字符串中搜索第一个空白字符: |
如果未找到匹配,则返回值 None:
1 | # 进行不返回匹配的检索: |
split() 函数
split() 函数返回一个列表,其中字符串在每次匹配时被拆分:
1 | # 在每个空白字符处进行拆分: |
您可以通过指定 maxsplit 参数来控制出现次数:
1 | # 仅在首次出现时拆分字符串: |
sub() 函数
sub() 函数把匹配替换为您选择的文本:
1 | # 用数字 9 替换每个空白字符: |
您可以通过指定 count 参数来控制替换次数:
1 | # 替换前两次出现: |
Match 对象
Match 对象是包含有关搜索和结果信息的对象。
注释: 如果没有匹配,则返回值 None,而不是 Match 对象。
1 | # 执行会返回 Match 对象的搜索: |
Match 对象提供了用于取回有关搜索及结果信息的属性和方法:
.span()
返回的元组包含了匹配的开始和结束位置.string
返回传入函数的字符串.group()
返回匹配的字符串部分
1 | # 打印首个匹配出现的位置(开始和结束位置)。 |
1 | # 打印传入函数的字符串: |
1 | # 打印匹配的字符串部分。 |
注释: 如果没有匹配项,则返回值 None,而不是 Match 对象。
Python PIP
什么是 PIP?
PIP 是 Python 包或模块的包管理器。
注释: 如果您使用的是 Python 3.4 或更高版本,则默认情况下会包含 PIP。
什么是包(Package)?
包中包含模块所需的所有文件。
模块是您可以包含在项目中的 Python 代码库。
检查是否已安装 PIP
将命令行导航到 Python 脚本目录所在的位置,然后键入以下内容:
1 | # 检查 PIP 版本: |
安装 PIP
如果尚未安装 PIP,可以从此页面下载并安装: https://pypi.org/project/pip/
下载包
下载包非常容易。
打开命令行界面并告诉 PIP 下载您需要的软件包。
将命令行导航到 Python 脚本目录的位置,然后键入以下内容:
1 | C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip install camelcase |
使用包
安装包后,即可使用。
把 “camelcase” 包导入您的项目中。
1 | import camelcase |
查找包
在 https://pypi.org/,您可以找到更多的包。
删除包
请使用 uninstall
命令来删除包:
1 | C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip uninstall camelcase |
PIP 包管理器会要求您确认是否需要删除 camelcase 包:
1 | Uninstalling camelcase-02.1: |
按 y
键,包就会被删除。
列出包
请使用 list
命令列出系统上安装的所有软件包:
1 | C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip list |
Python Try Except 异常处理
try
块允许您测试代码块以查找错误。
except
块允许您处理错误。
finally
块允许您执行代码,无论 try 和 except 块的结果如何。
异常处理
当我们调用 Python 并发生错误或异常时,通常会停止并生成错误消息。
可以使用 try 语句处理这些异常:
1 | # try 块将生成异常,因为 x 未定义: |
由于 try 块引发错误,因此会执行 except 块。
如果没有 try 块,程序将崩溃并引发错误
多个异常
您可以根据需要定义任意数量的 exception 块,例如,假如您要为特殊类型的错误执行特殊代码块:
1 | # 如果 try 块引发 NameError,则打印一条消息,如果是其他错误则打印另一条消息: |
Else
如果没有引发错误,那么您可以使用 else 关键字来定义要执行的代码块:
1 | try: |
Finally
如果指定了 finally 块,则无论 try 块是否引发错误,都会执行 finally 块。
1 | try: |
这对于关闭对象并清理资源非常有用:
1 | try: |
程序可以继续,而且不会打开文件对象。
引发异常
作为 Python 开发者,您可以选择在条件发生时抛出异常。
如需抛出(引发)异常,请使用 raise 关键词。
1 | # 假如 x 小于 0,则引发异常并终止程序: |
raise 关键字用于引发异常。
您能够定义所引发异常的类型、以及打印给用户的文本。
1 | # 如果 x 不是整数,则引发 TypeError: |
Python 用户输入
用户输入
Python 允许命令行输入。
这意味着我们能够要求用户输入。
Python 3.6 中的方法与 Python 2.7 略有不同。
Python 3.6 使用 input() 方法。
Python 2.7 使用 raw_input() 方法。
下面的例子会询问用户的姓名,当您输入名字时,名字将打印到屏幕上:
1 | username = input("Enter username:") |
当执行到 input()
函数时,Python 停止执行,并在用户给出一些输入后继续执行。
Python 字符串格式化
为了确保字符串按预期显示,我们可以使用 format() 方法对结果进行格式化。
字符串 format()
format() 方法允许您格式化字符串的选定部分。
有时文本的一部分是你无法控制的,也许它们来自数据库或用户输入?
要控制此类值,请在文本中添加占位符(花括号 {}),然后通过 format() 方法运行值:
1 | # 添加要显示价格的占位符: |
您可以在花括号内添加参数以指定如何转换值:
1 | # 将价格格式化为带有两位小数的数字: |
多个值
如需使用更多值,只需向 format() 方法添加更多值:
1 | print(txt.format(price, itemno, count)) |
并添加更多占位符:
1 | quantity = 3 |
索引号
您可以使用索引号(花括号 {0} 内的数字)来确保将值放在正确的占位符中:
1 | quantity = 3 |
此外,如果要多次引用相同的值,请使用索引号:
1 | age = 36 |
命名索引
您还可以通过在花括号 {carname} 中输入名称来使用命名索引,但是在传递参数值 txt.format(carname = “Ford”) 时,必须使用名称:
1 | myorder = "I have a {carname}, it is a {model}." |
后记
相较于Java来说Python在语法上更加简洁精炼