一、语法
1、代码规范
1)使用缩进来划分代码块
2)支持数据类型
类型 | ||
---|---|---|
整形 | int | |
浮点型 | float | |
字符串 | ||
列表 | list | 区别数组,数组是一组相同类型的元素,列表可以元素类型不同 |
元组 | ||
字典 | ||
集合 | ||
布尔型 | 和C一样,非0都为真,0为假,如果是序列(或字符串),长度不为0为真,为0为假 | |
可迭代对象 | 类似列表,但不一样,range()返回的为可迭代对象 |
对于字符串,“…”或‘…’表示一行,“““…”””或‘‘‘…’’’表示多行
字符串的处理:
@1 字符串可以类似C中的下标(索引)获取一个字符,并且支持负数,表示倒数第几个
@2 使用:来切片,提取子字符串,str[n:m]表示提取str的从n下标开始m长度的字符串,m省略为0,n省略为全部
@3 索引越界会报错,切片越界解释器会自己处理
列表:
@1 支持索引和切片操作,列表切片,操作同字符串,返回的仍为列表(发生copy)
@2 为切片赋值相当于修改元素(不发生copy吗?),如果为空,相当于删除元素
@3 不同于字符串,列表元素可以修改
@4 嵌套列表,相当于实现一个行列式了,索引方位类型二维(多维)数组
3)运算符
符号 | |
---|---|
+ | 算术运算的加法,字符串连接,列表合并 |
- | |
* | 算术运算的乘法,作用字符表示重复几次,解包时 |
/ | 除法 |
** | 指数运算 |
= | 赋值运算 |
< | |
<= | |
> | |
>= | |
== | |
!= |
@1 多重赋值
我们一般的赋值操作都是a = 1,多重赋值为这样 a,b = 1, 2 ,相当于a=1,b=2
对于多重赋值,也可以用可迭代对象作为右值,可迭代对象包括,列表,元组,字典,字符串,生成器
@2 压包和解包
解包
结合多重赋值,右值为可迭代对象,这种操作称为解包。
例如:
a = [1, 2, 3, 4]
x,y,z,w = [1, 2, 3, 4]
将一个列表赋值给了变量,叫解包。
或者
x,y,*z = [1, 2, 3, 4]
那么z将输出列表为
z = [3, 4]
如果这样
x,y,*_ = [1, 2, 3, 4]
那么只有xy有值,后面的都忽略
压包(zip)
a = [1, 2, 3]
b = [4, 5, 6]
zip(a, b)
zip返回一个迭代对象,可以用for遍历,遍历结果为
(1, 4)
(2, 5)
(3, 6)
4)关键字
关键字 | ||
---|---|---|
as |
2、流程控制
1)条件语句
if
# 一个条件
if x<10:
...
# 多个条件
if x<10:
...
else if x>100:
...
# elif是else if的缩写
elif x>20:
...
else:
...
match语句类似switch case
第一种方式,status为数值(字面值模式)
match status:
case 100:
print(100)
case 200:
print(200)
case 300 | 400:
print(200, 400)
case _:
print("othre")
第二种方式 ,status为一个元组,元组元素可以为变量。
match status:
case (1, 2):
print(1)
case (x, y):
print(2)
case _:
print(3)
第三种方式,status为一个类对象,对象实例化的时候可以默认参数顺序,也可以指定参数赋值。
class Point
x: int
y: int
match point:
case Point(0, 1):
print(1)
case Point(x=0, y=1):
print(2)
case Point(y=1, x=0)
print(3)
case _:
print(4)
第四种方式,status为列表,比较列表是否相同。
match status:
case []:
print(1)
case [1]:
print(2)
case [1, 2]:
print(3)
case _:
print(4)
守护项,在case后面添加if语句。
先执行case,再执行守护项,如果守护项的值为假,那么这个case就跳过了。
match status:
case (1, 2):
print(1)
case (x, y) if x>y:
print(2)
case _:
print(3)
@1 方式类似switch case,分支条件可以用|(或)组合,“_”代表default
如果需要一个值和多个值比较,用match方法
2) 循环语句
while
for
python中的for语句,依赖某个序列,不同于C,类似于shell
在用for遍历集合的时候,注意集合的竞态导致错误的结果
varlist = [1, 2, 3, 4, 5, 6]
for var in varlist:
print(var)
使用for按索引迭代列表
varlist = [1, 2, 3, 4, 5, 6]
for i in range(len(varlist)):
print(varlist[i])
enumerate() ???
break
break功能和C类似。
对于for可以有else子句,else子句在这个for执行break后会执行。
continue
同C。
pass
pass是一条空语句,类似C中的 ; 。
3、函数
1) 定义函数
def (var, ...)
"""文档字符串(单行)"""
...
# 如果有返回调用return
return ret
def (var, ...)
"""文档字符串(多行)
多行第二行需要换行后写
"""
...
2)传参
@1 默认参数,给传参初始化一个值,如果调用时未传参,则使用默认值(类似C++的默认参数)
不同的是,python的默认参数可以是变量,但是参数默认值在定义的时候值就确定了,
更进一步,python的默认参数,只在定义时计算一次
@2 必选参数,没有默认值得为必选参数,调用时必须赋值
!!! 感觉对象作为参数的时候,类似于C++中的引用,代码里面可以修改掉
@3 位置参数和kv(关键字)参数
当函数定义了默认参数后,没有指定默认参数的为必选参数(调用函数时必须赋值),指定了默认值得参数为可选参数
在调用函数时,直接传参的称为位置参数,kv方式传参的称为关键字参数
调用函数必须遵循一下规则:
(1)必选参数必须赋值
(2)可选参数可以赋值也可以不赋值
(3)关键字参数必须在位置参数之后传参
(4)关键字参数必须是定义时声明过得参数
(5)在意义上同一个参数不能赋值2次,
什么是在意义上???
比如传了一个位置参数和关键字参数,而这个关键字参数的关键字刚好是一个必选参数,那么在意义上这个必选参数就相当于传了2次。
比如:
def func(key, var=2)
...
func(10, key=11)
10首先赋值给key,后面看到有用关键字参数方式给key赋值为11,会报错。
(5)关键字参数可以乱序
@4 * * arg和*arg形参
**arg传参为字典,接受所有剩余的关键字参数
arg形参接受一个元组,接受所有剩余的位置参数
所以arg必须在前面,如果这2个形参都有的话
@5 函数定义的位置参数传参和关键字传参
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2)
/ 前面的只能位置传参,* 后面的只能关键字传参,中间的既可以位置传参,又可以关键字传参。