自从 由美国主导openAi公司开发的gpt大模型问世以来,人工智能技术一直在推动整个科技行业发展,所以当下全球大公司都在布局Ai产品应用,这是这二年出了好几千个Ai产品应用,全球大大小小甚至超出近上万的Ai模型,当下的百模大战,犹如春秋战国的百家争鸣。不少作因此定为这二年为人工智能爆发元年,很多所以企业都在尝试将自己的业务和大模型融合,造成了当下越来越多的企来需要懂Ai应用开发,企业不一定需要自己开发大模型,只需要本地购建大模型,进行参数微调,业务对接,就可以将自己的业务和Ai融合,由于基于python人工智能开发,大部份教学都 是python方便实验,是一种解释型、面向对象、动态数据类型的高级程序设计语言。被称为胶水语言,就导致在人工智能时代,python会得到越来越的应用场景,加上python 开发快捷,效率高,在初创公班司最早的跑出产品demo ,所以也造 成了越来越多公司在采用python做开发,并且pyton 语言易于表达的天性,广泛应用三维设计,Python 应用场景广泛,软件编程 ,人工智能, 机器学习,数据分析,科学研究,等领域,所以作为一个程序员python是当下必要学的一门语言,本次整理文档就是以python 为基础,涉及数据获取,分析,整理,大模型接入,接口调用,业务融合,方便家快速学习的文档

所以整理一下python 基础应用开发,

初始环境,安装python  并配置编辑器,设置编码为utf-8

基础概念:进制与字节

  • ASCII 255        1bytes   最早的计算机内存和设计的原因,内存很少,加上当时设计的时候,只考虑了以英文为主的编码,这个只能装256位表达的字节编吗叫  Ascll
  • 1980 gb2312    7xxx      当计算机内存加大发发展到1980时候,开始支持中文编码,包括6763个汉字和682个其它符号。
  • 1995 GBK1.0    2w+   增加少数民族字符,增加各种符号字节
  • 2000 GB18030   27xxx
  • unicode 2bytes     全球统一字节,支持所有国家的字节表示
  • utf-8en: 1byte,zh: 3bytes    经过压缩优化后的字节,也就是我们以后优先选 用的字节编码

进制,

算机二进制(Binary)的原理是其中只包含两种状态,通常表示为0和1。这种二进制系统是计算机内部信息处理的基础。

计算机使用二进制的原理和和物点有以下几点:

  1. 原理:计算机内部使用的主要组件是电子开关,也称为逻辑门。逻辑门只有两个状态,打开或关闭,与二进制的0和1对应。就是通电和不通电二种状态

  2. 简单可靠:采用0,和1来表示态  可以简化计算和设计,避免了复杂情况下的混乱和错误。

  3. 容易实现:电子元件在高电压和低电压之间切换更容易实现,从而方便了电路设计和工程实现。

  4. 兼容性:二进制是一种通用的表示方式,在不同类型的计算机和系统中都能够得到良好的兼容性。
    但是如果要表过一个很长的数字二进制就太难抄写了,为了好观看,所以发明8进制,和16进制,但是计算机本质上只认识二进制。计算机中的任何数据,包括文字、数字、图像用二进制表达内容太长了,
    都可以转换为二进制编码存储和处理。计算机通过逻辑门执行二进制运算,例如加法、乘法等。同时,二进制系统还可以通过编码方法表示其他进制,如十进制、十六进制等。这【了

字符串处理预先了解,为了快速入门,和案例演示,先了解一下以下常用方法。

python处理字符串有四种党见方法,模板方式和变量占位符,以下示例中name是通过input 接收的变理,主要是演示如何格式化输出变量。官方推荐推荐使用第三种

方式一:string = ''' name  '''+ name + ''' 随意字符'''   直接拼变拼接,会在内存中创建很多内存,不建议使用,

方式二  str = ''' Name:%s    age: %s ''' %(name,age)

方式三,str = ''' name:{_name}'''.format(_name = naem)  推荐

