python AI 应用开发编程实战 大模型实战基础(一)
自从 由美国主导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。这种二进制系统是计算机内部信息处理的基础。
计算机使用二进制的原理和和物点有以下几点:
-
原理:计算机内部使用的主要组件是电子开关,也称为逻辑门。逻辑门只有两个状态,打开或关闭,与二进制的0和1对应。就是通电和不通电二种状态
-
简单可靠:采用0,和1来表示态 可以简化计算和设计,避免了复杂情况下的混乱和错误。
-
容易实现:电子元件在高电压和低电压之间切换更容易实现,从而方便了电路设计和工程实现。
-
兼容性:二进制是一种通用的表示方式,在不同类型的计算机和系统中都能够得到良好的兼容性。
但是如果要表过一个很长的数字二进制就太难抄写了,为了好观看,所以发明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)
二 输出输入语句
输出语句: print() 向控制台输出文字或变量,在调试代码时经常用,
如果要在输出时出现色彩可以参考以下,但是这只是辅助一下好看, 在Python中,输出有色彩的文字通常依赖于命令行终端对ANSI转义序列的支持。ANSI转义序列是一系列字符,用于控制如何在文本终端中显示文本(比如颜色和格式)。以下是基础的ANSI代码包含颜色和样式: \033[0m:重置所有属性 \033[1m:加粗 \033[4m:下划线 \033[31m:红色 \033[32m:绿色 \033[33m:黄色 \033[34m:蓝色 \033[35m:紫色 \033[36m:青色 \033[37m:白色 你可以使用这些代码来设置文本颜色: print("\033[31m这是红色文本\033[0m") print("\033[32m这是绿色文本\033[0m") print("\033[33m这是黄色文本\033[0m") print("\033[31m这是红色文本\033[0m") print("\033[32m这是绿色文本\033[0m") print("\033[33m这是黄色文本\033[0m") 在上面的例子中,我们使用 \033[作为CSI(Control Sequence Introducer)开始序列,然后是颜色代码(例如31),接着是 m来表示结束颜色设置序列。之后是要打印的文本内容,最后以 \033[0m来重置文本颜色,这样后续的文本不会被影响。 使用这种方式,你可以组合不同的颜色和格式样式。如下是一个更复杂一点的包含格式化和颜色的例子: print("\033[1;34m这是加粗蓝色文本\033[0m") print("\033[1;34m这是加粗蓝色文本\033[0m") 兼容性提示:请注意,并非所有的终端都支持ANSI转义序列。如果上述方法不生效或显示异常结果可能是因为所使用的终端不支持这些序列。 对于需要跨平台运行的应用,建议使用第三方库如 colorama、termcolor等,它们可以提供更稳定且拥有更多功能的解决方案。 例如,使用 termcolor的示例: from termcolor import colored print(colored('这是绿色文本', 'green')) print(colored('这是带背景的蓝色文本', 'blue', 'on_white')) from termcolor import colored print(colored('这是绿色文本', 'green')) print(colored('这是带背景的蓝色文本', 'blue', 'on_white')) 使用 colorama,不仅能够跨平台使用颜色,还能确保Windows系统上可以输出ANSI颜色编码。 安装 colorama或者 termcolor: pip install colorama # 或者 pip install termcolor pip install colorama # 或者 pip install termcolor
输出语句 input()
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)对形式存储数据的数据结构。字典用花括号 {}
表示,每个键值对之间使用冒号 :
分隔,键和值可以是任意类型的对象。
字典具有以下特点:
-
无序性:字典中的键值对是无序存储的,没有固定的索引顺序。
-
可变性:可以添加、修改和删除字典中的键值对。
-
键的唯一性:字典中的键是唯一的,每个键只能对应一个值。如果插入新的键值对时,键已经存在,则会更新对应的值。
下面是一个字典的示例:
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 ,代码退出循环到让用户输入用户名界面,
-
首先,我们定义了两个列表
user_list
和locked_users
,其中user_list
存储了用户的信息(包括用户名、密码和是否被锁定),而locked_users
用来存储被锁定的用户名。 -
我们还定义了一个字典
wrong_password_count
,用来记录每个用户连续输入错误密码的次数。 -
然后,通过循环模拟用户输入用户名和密码的过程,在每次循环中,用户有三次尝试的机会。
-
每次用户输入用户名和密码后,我们首先检查用户是否存在于
user_list
中,如果不存在则提示用户不存在。 -
接着,我们检查用户是否已经被锁定,如果已经被锁定则提示用户已被锁定。
-
如果用户存在且未被锁定,则检查输入的密码是否正确,如果正确则提示登录成功并结束程序。
-
如果密码错误,我们将该用户记录到
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 安装到本地,如果是我们自己建的模块是一个文件夹,系统默认找不到自定的模型 ,
-
模块导入方式:你可以使用
import
语句来导入自定义模块。如果你将自定义模块保存为一个单独的.py文件,可以直接使用import 模块名
来导入。 -
模块路径:你也可以通过
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")