python流程控制知识点总结
python变量
在强类型的编程语言中,定义变量时要指明变量的类型,而且赋值的数据也必须是相同类型的,C语言、C++、java是强类型语言的代表。
下面以 C++ 为例来演示强类型语言中变量的使用:
int n = 10; //int表示整数类型
n = 100;
n = "http://c.biancheng.net/socket/"; //错误:不能将字符串赋值给整数类型
url = "http://c.biancheng.net/java/"; //错误:没有指明类型的变量是没有定义的,不能使用。
和强类型语言相对应的是弱类型语言,Python、shell等脚本语言一般都是弱类型的。
弱类型语言有两个特点:
- 变量无须声明就可以直接赋值,对一个不存在的变量赋值就相当于定义了一个新变量。
- 变量的数据类型可以随时改变,比如,同一个变量可以一会儿被赋值为整数,一会儿被赋值为字符串。
注意,弱类型并不等于没有类型!弱类型是说在书写代码时不用刻意关注类型,但是在编程语言的内部仍然是有类型的。我们可以使用 type() 内置函数类检测某个变量或者表达式的类型,例如:
>>> num = 10
>>> type(num)
<class 'int'>
>>> num = 15.8
>>> type(num)
<class 'float'>
>>> num = 20 + 15j
>>> type(num)
<class 'complex'>
>>> type(3*15.6)
<class 'float'>
python字符串与变量的区别
若干个字符的集合就是一个字符串(String)。Python 中的字符串必须由双引号" "
或者单引号' '
包围,具体格式为:
"字符串内容"
'字符串内容'
字符串的内容可以包含字母、标点、特殊符号、中文、日文等全世界的所有文字。
下面都是合法的字符串:
- "123789"
- "123abc"
- "http://c.biancheng.net/python/"
- "C语言中文网成立8年了"
Python 字符串中的双引号和单引号没有任何区别,这里要注意与shell语法的区别,python中变量都是直接引用的,不能用引号括起来,不然python变量就变成字符串了,不是变量类型了,而shell中是可以括起来的,使用时要注意。
如何判断表达式是否为空
if 和 elif 后面的“表达式”的形式是很自由的,只要表达式有一个结果,不管这个结果是什么类型,Python 都能判断它是“真”还是“假”。
布尔类型(bool)只有两个值,分别是 True 和 False,Python 会把 True 当做“真”,把 False 当做“假”。
对于数字,Python 会把 0 和 0.0 当做“假”,把其它值当做“真”。
对于其它类型,当对象为空或者为 None 时,Python 会把它们当做“假”,其它情况当做真。比如,下面的表达式都是不成立的:
"" #空字符串
[ ] #空列表
( ) #空元组
{ } #空字典
None #空值
python代码块
python是以缩进来标记代码块的,代码块一定要有缩进,没有缩进的不是代码块。另外,同一个代码块的缩进量要相同,缩进量不同的不属于同一个代码块。
不要忘记缩进
if、elif 和 else 后面的代码块一定要缩进,而且缩进量要大于 if、elif 和 else 本身。例如,下面的代码就是一个反面教材:
age = int( input("请输入你的年龄:") )if age < 18 :
print("警告:你还未成年,不能使用该软件!")
else:
print("你已经成年,可以使用该软件。")
本例中的 print() 函数和 if、else 语句是对齐的,在同一条竖线上,都没有缩进,所以 print() 就不是 if、else 的代码块了,这会导致 Python 解释器找不到 if、else 的代码块,从而报出如下错误:
SyntaxError: expected an indented block
翻译过来就是:
语法错误:需要一个缩进的代码块
总之,if、else 后面的代码一定要缩进,否则就不能构成 if、else 的执行体。
缩进多少合适?
Python 要求代码块必须缩进,但是却没有要求缩进量,你可以缩进 n 个空格,也可以缩进 n 个 Tab 键的位置。
但是从编程习惯的角度看,我建议缩进 1 个 Tab 键的位置,或者缩进 4 个空格;它们两者其实是等价的,很多编辑器都可以将 Tab 键设置为 4 个空格,比如,IDLE 中默认 Tab 键就是 4 个空格。
所有语句都要缩进
一个代码块的所有语句都要缩进,而且缩进量必须相同。如果某个语句忘记缩进了,Python 解释器并不一定会报错,但是程序的运行逻辑往往会有问题。
age = int( input("请输入你的年龄:") )if age < 18 :print("你还未成年,建议在家人陪同下使用该软件!")
print("未成年人如果得到了家长的同意,请忽略以上提示。") #忘记缩进
这段代码并没有语法错误,但是它的运行逻辑是不对的,比如,输入 16 的运行结果如下:
请输入你的年龄:24↙
未成年人如果得到了家长的同意,请忽略以上提示。
用户的年龄分明大于 18,但是却出现了“未成年人”的提示,画面非常尴尬,这是因为第二个 print() 语句没有缩进,if 没有把它和第一个 print() 语句当做同一个代码块,所以它不是 if 执行体的一部分。解决这个错误也很容易,让第二个 print() 缩进 4 个空格即可。
同一代码块缩进量要相同
Python 虽然不限制代码块的缩进量,你可以随意缩进 n 个空格,但是同一个代码块内的所有语句都必须拥有相同的缩进量,不能一会缩进 2 个空格,一会缩进 4 个空格。下面的代码是一个反面教材:
age = int( input("请输入你的年龄:") )if age < 18 :print("你还未成年,建议在家人陪同下使用该软件!")print("未成年人如果得到了家长的同意,请忽略以上提示。") #缩进量不对
运行这段代码,Python 解释器会报出语法错误:
SyntaxError: unexpected indent
翻译过来就是:
语法错误:意外的缩进
这段代码中,第一个 print() 语句缩进了 4 个空格,第二个 print() 语句缩进了 6 个空格,缩进量不同导致它们不是同一个代码块。Python 会认为第一个 print() 语句是 if 的执行体,而第二个 print() 是一个意外的存在,不知道该把它当做谁的代码块,所以解析失败,报错。
总之,位于同一个代码块中的所有语句必须拥有相同的缩进量,多一个空格或者少一个空格都不行。
不要随便缩进
另外需要注意的是,不需要使用代码块的地方千万不要缩进,一旦缩进就会产生一个代码块。下面的代码是一个反面教材:
info = "Python教程的网址是:http://c.biancheng.net/python/"print(info)
这两条简单的语句没有包含分支、循环、函数、类等结构,不应该使用缩进。
Python if语句嵌套
前面章节中,详细介绍了 3 种形式的条件语句,即 if、if else 和 if elif else,这 3 种条件语句之间可以相互嵌套。
例如,在最简单的 if 语句中嵌套 if else 语句,形式如下:
if 表达式 1:if 表示式 2:代码块 1else:代码块 2
再比如,在 if else 语句中嵌套 if else 语句,形式如下:
if 表示式 1:if 表达式 2:代码块 1else:代码块 2
else:if 表达式 3:代码块 3else:代码块 4
python中,if、if else 和 if elif else 之间可以相互嵌套。因此,在开发程序时,需要根据场景需要,选择合适的嵌套方案。需要注意的是,在相互嵌套时,一定要严格遵守不同级别代码块的缩进规范。
【实例】判断是否为酒后驾车
如果规定,车辆驾驶员的血液酒精含量小于 20mg/100ml 不构成酒驾;酒精含量大于或等于 20mg/100ml 为酒驾;酒精含量大于或等于 80mg/100ml 为醉驾。先编写 Python 程序判断是否为酒后驾车。
通过梳理思路,是否构成酒驾的界限值为 20mg/100ml;而在已确定为酒驾的范围(大于20mg/100ml)中,是否构成醉驾的界限值为 80mg/100ml,整个代码执行流程应如图 1 所示。
图 1 执行流程示意图
由此,我们可以使用两个 if else 语句嵌套来实现:
proof = int(input("输入驾驶员每 100ml 血液酒精的含量:"))
if proof < 20:print("驾驶员不构成酒驾")
else:if proof < 80:print("驾驶员已构成酒驾")else:print("驾驶员已构成醉驾")
运行结果为:
输入驾驶员每 100ml 血液酒精的含量:10
驾驶员不构成酒驾
除此之外,if分支结构中还可以嵌套循环结构,同样,循环结构中也可以嵌套分支结构。
Python pass空语句
在实际开发中,有时候我们会先搭建起程序的整体逻辑结构,但是暂时不去实现某些细节,而是在这些地方加一些注释,方面以后再添加代码,请看下面的例子:
age = int( input("请输入你的年龄:") )if age < 12 :print("婴幼儿")
elif age >= 12 and age < 18:print("青少年")
elif age >= 18 and age < 30:print("成年人")
elif age >= 30 and age < 50:#TODO: 成年人
else:print("老年人")
当年龄大于等于 30 并且小于 50 时,我们没有使用 print() 语句,而是使用了一个注释,希望以后再处理成年人的情况。当python执行到该 elif 分支时,会跳过注释,什么都不执行。
但是 Python 提供了一种更加专业的做法,就是空语句 pass。pass 是 Python 中的关键字,用来让解释器跳过此处,什么都不做。
就像上面的情况,有时候程序需要占一个位置,或者放一条语句,但又不希望这条语句做任何事情,此时就可以通过 pass 语句来实现。使用 pass 语句比使用注释更加优雅。
使用 pass 语句更改上面的代码:
age = int( input("请输入你的年龄:") )if age < 12 :print("婴幼儿")
elif age >= 12 and age < 18:print("青少年")
elif age >= 18 and age < 30:print("成年人")
elif age >= 30 and age < 50:pass
else:print("老年人")
运行结果:
请输入你的年龄:40↙
从运行结果可以看出,程序虽然执行到第 10 行代码,但是并没有进行什么操作。
python assert 断言函数
python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行;反之,Python 解释器会报 AssertionError 错误。
assert 语句的语法结构为:
assert 表达式
assert 语句的执行流程可以用 if 判断语句表示,如下所示:
if 表达式==True:
程序继续执行
else:
程序报 AssertionError 错误
有读者可能会问,明明 assert 会令程序崩溃,为什么还要使用它呢?这是因为,与其让程序在晚些时候崩溃,不如在错误条件出现时,就直接让程序崩溃,这有利于我们对程序排错,提高程序的健壮性。
因此,assert 语句通常用于检查用户的输入是否符合规定,还经常用作程序初期测试和调试过程中的辅助工具。这里假设 网站在做 VIP 促销活动,准备进行打折,现需要写一个 apply_discount() 函数,要求是,向该函数传入原来的价格和折扣力度,该函数返回打折后的价格。
apply_discount() 大致应该写成如下这样:
#price 为原价,discount 为折扣力度
def apply_discount(price, discount):updated_price = price * (1 - discount)assert 0 <= updated_price <= price, '折扣价应在 0 和原价之间'return updated_price
可以看到,在计算新价格的后面,添加了一个 assert 语句,用来检查折后价格,这里要求新折扣价格必须大于等于 0、小于等于原来的价格,否则就抛出异常。
我们可以试着输入几组数,来验证一下这个功能:
print(apply_discount(100,0.2))
print(apply_discount(100,1.1))
运行结果为:
80.0
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\demo.py", line 7, in <module>
print(apply_discount(100,1.1))
File "C:\Users\mengma\Desktop\demo.py", line 4, in apply_discount
assert 0 <= updated_price <= price, '折扣价应在 0 和原价之间'
AssertionError: 折扣价应在 0 和原价之间
可以看到,当 discount 是 0.2 时,输出 80 没有问题,但是当 discount 为 1.1 时,程序便抛出下面 AssertionError 异常。
这样一来,如果开发人员修改相关的代码,或者是加入新的功能,导致 discount 数值异常时,只要运行程序就很容易能发现问题,这也从侧面印证了前面多讲的,assert 的加入可以有效预防程序漏洞,提高程序的健壮性。
另外,在实际工作中,assert 还有一些很常见的用法,例如:
def func(input):assert isinstance(input, list), '输入内容必须是列表'# 下面的操作都是基于前提:input 必须是 listif len(input) == 1:...elif len(input) == 2:...else:...
上面代码中,func() 函数中的所有操作都基于输入必须是列表这个前提。所以很有必要在开头加一句 assert 的检查,防止程序出错。
以上给大家介绍了 2 个有关 assert 的使用场景,很多读者可能觉得,assert 的作用和 if 语句非常接近,那么他们之间是否可以相互替代呢?
要注意,前面讲过,assert 的检查是可以被关闭的,比如在命令行模式下运行 Python 程序时,加入 -O 选项就可以使程序中的 assert 失效。一旦 assert 失效,其包含的语句也就不会被执行。
假设只有 VIP 用户才可以阅读 VIP 文章,我们可以设计如下这个函数来模式判断用户身份的功能:
def login_user_identity(user_id):#凭借用户 id 判断该用户是否为 VIP 用户assert user_is_Vip(user_id) "用户必须是VIP用户,才能阅读VIP文章"read()
此代码从代码功能角度上看,并没有问题,但在实际场景中,基本上没人会这么写,因为一旦 assert 失效,则就造成任何用户都可以阅读 VIP 文章,这显然是不合理的。
所以正确的做法是,使用 if 条件语句替代 assert 语句进行相关的检查,并合理抛出异常:
def login_user_identity(user_id):#凭借用户 id 判断该用户是否为 VIP 用户if not user_is_Vip(user_id):raise Exception("用户必须是VIP用户,才能阅读VIP文章")read()
总之,不能滥用 assert,很多情况下,程序中出现的不同情况都是意料之中的,需要用不同的方案去处理,有时用条件语句进行判断更为合适,而对于程序中可能出现的一些异常,要记得用 try except 语句处理。
python while循环语句
python中,while 循环和 if 条件分支语句类似,即在条件(表达式)为真的情况下,会执行相应的代码块。不同之处在于,只要条件为真,while 就会一直重复执行那段代码块。
while 语句的语法格式如下:
while 条件表达式:
代码块
这里的代码块,指的是缩进格式相同的多行代码,不过在循环结构中,它又称为循环体。
while 语句执行的具体流程为:首先判断条件表达式的值,其值为真(True)时,则执行代码块中的语句,当执行完毕后,再回过头来重新判断条件表达式的值是否为真,若仍为真,则继续重新执行代码块...如此循环,直到条件表达式的值为假(False),才终止循环。
while 循环结构的执行流程如图 1 所示。
图 1 while 循环语句执行流程示意图
例如,打印 1~100 的所有数字,就可以使用 while 循环,实现代码如下:
# 循环的初始化条件
num = 1
# 当 num 小于100时,会一直执行循环体
while num < 100 :print("num=", num)# 迭代语句num += 1
print("循环结束!")
运行程序会发现,程序只输出了 1~99,却没有输出 100。这是因为,当循环至 num 的值为 100 时,此时条件表达式为假(100<100),当然就不会再去执行代码块中的语句,因此不会输出 100。
注意,在使用 while 循环时,一定要保证循环条件有变成假的时候,否则这个循环将成为一个死循环。所谓死循环,指的是无法结束循环的循环结构,例如将上面 while 循环中的num += 1
代码注释掉,再运行程序你会发现,Python 解释器一直在输出"num= 1",永远不会结束(因为 num<100 一直为 True),除非我们强制关闭解释器。
再次强调,只要位于 while 循环体中的代码,其必须使用相同的缩进格式(通常缩进 4 个空格),否则 Python 解释器会报 SyntaxError 错误(语法错误)。例如,将上面程序中num+=1
语句前移一个空格,再次执行该程序,此时 Python 解释器就会报 SyntaxError 错误。
python for循环
python for 循环,它常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素。
for 循环的语法格式如下:
for 迭代变量 in 字符串|列表|元组|字典|集合:
代码块
格式中,迭代变量用于存放从序列类型变量中读取出来的元素,所以一般不会在循环中对迭代变量手动赋值;代码块指的是具有相同缩进格式的多行代码(和 while 一样),由于和循环结构联用,因此代码块又称为循环体。
for 循环语句的执行流程如图 1 所示。
图 1 for 循环语句的执行流程图
下面的程序演示了 for 循环的具体用法:
add = "python"
#for循环,遍历 add 字符串
for ch in add:print(ch,end="")
运行结果为:
python
可以看到,使用 for 循环遍历 add 字符串的过程中,迭代变量 ch 会先后被赋值为 add 字符串中的每个字符,并代入循环体中使用。只不过例子中的循环体比较简单,只有一行输出语句。
for循环遍历列表和元组
当用 for 循环遍历 list 列表或者 tuple 元组时,其迭代变量会先后被赋值为列表或元组中的每个元素并执行一次循环体。
下面程序使用 for 循环对列表进行了遍历:
my_list = [1,2,3,4,5]
for ele in my_list:print('ele =', ele)
程序执行结果为:
ele = 1
ele = 2
ele = 3
ele = 4
ele = 5
for 循环遍历字典
在使用 for 循环遍历字典时,经常会用到和字典相关的 3 个方法,即 items()、keys() 以及 values(),它们各自的用法已经在前面章节中讲过,这里不再赘述。当然,如果使用 for 循环直接遍历字典,则迭代变量会被先后赋值为每个键值对中的键。
例如:
my_dic = {'python教程':"python",\
'shell教程':" shell",\
'java教程':"java"}
for ele in my_dic:print('ele =', ele)
程序执行结果为:
ele = python教程
ele = shell教程
ele = java教程
总结:直接遍历字典,和遍历字典 keys() 方法的返回值是相同的。
除此之外,我们还可以遍历字典 values()、items() 方法的返回值。例如:
my_dic = {'python':"python",\
'shell':"shell",\
'java':"java"}
for ele in my_dic.items():print('ele =', ele)
程序执行结果为:
ele = ('python', 'python')
ele = ('shell', 'shell')
ele = ('java', 'java')
python中,无论是 while 循环还是 for 循环,其后都可以紧跟着一个 else 代码块,它的作用是当循环条件为 False 跳出循环时,程序会最先执行 else 代码块中的代码。
以 while 循环为例,下面程序演示了如何为 while 循环添加一个 else 代码块:
add = "python"
i = 0
while i < len(add):print(add[i],end="")i = i + 1
else:print("\n执行 else 代码块")
程序执行结果为:
python
执行 else 代码块
上面程序中,当i==len(add)
结束循环时(确切的说,是在结束循环之前),Python 解释器会执行 while 循环后的 else 代码块。
python循环嵌套
python不仅支持 if 语句相互嵌套,while 和 for 循环结构也支持嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,甚至 while 中有 for 或者 for 中有 while 也都是允许的。
当 2 个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称为外层循环或外循环,位于内层的循环结构常简称为内层循环或内循环。
循环嵌套结构的代码,Python 解释器执行的流程为:
- 当外层循环条件为 True 时,则执行外层循环结构中的循环体;
- 外层循环体中包含了普通程序和内循环,当内层循环的循环条件为 True 时会执行此循环中的循环体,直到内层循环条件为 False,跳出内循环;
- 如果此时外层循环的条件仍为 True,则返回第 2 步,继续执行外层循环体,直到外层循环的循环条件为 False;
- 当内层循环的循环条件为 False,且外层循环的循环条件也为 False,则整个嵌套循环才算执行完毕。
循环嵌套的执行流程图如图 1 所示:
图 1 循环嵌套的执行流程图
这里以冒泡排序算法演示循环嵌套,冒泡排序算法的实现思想遵循以下几步:
- 比较相邻的元素,如果第一个比第二个大,就交换它们两个。
- 从最开始的第一对到结尾的最后一对,对每一对相邻元素做步骤 1 所描述的比较工作,并将最大的元素放在后面。这样,当从最开始的第一对到结尾的最后一对都执行完后,整个序列中的最后一个元素便是最大的数。
- 将循环缩短,除去最后一个数(因为最后一个已经是最大的了),再重复步骤 2 的操作,得到倒数第二大的数。
- 持续做步骤 3 的操作,每次将循环缩短一位,并得到本次循环中的最大数。直到循环个数缩短为 1,即没有任何一对数字需要比较,此时便得到了一个从小到大排序的序列。
通过分析冒泡排序算法的实现原理,要想实现该算法,需要借助循环结构,更确切地说,需要使用嵌套循环结构,使用 for 循环或者 while 循环都可以。
例如,使用 for 循环实现用冒泡排序算法对 [5,8,4,1] 进行排序:
data = [5,8,4,1]
#实现冒泡排序
for i in range(len(data)-1):for j in range(len(data)-i-1):if(data[j]>data[j+1]):data[j],data[j+1] = data[j+1],data[j]
print("排序后:",data)
运行结果为:
排序后: [1, 4, 5, 8]
可以看到,实现冒泡排序使用了 2 层循环,其中外层循环负责冒泡排序进行的次数,而内层循环负责将列表中相邻的两个元素进行比较,并调整顺序,即将较小的放在前面,较大的放在后面。
python流程控制知识点总结相关推荐
- 一文了解Python流程控制
本文主要介绍 Python 的流程控制,包括 if.while.for 的用法以及一些注意事项等.阅读本文预计需要 8 min. Python入门之Python流程控制 1. 前言 2. 条件控制语句 ...
- python流程控制-实战案例手把手教你Python流程控制技巧
原标题:实战案例手把手教你Python流程控制技巧 作者:PianoOrRock 来源: http://blog.csdn.net/pianoorrock/article/details/711315 ...
- Python学习:深入Python流程控制
本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python简介 目录: 目录: 4. 深入 Python 流程控制 4.1. if ...
- 【Python基础入门系列】第04天:Python 流程控制
在编程的世界中,流程控制是程序员运行的基础,流程控制决定了程序按照什么样的方式去执行,本节给大家介绍 Python 流程控制相关语法. if 语句 if 语句表示如何发生什么样的条件,执行什么样的逻辑 ...
- python第五周项目答案_工作页python流程控制(第五周 ).doc_学小易找答案
[单选题]Mary is ()hardworking than her sister, but she failed in the exam. (5.0分) [单选题]设a.b为float型变量,则以 ...
- python流程控制-Python流程控制常用工具详解
在我们的工作中,我们使用ddagent ver.5作为收集工具,收集和报告托管服务器的性能指标,并对ddagent进行一定程度的定制.经过多次功能迭代,发现一批在线运行时间长的托管服务器占用了太多内存 ...
- python流程控制-Python | 流程控制
上一篇:<Python | list和while> 上篇文章中,介绍了while语句,这一章中,继续学习新的流程控制语句. 「 if 」� if语句是最常见的语句,几乎所有变成语言中都有这 ...
- python流程控制-Python流程控制
基本运算符: 算术运算符: ---+ - * / % // ** # 返回一个数值 位运算符: 二进制 / 十进制 / 十六进制 成员运算: 判断元素是否在容器类元素里面(字符串)**** in no ...
- python流程控制-详解Python流程控制语句
流程控制 流程:代码执行的过程 控制:对代码执行过程的把控 三大结构 顺序结构:代码默认从上到下,依次执行 分支结构:单项分支,双向分支,多项分支,巢状分支 循环结构:while循环和for循环 单项 ...
最新文章
- C++/STL Bitset (转)
- 关于计算机专业的作文800字,我的电脑作文800字范文
- git强制推送_Git 常用命令
- Python爬虫淘宝商品详情页价格、类似数据
- java socket调用接口_java调用websocket接口
- 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了)
- KubeEdge 实践过程的记录
- 黑客利用未修复的 Atlassian 服务器攻击电信运营商和 ISP
- [postgresql]postgresql的VACUUM 介绍
- mysql msdtc 不支持_MSDTC”该伙伴事务管理器已经禁止了它对远程网络事务的支持”的错误(转) | 学步园...
- python report_python之reportlab
- sunlight的中文_Diana Vickers的Sunlight中文歌词。
- 让android支持AZERTY法语键盘
- Verilog语言入门
- 武汉地铁行业投资价值与运营管理分析报告2022版
- 图像控制点 形变_基于控制点的图像变形方法的研究与实现
- 通过室内LED光打造世界的标志
- openGauss数据库源码解析系列文章--openGauss简介(一)
- php絮凝剂是什么_聚丙烯酰胺为何叫有机高分子絮凝剂?
- JavaScript合并网页表格中内容相同的相邻单元格
热门文章
- 《华为音乐播放器项目》——2.静态页面实现
- java面试官看到这些面试答案只会点头:过了过了,明天直接上班
- OSG入门_场景图形与OpenSceneGraph概述00
- MongoDB查询分组并获取TopN数据
- 浙大版数据结构学习系列内容汇总
- 联想 小新 Pro 14/16、Air 14/ 14 Plus 2022 款评测 联想小新 Pro 14、联想小新 Pro16、联想Air 14、联想14 Plus 2022款怎么样
- C语言多人聊天室,Socket网络编程
- 业余时间可以做什么兼职副业?盘点几个业余兼职副业方式
- 恢复误删的git分支
- CopyOnWriteArrayList的使用场景