推荐文档:Python 教程
1 | print("Hello, World!") |
1 | # print("Hello, World!") |
文本类型: | str |
---|---|
数值类型: | int, float, complex |
序列类型: | list, tuple, range |
映射类型: | dict |
集合类型: | set, frozenset |
布尔类型: | bool |
二进制类型: | bytes, bytearray, memoryview |
在 Python 中,当您为变量赋值时,会设置数据类型:
数据类型 | 示例 |
---|---|
str | x = “Hello World” |
int | x = 29 |
float | x = 29.5 |
complex | x = 1j |
list | x = [“apple”, “banana”, “cherry”] |
tuple | x = (“apple”, “banana”, “cherry”) |
range | x = range(6) |
dict | x = {“name” : “Bill”, “age” : 63} |
set | x = {“apple”, “banana”, “cherry”} |
frozenset | x = frozenset({“apple”, “banana”, “cherry”}) |
bool | x = True |
bytes | x = b”Hello” |
bytearray | x = bytearray(5) |
memoryview | x = memoryview(bytes(5)) |
如果希望指定数据类型,则您可以使用以下构造函数:
数据类型 | 示例 |
---|---|
str | x = str(“Hello World”) |
int | x = int(29) |
float | x = float(29.5) |
complex | x = complex(1j) |
list | x = list((“apple”, “banana”, “cherry”)) |
tuple | x = tuple((“apple”, “banana”, “cherry”)) |
range | x = range(6) |
dict | x = dict(name=”Bill”, age=36) |
set | x = set((“apple”, “banana”, “cherry”)) |
frozenset | x = frozenset((“apple”, “banana”, “cherry”)) |
bool | x = bool(5) |
bytes | x = bytes(5) |
bytearray | x = bytearray(5) |
memoryview | x = memoryview(bytes(5)) |
方法 | 描述 |
---|---|
clear() | 删除字典中的所有元素 |
copy() | 返回字典的副本 |
fromkeys() | 返回拥有指定键和值的字典 |
get() | 返回指定键的值 |
items() | 返回包含每个键值对的元组的列表 |
keys() | 返回包含字典键的列表 |
pop() | 删除拥有指定键的元素 |
popitem() | 删除最后插入的键值对 |
setdefault() | 返回指定键的值。如果该键不存在,则插入具有指定值的键。 |
update() | 使用指定的键值对字典进行更新 |
values() | 返回字典中所有值的列表 |
方法 | 描述 |
---|---|
append() | 在列表的末尾添加一个元素 |
clear() | 删除列表中的所有元素 |
copy() | 返回列表的副本 |
count() | 返回具有指定值的元素数量。 |
extend() | 将列表元素(或任何可迭代的元素)添加到当前列表的末尾 |
index() | 返回具有指定值的第一个元素的索引 |
insert() | 在指定位置添加元素 |
pop() | 删除指定位置的元素 |
remove() | 删除具有指定值的项目 |
reverse() | 颠倒列表的顺序 |
sort() | 对列表进行排序 |
方法 | 描述 |
---|---|
add() | 向集合添加元素。 |
clear() | 删除集合中的所有元素。 |
copy() | 返回集合的副本。 |
difference() | 返回包含两个或更多集合之间差异的集合。 |
difference_update() | 删除此集合中也包含在另一个指定集合中的项目。 |
discard() | 删除指定项目。 |
intersection() | 返回为两个其他集合的交集的集合。 |
intersection_update() | 删除此集合中不存在于其他指定集合中的项目。 |
isdisjoint() | 返回两个集合是否有交集。 |
issubset() | 返回另一个集合是否包含此集合。 |
issuperset() | 返回此集合是否包含另一个集合。 |
pop() | 从集合中删除一个元素。 |
remove() | 删除指定元素。 |
symmetric_difference() | 返回具有两组集合的对称差集的集合。 |
symmetric_difference_update() | 插入此集合和另一个集合的对称差集。 |
union() | 返回包含集合并集的集合。 |
update() | 用此集合和其他集合的并集来更新集合。 |
方法 | 描述 |
---|---|
count() | 返回元组中指定值出现的次数。 |
index() | 在元组中搜索指定的值并返回它被找到的位置。 |
我们可以使用 format() 方法对结果进行格式化。
1 2 3 4 5 | quantity = 3 itemno = 567 price = 52 myorder = "I want {} pieces of item number {} for {:.2f} dollars." print(myorder.format(quantity, itemno, price)) |
您可以使用索引号(花括号 {0} 内的数字)来确保将值放在正确的占位符中:
1 2 3 4 5 | quantity = 3 itemno = 567 price = 52 myorder = "I want {0} pieces of item number {1} for {2:.2f} dollars." print(myorder.format(quantity, itemno, price)) |
此外,如果要多次引用相同的值,请使用索引号:
1 2 3 4 | age = 63 name = "Bill" txt = "His name is {1}. {1} is {0} years old." print(txt.format(age, name)) |
您还可以通过在花括号 {carname} 中输入名称来使用命名索引,但是在传递参数值 txt.format(carname = “Ford”) 时,必须使用名称:
1 2 | myorder = "I have a {carname}, it is a {model}." print(myorder.format(carname = "Porsche", model = "911")) |
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 值。 |
1 2 3 4 5 6 7 8 9 10 | class Person: def __init__(self, name, age): self.name = name self.age = age def myfunc(self): print("Hello my name is " + self.name) p1 = Person("Bill", 63) p1.myfunc() |
1 | if (p1 is None): |
1 2 | del p1.age del p1 |
1 | class Student(Person): |
运算符用于对变量和值执行操作。
Python 在以下组中划分运算符:
算术运算符与数值一起使用来执行常见的数学运算:
运算符 | 名称 | 实例 |
---|---|---|
+ | 加 | x + y |
- | 减 | x - y |
* | 乘 | x * y |
/ | 除 | x / y |
% | 取模 | x % y |
** | 幂 | x ** y |
// | 地板除(取整除) | x // y |
赋值运算符用于为变量赋值:
运算符 | 实例 | 等同于 | |||
---|---|---|---|---|---|
= | 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 |
比较运算符用于比较两个值:
运算符 | 名称 | 实例 |
---|---|---|
== | 等于 | x == y |
!= | 不等于 | x != y |
> | 大于 | x > y |
< | 小于 | x < y |
>= | 大于或等于 | x >= y |
<= | 小于或等于 | x <= y |
逻辑运算符用于组合条件语句:
运算符 | 描述 | 实例 |
---|---|---|
and | 如果两个语句都为真,则返回 True。 | x > 3 and x < 10 |
or | 如果其中一个语句为真,则返回 True。 | x > 3 or x < 4 |
not | 反转结果,如果结果为 true,则返回 False | not(x > 3 and x < 10) |
身份运算符用于比较对象,不是比较它们是否相等,但如果它们实际上是同一个对象,则具有相同的内存位置:
运算符 | 描述 | 实例 |
---|---|---|
is | 如果两个变量是同一个对象,则返回 true。 | x is y |
is not | 如果两个变量不是同一个对象,则返回 true。 | x is not y |
成员资格运算符用于测试序列是否在对象中出现:
运算符 | 描述 | 实例 |
---|---|---|
in | 如果对象中存在具有指定值的序列,则返回 True。 | x in y |
not in | 如果对象中不存在具有指定值的序列,则返回 True。 | x not in y |
位运算符用于比较(二进制)数字:
运算符 | 描述 | 实例 | |
---|---|---|---|
& | AND | 如果两个位均为 1,则将每个位设为 1。 | |
` | ` | OR | 如果两位中的一位为 1,则将每个位设为 1。 |
^ | XOR | 如果两个位中只有一位为 1,则将每个位设为 1。 | |
~ | NOT | 反转所有位。 | |
<< | Zero fill left shift | 通过从右侧推入零来向左移动,推掉最左边的位。 | |
>> | Signed right shift | 通过从左侧推入最左边的位的副本向右移动,推掉最右边的位。 |
1 2 3 4 5 6 7 8 | a = 200 b = 66 if b > a: print("b is greater than a") elif a == b: print("a and b are equal") else: print("a is greater than b") |
在 i 等于 3 时退出循环:
1 2 3 4 5 6 | i = 1 while i < 7: print(i) if i == 3: break i += 1 |
for 循环用于迭代序列(即列表,元组,字典,集合或字符串)。
循环遍历单词 “banana” 中的字母:
1 2 | for x in "banana": print(x) |
1 2 3 4 5 | fruits = ["apple", "banana", "cherry"] for x in fruits: print(x) if x == "banana": break |
方式1
1 2 3 | d = {'name1' : 'pythontab', 'name2' : '.', 'name3' : 'com'} for key in d: print (key, ' value : ', d[key]) |
方式2
1 2 | for key, value in d.items(): print (key, ' value : ', value) |
range() 函数返回一个数字序列,默认情况下从 0 开始,并递增 1(默认地),并以指定的数字结束。
使用 range() 函数:
1 2 | for x in range(10): print(x) |
从元组返回一个迭代器,并打印每个值:
1 2 3 4 5 6 | mytuple = ("apple", "banana", "cherry") myit = iter(mytuple) print(next(myit)) print(next(myit)) print(next(myit)) |
要把对象/类创建为迭代器,必须为对象实现 iter() 和 next() 方法。
正如您在 Python 类/对象 一章中学到的,所有类都有名为 init() 的函数,它允许您在创建对象时进行一些初始化。
__iter__()
方法的作用相似,您可以执行操作(初始化等),但必须始终返回迭代器对象本身。
__next__()
方法也允许您执行操作,并且必须返回序列中的下一个项目。
创建一个返回数字的迭代器,从 1 开始,每个序列将增加 1(返回 1、2、3、4、5 等):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): x = self.a self.a += 1 return x myclass = MyNumbers() myiter = iter(myclass) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter)) |
如果你有足够的 next() 语句,或者在 for 循环中使用,则上面的例子将永远进行下去。
为了防止迭代永远进行,我们可以使用 StopIteration 语句。
在 next() 方法中,如果迭代完成指定的次数,我们可以添加一个终止条件来引发错误:
在 20 个迭代之后停止:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 20: x = self.a self.a += 1 return x else: raise StopIteration myclass = MyNumbers() myiter = iter(myclass) for x in myiter: print(x) |
1 2 3 4 | def my_function(): print("Hello from a function") my_function() |
1 2 | x = lambda a, b, c : a + b + c print(x(5, 6, 2)) |
try 块将生成异常,因为 x 未定义:
1 2 3 4 | try: print(x) except: print("An exception occurred") |
您可以根据需要定义任意数量的 exception 块,例如,假如您要为特殊类型的错误执行特殊代码块:
如果 try 块引发 NameError,则打印一条消息,如果是其他错误则打印另一条消息:
1 2 3 4 5 6 | try: print(x) except NameError: print("Variable x is not defined") except: print("Something else went wrong") |
如果没有引发错误,那么您可以使用 else 关键字来定义要执行的代码块:
在本例中,try 块不会生成任何错误:
1 2 3 4 5 6 | try: print("Hello") except: print("Something went wrong") else: print("Nothing went wrong") |
如果指定了 finally 块,则无论 try 块是否引发错误,都会执行 finally 块。
1 2 3 4 5 6 | try: print(x) except: print("Something went wrong") finally: print("The 'try except' is finished") |
在名为 mymodule.py
的文件中保存代码:
1 2 | def greeting(name): print("Hello, " + name) |
导入名为 mymodule 的模块,并调用 greeting 函数:
1 2 3 | import mymodule mymodule.greeting("Bill") |
1 2 3 4 5 6 7 8 9 10 11 | try: f = open('xxx') except: print('fail to open') exit(-1) try: do something except: do something finally: f.close() |
虽然这段代码运行良好,但比较冗长。
而使用with的话,能够减少冗长,还能自动处理上下文环境产生的异常。如下面代码:
1 2 | with open("1.txt") as file: data = file.read() |
(1)紧跟with后面的语句被求值后,返回对象的__enter__()
方法被调用,这个方法的返回值将被赋值给as后面的变量;
(2)当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()
方法。
with工作原理代码示例:
1 2 3 4 5 6 7 8 9 10 | class Sample: def __enter__(self): print "in __enter__" return "Foo" def __exit__(self, exc_type, exc_val, exc_tb): print "in __exit__" def get_sample(): return Sample() with get_sample() as sample: print "Sample: ", |
代码的运行结果如下:
1 2 3 | in __enter__ Sample: Foo in __exit__ |
可以看到,整个运行过程如下:
(1)enter()方法被执行;
(2)enter()方法的返回值,在这个例子中是”Foo”,赋值给变量sample;
(3)执行代码块,打印sample变量的值为”Foo”;
(4)exit()方法被调用;
exit()方法中有3个参数, exc_type, exc_val, exc_tb,这些参数在异常处理中相当有用。
1 2 3 4 5 6 7 8 | import datetime x = datetime.datetime(2020, 5, 17) print(x) y = datetime.datetime.now() print(y) |
字符串转对象
1 2 3 4 5 6 7 8 9 10 | import json # 一些 JSON: x = '{ "name":"Bill", "age":63, "city":"Seatle"}' # 解析 x: y = json.loads(x) # 结果是 Python 字典: print(y["age"]) |
对象转字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import json # Python 对象(字典): x = { "name": "Bill", "age": 63, "city": "Seatle" } # 转换为 JSON: y = json.dumps(x) # 结果是 JSON 字符串: print(y) |
当 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 |
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)是一对方括号 [] 内的一组字符,具有特殊含义:
集合 | 描述 | |
---|---|---|
[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 之间的任何字符的匹配,小写或大写 | |
[+] | 在集合中,+、*、.、\ | 、()、$、{} 没有特殊含义,因此 [+] 表示:返回字符串中任何 + 字符的匹配项 |
检索字符串以查看它是否以 “China” 开头并以 “country” 结尾:
1 2 3 4 | import re txt = "China is a great country" x = re.search("^China.*country$", txt) |
方法 | 描述 |
---|---|
close() | 关闭文件。 |
detach() | 从缓冲区返回分离的原始流(raw stream)。 |
fileno() | 从操作系统的角度返回表示流的数字。 |
flush() | 刷新内部缓冲区。 |
isatty() | 返回文件流是否是交互式的。 |
read() | 返回文件内容。 |
readable() | 返回是否能够读取文件流。 |
readline() | 返回文件中的一行。 |
readlines() | 返回文件中的行列表。 |
seek() | 更改文件位置。 |
seekable() | 返回文件是否允许我们更改文件位置。 |
tell() | 返回当前的文件位置。 |
truncate() | 把文件调整为指定的大小。 |
writeable() | 返回是否能够写入文件。 |
write() | 把指定的字符串写入文件。 |
writelines() | 把字符串列表写入文件。 |
在 Python 中使用文件的关键函数是 open() 函数。
open() 函数有两个参数:文件名和模式。
有四种打开文件的不同方法(模式):
此外,您可以指定文件是应该作为二进制还是文本模式进行处理。
示例
此外,您可以指定文件是应该作为二进制还是文本模式进行处理:
1 | f = open("demofile.txt") |
以上代码等同于:
1 | f = open("demofile.txt", "rt") |
因为 “r” (读取)和 “t” (文本)是默认值,所以不需要指定它们。