-
环境管理、包管理
-
单引号与双引号同时支持,相同效果
-
范围相关的都遵循:左闭右开,支持步长
-
换行 或 分号
;
表示语句结束 -
注释
#
单行注释""" """
或''' '''
多行注释
-
数据类型
-
整型
int
0b100 == 4
、0o100 == 64
、0x100 == 256
-
浮点型
float
123.456 == 1.23456e2
-
字符串型
str
单引号、双引号,
'''
或"""
支持换行字符串(\n
可以用回车换行表示)r'字符串'
或R'字符串'
(也支持'''
或"""
):原始字符串、不会转义
-
布尔型
bool
True
、False
-
-
变量惯例:
- 变量名通常使用小写英文字母,多个单词用下划线
_
进行连接 - 受保护的变量用单个下划线
_
开头 - 私有的变量用两个下划线
__
开头
- 变量名通常使用小写英文字母,多个单词用下划线
-
(与JS不同的运算符)
:=
、==
、!=
、not
、or
、and
、//
、is
、is not
、in
、not in
-
if 「条件」:
(没有小括号)、()
elif 「条件」:
、else"
- 支持
值1 <= 变量 < 值2
- 支持
-
for 变量 in 列表或元组或集合或字符串或字典或range(参数):
for _ in xx:
不使用索引 -
for、if等可以放在表达式中
e.g.
items = [i for i in range(1, 100)]
、items = [i for i in range(1, 100) if i % 3 == 0 or i % 5 == 0]
、items = [i ** 2 for i in range(1, 100) if i % 3 == 0 or i % 5 == 0]
-
break
、continue
仅针对当前循环 -
Python中没有用花括号
来构造代码块,而是使用缩进的方式来表示代码的层次结构{}
-
match-case
case 值1 | 值2 | 值3:
case _:
默认匹配
-
内置函数
:不需要就能够直接使用的函数import
-
input(「描述值或变量」)
-
print
-
print(值或变量)
-
print('浮点数%f' % 变量1)
、print('浮点数%.1f 整数%d 字符串%s' % (变量1, 变量2, 变量3))
-
print(f'{变量1} {变量2:.2f}')
- 同时输出变量名:
print(f'{变量1 = } {变量2 = :.3f}')
- 同时输出变量名:
-
print(变量 := 10)
既能输出又能赋值(报错)print(变量 = 10)
-
print(f'\033[0m...\033[0m')
控制输出内容的颜色
-
-
type(变量名或值)
检查类型 -
range(多个参数)
产生整数序列range(101)
:可以用来产生0到100范围的整数,需要注意的是取不到101range(1, 101)
:可以用来产生1到100范围的整数,相当于是左闭右开的设定,即[1, 101)range(1, 101, 2)
:可以用来产生1到100的奇数,其中2是步长(跨度),即每次递增的值,101取不到range(100, 0, -2)
:可以用来产生100到1的偶数,其中-2是步长(跨度),即每次递减的值,0取不到
-
len(列表或元组或字符串或序列或集合或字典等)
-
list()
将其他序列变成列表 -
dict()
-
-
需要
import
才能使用的内置模块math
、random
、string
、operator
、functools
、time
-
import math
(仅导入了math
)、from math import factorial
(仅导入了factorial
)、from math import factorial as f
(仅导入了f
)- 同名的后导入 覆盖 同名的前导入
-
列表(list)
-
列表是一种可变容器
-
[多个项]
直接创建字面量列表 -
列表支持正向索引、反向索引、切片索引(
[start:end:stride]
若start值等于0,则可以省略;若end值等于列表长度,则可以省略;若stride值等于1,则可以省略。支持批量修改切片) -
两个列表可以做关系运算(
<=
、<
、>
、>=
、==
、!=
),逐个按顺序对比每个项 -
运算符支持:
列表 + 列表
、列表 * 整数
-
in
、not in
-
生成式创建法
e.g.
items = [i for i in range(1, 100) if i % 3 == 0 or i % 5 == 0]
、items2 = [num ** 2 for num in items]
使用列表生成式创建列表不仅代码简单优雅,而且性能上也优于使用
for-in
循环和append
方法向空列表中追加元素的方式。为什么说生成式有更好的性能呢,那是因为 Python 解释器的字节码指令中有专门针对生成式的指令(LIST_APPEND指令);而for循环是通过方法调用(LOAD_METHOD和CALL_METHOD指令)的方式为列表添加元素,方法调用本身就是一个相对比较耗时的操作。强烈建议用生成式语法来创建列表。
-
-
元组(tuple)
-
元组是不可变类型
-
类似列表的大部分操作
-
()
(空元组)、(值, )
(一元组:必须加逗号,否则是改变运算优先级的圆括号) -
打包、解包
*
解包成列表(0或多个元素)
-
-
集合(set)
-
集合是可变类型
-
创建
e.g.
set1 = {1, 2, 3, 3, 3, 2} // 至少一个元素,若无元素则是空字典:{} print(set1) set2 = {'banana', 'pitaya', 'apple', 'apple', 'banana', 'grape'} print(set2) set3 = set('hello') print(set3) set4 = set([1, 2, 2, 3, 3, 3, 2, 1]) print(set4) set5 = {num for num in range(1, 20) if num % 3 == 0 or num % 7 == 0} print(set5)
-
集合中的元素必须是
hashable类型
所谓hashable类型指的是能够计算出哈希码的数据类型,通常不可变类型都是hashable类型,如整数(int)、浮点小数(float)、布尔值(bool)、字符串(str)、元组(tuple)等。可变类型都不是hashable类型,因为可变类型无法计算出确定的哈希码,所以它们不能放到集合中。例如:我们不能将列表作为集合中的元素;同理,由于 集合 本身也是可变类型,所以集合也不能作为集合中的元素。我们可以创建出嵌套列表(列表的元素也是列表),但是我们不能创建出嵌套的集合。
-
in
、not in
-
交集(
&
、set1.intersection(set2)
)、并集(|
、set1.union(set2)
)、差集(-
、set1.difference(set2)
)、对称差(^
、set1.symmetric_difference(set2)
) -
比较运算:
==
、!=
、<
、<=
(set1.issubset(set2)
)、>
(set1.issuperset(set2)
)、>=
- 不可变集合(frozenset)
集合的成员运算在性能上要优于列表的成员运算。
-
-
字典(dictionary)
-
字典是可变类型
-
创建
e.g.
empty = {} // 是 空字典;不是 空集合 xinhua = { '麓': '山脚下', '路': '道,往来通行的地方;方面,地区:南~货,外~货;种类:他俩是一~人', '蕗': '甘草的别名', '潞': '潞水,水名,即今山西省的浊漳河;潞江,水名,即云南省的怒江' } print(xinhua) person = { 'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武侯区科华北路62号1栋101', 'tel': '13122334455', 'emergence contact': '13800998877' } print(person) # dict函数(构造器)中的每一组参数就是字典中的一组键值对 person = dict(name='王大锤', age=55, height=168, weight=60, addr='成都市武侯区科华北路62号1栋>101') print(person) # {'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武>侯区科华北路62号1栋101'} # 可以通过Python内置函数zip压缩两个序列并创建字典 items1 = dict(zip('ABCDE', '12345')) print(items1) # {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'} items2 = dict(zip('ABCDE', range(1, 10))) print(items2) # {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5} # 用字典生成式语法创建字典 items3 = {x: x ** 3 for x in range(1, 6)} print(items3) # {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
-
字典中的 键 必须是不可变类型
-
-
函数
def
-
位置参数、关键字参数
e.g.
def make_judgement(a, b, c): """判断三条边的长度能否构成三角形""" return a + b > c and b + c > a and a + c > b # 位置参数 print(make_judgement(1, 2, 3)) # False print(make_judgement(4, 5, 6)) # True # 关键字参数 print(make_judgement(b=2, c=3, a=1)) # False print(make_judgement(c=6, b=4, a=5)) # True
- 用
/
设置强制位置参数(positional-only arguments):只能按照参数位置来接收参数值的参数 - 用
*
设置命名关键字参数:只能通过参数名=参数值
的方式来传递和接收参数
e.g.
# / 前面的参数是强制位置参数 def make_judgement(a, b, c, /): """判断三条边的长度能否构成三角形""" return a + b > c and b + c > a and a + c > b # 下面的代码会产生TypeError错误,错误信息提示“强制位置参数是不允许给出参数名的” # TypeError: make_judgement() got some positional-only arguments passed as keyword arguments # print(make_judgement(b=2, c=3, a=1)) # * 后面的参数是命名关键字参数 def make_judgement(*, a, b, c): """判断三条边的长度能否构成三角形""" return a + b > c and b + c > a and a + c > b # 下面的代码会产生TypeError错误,错误信息提示“函数没有位置参数但却给了3个位置参数” # TypeError: make_judgement() takes 0 positional arguments but 3 were given # print(make_judgement(1, 2, 3))
- 用
-
默认参数
=
、可变参数*变量
(元组)**变量
(字典) -
del 方法名(变量名: 类型名, 变量 = 1) -> 类型名:
标注参数的类型、标注函数返回值的类型,虽然它对代码的执行结果不产生任何影响,但是很好的增强了代码的可读性。
-
Python中的函数是“一等函数”,所谓“一等函数”指的就是函数可以赋值给变量,函数可以作为函数的参数,函数也可以作为函数的返回值
把一个函数作为其他函数的参数或返回值的用法,我们通常称之为“高阶函数”
-
lambda函数(匿名函数)
lambda 参数1, 参数2: 返回值的表达式
- Python中的lambda函数是没有的名字函数
- lambda函数只能有一行代码,代码中的表达式产生的运算结果就是这个匿名函数的返回值
-
装饰器
Python语言中,装饰器是“用一个函数装饰另外一个函数并为其提供额外的能力”的语法现象。装饰器本身是一个函数,它的参数是被装饰的函数,它的返回值是一个带有装饰功能的函数。通过前面的描述,相信大家已经听出来了,装饰器是一个高阶函数,它的参数和返回值都是函数。
-
- Beautiful is better than ugly. (优美比丑陋好)
- Explicit is better than implicit.(清晰比晦涩好)
- Simple is better than complex.(简单比复杂好)
- Complex is better than complicated.(复杂比错综复杂好)
- Flat is better than nested.(扁平比嵌套好)
- Sparse is better than dense.(稀疏比密集好)
- Readability counts.(可读性很重要)
- Special cases aren't special enough to break the rules.(特殊情况也不应该违反这些规则)
- Although practicality beats purity.(但现实往往并不那么完美)
- Errors should never pass silently.(异常不应该被静默处理)
- Unless explicitly silenced.(除非你希望如此)
- In the face of ambiguity, refuse the temptation to guess.(遇到模棱两可的地方,不要胡乱猜测)
- There should be one-- and preferably only one --obvious way to do it.(肯定有一种通常也是唯一一种最佳的解决方案)
- Although that way may not be obvious at first unless you're Dutch.(虽然这种方案并不是显而易见的,因为你不是那个荷兰人[这里指的是Python之父Guido])
- Now is better than never.(现在开始做比不做好)
- Although never is often better than right now.(不做比盲目去做好[极限编程中的YAGNI原则])
- If the implementation is hard to explain, it's a bad idea.(如果一个实现方案难于理解,它就不是一个好的方案)
- If the implementation is easy to explain, it may be a good idea.(如果一个实现方案易于理解,它很有可能是一个好的方案)
- Namespaces are one honking great idea -- let's do more of those!(命名空间非常有用,我们应当多加利用)