方式四,通过花括号加索引方法  str3 = ''' name: {0}''.foramt(name)

关于字符串的演示代码:

首先定义了变量 ​name, age, job, salary​,然后通过 ​%​操作符进行字符串格式化,将这些变量传入字符串模板中。最后打印出完整的信息。但是age 定是数字,

name = "Alice"
age = 30
job = "Engineer"
salary = "$50,000" info = '''info of %s
Name:%s Age:%d Job:%s Salary:%s''' % (name, name, age, job, salary) print(info)

  

如果值不是数字是会报错,可以之前先转换。age= int(input("age"))转换变量的方法就是一个常量类型后面加一个括号加上变量str(name),打印类型用关健字,type()

例:name = input("name")

age = int(input("age"))

print(type), type(str()age)

二 输出输入语句

例:python3接收一个输入语句用input,默认接收后类 型为string  ;  老版本python2.7用raw_input  ,

在Python 2.7中,​input()​ 函数接受用户输入并将其作为Python表达式进行求值,因此如果用户输入的是字符串,会被当作变量名或语句进行处理。这意味着,如果用户输入字符串,需要加上引号("")包裹。而 ​raw_input()​ 函数返回用户输入的原始字符串,不会对其进行求值,始终将用户输入看作是字符串。所以python2.7不建议使用input ,考虚到老版本的python也经过期不用,所以这儿不作详细示例,python2.x举例来说:

  • 使用 ​input()​ 函数时,用户输入 ​hello​,会被当作变量名去寻找,如果没有定义变量 ​hello​ 就会报错。
  • 使用 ​raw_input()​ 函数时,用户输入 ​hello​,会直接返回字符串 ​'hello'​,不会做任何其他处理。

因此,如果希望简单地接收用户输入字符串,应该使用 ​raw_input()​ 函数。但是在python3以后都是用input

# 接收用户输入
num_str = input("请输入一个数字:") # 尝试将输入转换为整数类型
try:
num = int(num_str)
print("您输入的数字是:", num)
except ValueError:
print("输入错误,请确保输入的是一个数字。")
在接收用户输入时,如果需要不显示用户输入显示为密文,需要导入加密的工具,getpass 

例:以下代码功能是先定义二个变量,然后接收用户输入,最后判断用户是否输入正确

import getpass
username = 'aaa'
password = 'abc123'
input_username = input("username:")
input_password = input("password:")
if input_username == username and input_password == password:
print(f"Welcome user {input_username} login....")
else:
print("Invalid username or password!") 

  代码结构和循环语句

示例二,猜年龄,接收一个框让用户猜预定的年龄,如果猜得不对给于提示,
of_age = 100
pass_age = int(input("guess age"))
if pass_age == of_age:
print("yes,you got it.")
elif pass_age > of_age:
print("应该更小")
else:
print("猜大了")

 但是这种直接写if   代码只会流程运行一次,所以只会猜一次,为了更加接近生活,我们不是应该让用户多输几次,直到用户输入正确为止,就要用到循环语句。循环有几种方式,可以根据条件徨环几次,还可以用条件一直徨环,直到条件结束,这个条件可以直接写成true  也可以由一个变量来控制

while True:
guess_age = int(input("guess age:"))
age_of_oldboy = 18 # 假设 oldboy 的年龄是18岁 if guess_age == age_of_oldboy:
print("yes, you got it.")
break
elif guess_age > age_of_oldboy:
print("think smaller...")
else:
print("think bigger!")

  用变量来控制的写法可以参考:

condition = True  # 设定一个控制条件,初始值为True

while condition:
guess_age = int(input("guess age:"))
age_of_oldboy = 18 # 假设 oldboy 的年龄是18岁 if guess_age == age_of_oldboy:
print("yes, you got it.")
condition = False # 设置条件为False,退出循环
elif guess_age > age_of_oldboy:
print("think smaller...")
else:
print("think bigger!")

  阶段示例:以下示例:编写一个猜年龄的代码,如果猜错三次,自动退出,如果猜对,立即退出

count = 0
while True:
if count == 3:
break
guess_age = int(input("guess age:"))
age_of_oldboy = 18 # 假设 oldboy 的年龄是18岁
if guess_age == age_of_oldboy:
print("yes, you got it.")
break
elif guess_age > age_of_oldboy:
print("think smaller...")
else:
print("think bigger!") count += 1

试例二,如果连猜三次,询问对方还要不要猜,如果用户输入y 表示继续玩,

count = 0
age_of_oldboy = 18
while count < 3:
guess_age = int(input("Guess the age: "))
if guess_age == age_of_oldboy:
print("Yes, you got it.")
break
elif guess_age > age_of_oldboy:
print("Think smaller...")
else:
print("Think bigger!")
count += 1
if count == 3:
continue_confirm = input("Do you want to keep guessing? (y/n)")
if continue_confirm != "y":
count = 0

  

 

优化代码,将条件变量设为count

count = 0
age_of_oldboy = 18 # 假设 oldboy 的年龄是18岁 while count < 3:
guess_age = int(input("guess age:")) if guess_age == age_of_oldboy:
print("yes, you got it.")
break
elif guess_age > age_of_oldboy:
print("think smaller...")
else:
print("think bigger!") count += 1

  不同的编程语言,有自己的特性,在python   中 while  可以和else 一起使用,举个例子,甚至是for 都可以和else  配套一起使用,

count = 0
while count < 5:
print("count:", count)
count += 1
else:
print("循环结束")

  对于for 和 else  一起使用的示例。这儿的else 的使用意思是执行完for 后会来执行,除非执行了bread  结构语句破坏了,就不执行里面的语句。

fruits = ["apple", "banana", "cherry"]

for fruit in fruits:
if fruit == "orange":
print("橙子在水果列表里!")
break
print(fruit)
else:
print("橙子不在水果列表里!")

 range 函数了解 这儿插一下关于一个生成数字的函数的介绍使用:range可以生成整数,用于循环结构中

range()​函数在Python中用于生成一个整数序列,常用于循环结构中。​range()​函数有三种常见的用法:

​​range(stop)​:生成从0开始、小于stop的整数序列。
for i in range(5):
print(i)
# 输出结果为:0, 1, 2, 3, 4
for i in range(5):
print(i)
# 输出结果为:0, 1, 2, 3, 4

​​range(start, stop)​:生成从start开始、小于stop的整数序列。
for i in range(2, 5):
print(i)
# 输出结果为:2, 3, 4
for i in range(2, 5):
print(i)
# 输出结果为:2, 3, 4

​​range(start, stop, step)​:生成从start开始,以step步长递增或递减,直到小于stop的整数序列。
for i in range(0, 10, 2):
print(i)
# 输出结果为:0, 2, 4, 6, 8
for i in range(0, 10, 2):
print(i)
# 输出结果为:0, 2, 4, 6, 8

需要注意的是,​range()​函数生成的是一个可迭代对象,不是实际的列表。如果需要将其转换为列表,可以使用 ​list()​函数:

完成以下真实案例时,

需要了解一上字典和list ,列表就是一组数据,类似于装一堆用户名,比如张三,李四,这样,以下是LIst的解释和常用方法

在Python中,列表(List)是一种有序、可变且可以包含各种类型元素的数据结构。它是Python中最常用的数据类型之一,可以存储任意多个元素,这些元素可以是相同的类型或不同的类型。
列表使用方括号 ​[]​来表示,其中的每个元素以逗号分隔。例如,下面是一个包含整数和字符串的列表示例:
my_list = [1, 2, 3, "apple", "banana"]
my_list = [1, 2, 3, "apple", "banana"]​
列表有以下特点:
有序:列表中的元素按照它们在列表中的顺序排序,并且可以通过索引进行访问。索引从0开始,例如 ​my_list[0]​表示列表中的第一个元素。
可变性:列表是可变的,也就是说,可以修改、添加和删除列表中的元素。可以使用列表的方法(例如 ​append()​、​insert()​、​remove()​等)来修改列表。
允许重复:列表允许包含重复的元素。比如,​[1, 2, 2, 3, 3, 3]​是一个合法的列表。
列表是非常灵活且功能强大的数据结构,可以用于存储和操作多个相关的数据。你可以通过索引访问列表中的元素,使用切片操作获取子列表,也可以使用各种方法对列表进行排序、过滤、迭代等操作。
例如,以下是一些常见的列表操作示例:
# 创建一个空列表
my_list = []
# 添加元素到列表末尾
my_list.append("apple")
my_list.append("banana") # 访问列表中的元素
print(my_list[0]) # 输出:apple # 修改列表中的元素
my_list[0] = "orange" # 使用切片获取子列表
sub_list = my_list[1:3] # 获取索引为1和2的元素 # 迭代列表中的元素
for item in my_list:
print(item) # 移除列表中的元素
my_list.remove("banana") # 获取列表的长度
length = len(my_list)
# 创建一个空列表
my_list = [] # 添加元素到列表末尾
my_list.append("apple")
my_list.append("banana") # 访问列表中的元素
print(my_list[0]) # 输出:apple
# 修改列表中的元素
my_list[0] = "orange"
# 使用切片获取子列表
sub_list = my_list[1:3] # 获取索引为1和2的元素
# 迭代列表中的元素
for item in my_list:
print(item)
# 移除列表中的元素
my_list.remove("banana")
# 获取列表的长度
length = len(my_list)​
总之,列表是Python中非常重要和常用的数据结构,它提供了丰富的方法和操作,能够方便地处理和管理多个相关的数据。

  字典最基础了解,字典是用一个大括号装的一个带属性的key和值的数据,

在Python中,字典(Dictionary)是一种无序的、可变的、以键-值(key-value)对形式存储数据的数据结构。字典用花括号 ​{}​表示,每个键值对之间使用冒号 ​:​分隔,键和值可以是任意类型的对象。

字典具有以下特点:

  1. 无序性:字典中的键值对是无序存储的,没有固定的索引顺序。

  2. 可变性:可以添加、修改和删除字典中的键值对。

  3. 键的唯一性:字典中的键是唯一的,每个键只能对应一个值。如果插入新的键值对时,键已经存在,则会更新对应的值。

下面是一个字典的示例:

my_dict = {"name": "Alice", "age": 25, "city": "Beijing"}

在这个示例中,字典 ​my_dict​包含了三个键值对,其中每个键都是一个字符串,每个值可以是任意类型,可以是字符串、整数、列表等。

你可以通过键来访问字典中的值。例如,​my_dict["name"]​将返回字典中键为"name"的值,即"Alice"。

字典还提供了许多方法和操作,可以添加、修改、删除键值对,也可以迭代、合并、复制字典等等。

以下是一些常见的字典操作示例:

# 获取字典中的值
name = my_dict["name"] # 修改字典中的值
my_dict["age"] = 26 # 添加新的键值对
my_dict["gender"] = "female" # 删除键值对
del my_dict["city"] # 检查键是否存在
if "name" in my_dict:
print("Name is present in the dictionary.") # 获取字典的键列表
keys = my_dict.keys() # 获取字典的值列表
values = my_dict.values() # 循环遍历字典的键值对
for key, value in my_dict.items():
print(key, value)

   完整一个登际示例,要求用户输入自己的账号和密码  如果用户的密码这连输出三次失败,则锁定帐户不能在使用,

思路:新建一个空列表,用来记录用户的用户名,程序启动时,先有一个列表用来保存也经被禁用的用户名,然后先要求用户输入用户名,用户输入后去一个list  去查找,如果有这个用户名,则提示过这个用户也禁用,如果没有这个用户名,那么进入最多三次的循环的输入密码代码中,如果正确有,则提示成功,如果三次错误,则将这个用户名存入到list ,代码退出循环到让用户输入用户名界面,

  1. 首先,我们定义了两个列表 ​user_list​和 ​locked_users​,其中 ​user_list​存储了用户的信息(包括用户名、密码和是否被锁定),而 ​locked_users​用来存储被锁定的用户名。

  2. 我们还定义了一个字典 ​wrong_password_count​,用来记录每个用户连续输入错误密码的次数。

  3. 然后,通过循环模拟用户输入用户名和密码的过程,在每次循环中,用户有三次尝试的机会。

  4. 每次用户输入用户名和密码后,我们首先检查用户是否存在于 ​user_list​中,如果不存在则提示用户不存在。

  5. 接着,我们检查用户是否已经被锁定,如果已经被锁定则提示用户已被锁定。

  6. 如果用户存在且未被锁定,则检查输入的密码是否正确,如果正确则提示登录成功并结束程序。

  7. 如果密码错误,我们将该用户记录到 ​wrong_password_count​字典中,并递增错误次数。如果累计错误次数达到3次,则将该用户添加到 ​locked_users​列表中,并将该用户在 ​user_list​中的 ​'locked'​状态设为True,表示该用户已被锁定。

# 存储用户信息的列表
user_list = [
{'username': 'user1', 'password': 'pass1', 'locked': False},
{'username': 'user2', 'password': 'pass2', 'locked': False},
# 在此添加更多的用户信息
] # 存储被锁定用户的列表
locked_users = [] # 记录密码错误次数的字典
wrong_password_count = {} # 模拟用户输入用户名和密码
for _ in range(3):
username = input("请输入用户名:")
password = input("请输入密码:") user_info = None
for user in user_list:
if user['username'] == username:
user_info = user
break if user_info is None:
print("用户不存在!")
continue if user_info['locked']:
print("用户已被锁定,请联系管理员解锁。")
continue if user_info['password'] == password:
print("登录成功!欢迎,", username)
break
else:
if username in wrong_password_count:
wrong_password_count[username] += 1
else:
wrong_password_count[username] = 1 print("密码错误!")
if wrong_password_count[username] == 3:
locked_users.append(username)
user_info['locked'] = True
print("用户名 {} 已经被锁定".format(username))

  方式二,直接标记,如果输出三次则打个标记,如果标记为也禁 用,则提示

# 存储用户信息的列表
user_list = [
{'username': 'user1', 'password': 'pass1', 'locked': False},
{'username': 'user2', 'password': 'pass2', 'locked': False},
# 在此添加更多的用户信息
] def login():
# 获取用户输入的用户名和密码
username = input("请输入用户名:")
password = input("请输入密码:") # 查找用户信息
user_info = None
for user in user_list:
if user['username'] == username:
user_info = user
break if user_info is None:
print("用户不存在!")
return if user_info['locked']:
print("用户已被锁定,请联系管理员解锁。")
return # 检查密码是否匹配
if user_info['password'] == password:
print("登录成功!欢迎,", username)
else:
print("密码错误!")
user_info['locked'] = True
print("您的账号已被锁定, 请联系管理员解锁。") # 运行登录功能示例
for _ in range(3):
login()

  

  python 还有一个很大的优点,具有丰富的模块及生态,所以在解决很多工具的时候很方便,几乎我们想要的功能都有相应的模导和库。导入一个模块的方式,为import,如果是是其三库,则我们可以用pip install 安装到本地,如果是我们自己建的模块是一个文件夹,系统默认找不到自定的模型 ,

  1. 模块导入方式:你可以使用 ​import​语句来导入自定义模块。如果你将自定义模块保存为一个单独的.py文件,可以直接使用 ​import 模块名​ 来导入。

  2. 模块路径:你也可以通过 ​sys.path​来查看Python解释器的模块搜索路径。确保你的自定义模块所在的路径包含在 ​sys.path​中,这样Python解释器才能找到你的自定义模块。

另外:关健字和系统模块不要取相同的名字,否则会出错,或者出现非预期的奇怪结果。假设文件名为sys,但是又在文件中导入了sys系统模块,会出现报错。一般系统中LIb 是放系统模块,site-packages 是放第三方包的文件

import sys

print(sys.path) // 打印环境变量 
pring(sys.argv) //sys.argv​模块在需要从外部动态传入参数的场景下非常有用

import os

res = os.system("dir")   这儿只会属展幕输出结果,返回0表示成功

res = os.popen("dir")  // 打印内存地址   os.popen("dir").read() 输入目录的列表

print("res")

 

python AI 应用开发编程实战 大模型实战基础(一)的更多相关文章

  1. .Net中的并行编程-5.流水线模型实战

    自己在Excel整理了很多想写的话题,但苦于最近比较忙(其实这是借口).... 上篇文章<.Net中的并行编程-4.实现高性能异步队列>介绍了异步队列的实现,本篇文章介绍我实际工作者遇到了 ...

  2. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  3. Python图形界面开发编程:wxPython(浅尝篇)

    Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 ...

  4. 巨蟒python全栈开发数据库攻略1:基础攻略

    1.什么是数据库? 2.数据库分类 3.数据库简单介绍 4.安装数据库 5.修改root密码 6.修改字符集 7.sql介绍 8.简单sql操作

  5. 巨蟒python全栈开发数据库攻略2:基础攻略2

    1.存储引擎表类型 2.整数类型和sql_mode 3.浮点类&字符串类型&日期类型&集合类型&枚举类型 4.数值类型补充 5.完整性约束

  6. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  7. Python做web开发,推荐几个能立马上手的小项目

    Python这门优美的语言是非常适合web开发的,基于Python的Django框架简单便捷且很强大. 那么作为新手该如何上手这门语言?一切不敲代码的学编程手段都是扯淡,今天就推荐一些适合新手练手的P ...

  8. 给Python初学者的一些编程技巧

    展开这篇文章主要介绍了给Python初学者的一些编程技巧,皆是基于基础的一些编程习惯建议,需要的朋友可以参考下交换变量 x = 6y = 5 x, y = y, x print x>>&g ...

  9. AI应用开发实战 - 手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

  10. AI应用开发实战 - 从零开始搭建macOS开发环境

    AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...

随机推荐

  1. 【深度学习项目二】卷积神经网络LeNet实现minst数字识别

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  2. 5.1 Windows驱动开发:判断驱动加载状态

    在驱动开发中我们有时需要得到驱动自身是否被加载成功的状态,这个功能看似没啥用实际上在某些特殊场景中还是需要的,如下代码实现了判断当前驱动是否加载成功,如果加载成功, 则输出该驱动的详细路径信息. 该功 ...

  3. 18.3 NPCAP自定义数据包过滤

    NPCAP 库是一种用于在Windows平台上进行网络数据包捕获和分析的库.它是WinPcap库的一个分支,由Nmap开发团队开发,并在Nmap软件中使用.与WinPcap一样,NPCAP库提供了一些 ...

  4. 整个小东西,在IDEA中自动生成PO、DAO、Mapper

    作者:小傅哥 博客:https://bugstack.cn 源码:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有所收获! ...

  5. 推荐一款开源的Diffy自动化测试框架

    1. 前言 软件测试是软件开发生命周期一个十分重要的环节,测试工作开展的好坏,很大程度上决定了产品质量的好坏,但软件产品随着版本的持续迭代,功能日益增多,系统愈加复杂,而从质量保障的角度,除了要保障好 ...

  6. CH59X/CH58X/CH57X sleep模式下串口唤醒收发数据

    整体程序逻辑: 下方的具体程序及使用是基于CH592进行的 SLEEP模式睡眠唤醒是由协议栈管理的,还在睡眠时,无法接收到数据. 已经通过使能HAL_SLEEP开启睡眠.如果需要在睡眠时实时接收串口传 ...

  7. 洛谷P1009 阶乘之和

    捏妈第三节的题单名不是循环结构吗,直接出了第八节的高精度大数计算,紧急学习 对于较大数的加减乘除阶乘等,C/C++原生的数据类型是存储不了的(即便用longlong),直接计算会出现数据移除成负数的结 ...

  8. NC15128 老子的全排列呢

    题目链接 题目 题目描述 老李见和尚赢了自己的酒,但是自己还舍不得,所以就耍起了赖皮,对和尚说,光武不行,再来点文的,你给我说出来1-8的全排序,我就让你喝,这次绝不耍你,你能帮帮和尚么? 输入描述 ...

  9. MySQL基础之DDL语句

    讲解SQL语句三大分类和每个分类的SQL使用入门. 使用的是数据库是:MySQL 8.0.27 1.SQL分类   DDL(Data Definition Language)语句:数据定义语句. 用途 ...

  10. 【Unity3D】动态路障导航

    1 NavMeshObstacle组件 ​ 导航系统.分离路面导航中路障都是静态的,程序运行过程中烘焙的导航网格一直不变,本文将进一步讲解动态路障场景下导航的实现. ​ 对于动态路障游戏对象,除了要设 ...