Skip to main content

python学习之路☞14.data structure dict.md

python学习之路☞14.data structure dict

#python, #data_structure, #dict, #dictionary, #CRUD,
字典代码练习

'''
字典:由花括号内的每组键(key)和值(value)组成的元素按特定顺序排列,并用逗号分隔的一种数据结构
元素:由键值对组成,键(key)可以是任意不可变数据类型(如字符串、数字、元组),值(value)可以是任意类型(包括可变的列表、字典等)。
特点:字典没有按顺序排列的索引,而是通过键来访问对应的值,每个键必须唯一。字典是可变的,支持添加、修改和删除元素。
    查:dict['key'] 取值
    改:dict['key'] = element 赋值
    增:dict['key'] = element 赋值 key 是唯一的,不存在就会新增键值对元素
    删:del dict['key']
dict():用来创建空字典的内置函数
dict.items(): 用来遍历字典 keys:values 的方法
dict.keys():用来遍历字典 keys 的方法
dict.values():用来遍历字典 values 的方法
不理解:这字典用起来就很麻烦,为什么说灵活好用呢?太费解了
'''
# 首先创造一个字典(已经包含了嵌套)
function_make_dict = dict()  # dict() 函数直接创建空字典
make_dict = {'dict_1': [1, '你好世界', True], 'dict_2': (1, '你好世界', True), 'dict_3': {
    'dict_3_1': [1, '你好世界', True], 'dict3_2': (1, '你好世界', True)}}  # {} 直接创建字典

# 查元素
print('-----查字典-------')
print('dict()直接创建空字典', function_make_dict, type(function_make_dict))
print('{}直接创建的字典:', make_dict, type(make_dict))
print('第一个元素是:', make_dict['dict_1'], '->', type(make_dict['dict_1']))
print('第二个元素是:', make_dict['dict_2'], '->', type(make_dict['dict_2']))
print('第三个元素是:', make_dict['dict_3'], '->', type(make_dict['dict_3']))

# 改元素
print('-----改字典-------')
make_dict['dict_1'] = {'dict_1_1': [
    1, '你好', False], 'dict_1_2': (1, '世界', True)}
make_dict['dict_2'] = [1, '你', False]
make_dict['dict_3'] = (2, '好', True)
print('修改后的字典:', make_dict, type(make_dict))
print('第一个元素是:', make_dict['dict_1'], '->', type(make_dict['dict_1']))
print('第二个元素是:', make_dict['dict_2'], '->', type(make_dict['dict_2']))
print('第三个元素是:', make_dict['dict_3'], '->', type(make_dict['dict_3']))

# 增字典
print('-----增字典-------')
make_dict['dict_4'] = 1.9
make_dict['dict_5'] = '喵喵喵'
print('第四个元素是:', make_dict['dict_4'], '->', type(make_dict['dict_4']))
print('第五个元素是:', make_dict['dict_5'], '->', type(make_dict['dict_5']))


# 删字典
print('-----删字典-------')
del make_dict['dict_3']
del make_dict['dict_2']
print('删除后的字典:', make_dict, type(make_dict))
print('第一个元素是:', make_dict['dict_1'], '->', type(make_dict['dict_1']))
print('第二个元素是:', make_dict['dict_4'], '->', type(make_dict['dict_4']))
print('第三个元素是:', make_dict['dict_5'], '->', type(make_dict['dict_5']))

# 遍历字典
print('-----dict.items()遍历字典-------')
for k, v in make_dict.items():
    print(k, '->', v, type(v))

print('-----dict.keys()遍历字典-------')
for k in make_dict.keys():
    print(k, '->', make_dict[k], type(make_dict[k]))

print('-----dict.values()遍历字典-------')
for v in make_dict.values():
    print(v, type(v))


'''
练习:
    设计角色的数值系统,角色拥有的属性
    攻击力(ACK) 防御力(DEF) 和 血量(HP)
    并对属性值进行新增 修改 和 删除
感受:这个练习自由度太高,硬是想了很久,
    1、一开始是查询函数的参数,设计多了,后来又设计少了,后来有设计了一个扣血函数
    2、扣血的英雄还能造成伤害,这个问题通过 if 判断血量搞定,但搞不定的是如何让死去的英雄不再加入战斗,好想哭,这不成了死灵法 战 肉了吗?
    3、攻击值达到某个特定范围,就无法击杀英雄还会给英雄造成回血,这个也通过 if 判断真实伤害解决,要不然打起来没完没了,回血了还怎么打?
    4、还有一个缺陷,就是英雄死了两个就不要再打了,再打就是鞭尸啊,唉
    5、字典真难用啊!!!!灵活的代价就是复杂难用
'''
print('************设计角色的数值系统**************')
# 英雄原始属性
role_1 = {'name': 'lili(法师)', 'ACK': 130, 'DEF': 3, 'HP': 100}
role_2 = {'name': 'duo(战士)', 'ACK': 70, 'DEF': 4, 'HP': 300}
role_3 = {'name': 'anna(肉盾)', 'ACK': 50, 'DEF': 5, 'HP': 300}
role_dict = {'dict_1': role_1, 'dict_2': role_2, 'dict_3': role_3}
'''
result() 函数:用于查询角色状态
参数:
    role_dict 角色字典
    role_num 角色字典 key
'''


def result(role_dict, dict_num):  # 角色状态查询
    print('--->', role_dict[dict_num]['name'], '角色状态:攻击力', role_dict[dict_num]
          ['ACK'], '防御力', role_dict[dict_num]['DEF'], '血量', role_dict[dict_num]['HP'])


'''
lost() 函数:用于扣血
参数:
    role_dict 角色字典
    dict_1 攻击角色字典 key
    dict_2 受害角色字典 key
'''


def lost(role_dict, dict_1, dict_2):
    if role_dict[dict_1]['HP'] > 0:  # 攻击者有血量,可以执行攻击!!
        if role_dict[dict_2]['HP'] > 0:  # 受害者有血量,可以接受攻击!!
            real_lost = role_dict[dict_1]['ACK'] - \
                role_dict[dict_2]['DEF']  # 计算真实伤害
            if real_lost > 0:  # 如果真实口血量为正,继续攻击!!
                role_dict[dict_2]['HP'] = role_dict[dict_2]['HP'] - \
                    real_lost  # 扣除属性表达式
                print(role_dict[dict_1]['name'], '使',
                      role_dict[dict_2]['name'], '受伤!!!!扣血', real_lost)
            else:  # 真实扣血量为负,调整为0,不可以为英雄加血,逆天
                real_lost = 0
        else:  # 受害者已死无法接受攻击,请安息
            role_dict[dict_2]['ACK'] = 0
            role_dict[dict_2]['DEF'] = 0
            role_dict[dict_2]['HP'] = 0
            print(role_dict[dict_2]['name'], '已经死亡!!!无法接受攻击')
    else:  # 攻击者升天无法攻击,请安息
        role_dict[dict_1]['ACK'] = 0
        role_dict[dict_1]['DEF'] = 0
        role_dict[dict_1]['HP'] = 0
        print(role_dict[dict_1]['name'], '已经死亡!!!无法发起攻击')
    result(role_dict, dict_1)
    result(role_dict, dict_2)
    print()


print('------------查询状态--------------')
result(role_dict, 'dict_1')
result(role_dict, 'dict_2')
result(role_dict, 'dict_3')
print()

for i in range(3):  # 这里设计了一种循环装置用于攻击回合
    print('||||||||||||法师使用了大范围技能,其他角色受伤||||||')
    lost(role_dict, 'dict_1', 'dict_2')
    lost(role_dict, 'dict_1', 'dict_3')

    print('||||||战士使用技能分别重伤其他角色,其他角色受伤||||||')
    lost(role_dict, 'dict_2', 'dict_1')
    lost(role_dict, 'dict_2', 'dict_3')

    print('||||||肉盾发狂使用全局技能分别重伤其他角色,其他角色受伤||||||')
    lost(role_dict, 'dict_3', 'dict_1')
    lost(role_dict, 'dict_3', 'dict_2')

print('------------查询状态--------------')
result(role_dict, 'dict_1')
result(role_dict, 'dict_2')
result(role_dict, 'dict_3')

参考

Dictionaries — Python 3 docs
Python Dictionary — python.land

Comments

Popular posts from this blog

python学习之路☞9.Comment, Primitive Data Types and Branch Conditional Structure if ... else ...

python学习之路☞9.Comment, Primitive Data Types and Branch / Conditional Structure if … else … #python,#Comment,#data type,#branch/conditional structure,#input(),#int,#float,#complex,#boolean,#if … else …, 注释(Comment) 内置函数input()(input() Function) 基本数据类型整数(Primitive Data Types int) 基本数据类型小数(Primitive Data Types float) 基本数据类型复数(Primitive Data Types complex) 基本数据类型布尔(Primitive Data Types boolean) 分支结构if … else …(Branch / Conditional Structure if … else …) 参考 Comment ''' 注释: 给人看的说明文字,Python 解释器完全忽略 要点 # 让该行 # 之后的内容全部失效,解释器跳过。 行尾注释与代码在同一行,通常用于简短说明。 docstring(三引号字符串)放在函数/类/模块第一行时,可被 help() 和文档工具读取,有特殊意义。 好的注释解释"为什么",而不是"做了什么"(代码本身已经说明了做了什么): # ✗ i = i + 1 # i 加 1 # ✓ i += 1 # 跳过表头行 ''' # 这是单行注释,# 号后面全部忽略 x = 10 # 行尾注释,代码照常执行 # 多行注释:每行都加 # # 第一行说明 # 第二行说明 # 第三行说明 """ 这是多行字符串(docstring) 虽然常被当注释用, 但本质是字符串字面量,不是注释。 通常用于函数/类的文档说明。 """ def add ( a , b ) : """返回 a 与 b 的和。"...

OnePlus 7 Pro LineageOS 23.2 Android 16 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南

OnePlus 7 Pro LineageOS 23.2 Android 16 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南 OnePlus 7 Pro LineageOS 23.2 Android 16 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南 #docker,#linux,#termux,#android,#kernel,#lineageos,#oneplus,#git,#android16, gmkm6 x86_64 主机配置环境 安装配置 docker 防止污染环境 更新 docker 插件 compose 更新 docker 插件 buildx 创建编译容器 容器内编译镜像刷机 安装magisk,termux获取root termux检测内核docker缺失功能 根据内核docker缺失功能编译boot.img并获取root 开启全部必要扩展功能 下面的步骤是开启大部分非必要扩展功能 修补内核代码方案 下面的步骤是开启剩余部分非必要扩展功能 修补内核 安装测试运行 termux docker 其它关于termux的docker-compose和docker-buildx更新 安装用于校验的工具 开机自启动和容器化部署使用例子 Android16尝试开启KVM失败的例子(不用试了,唉) 内核修补 参考&感谢 gmkm6 x86_64 主机配置环境 注意,获取自己的手机型号代号,这一点很重要在后续的命令中都要用到 比如我的手机 oneplus7pro 是 guacamole 也可以尝试通过命令获取获取,但是我不知道是不是所有设备都是这样获取的 adb shell getprop ro.boot.project_codename 最重要的是,一定要找好固件包,免得变成砖头,有线刷包就可以怎么折腾都不怕 听我说,编译内核是一件很枯燥的核对过程,这个过程需要考虑到各项之间的互相依赖和冲突并以此作出取舍 这不是个简单的过程,这里只展示具有逻辑的依赖项,需要耐心和不断的试错总结 不得不说设计的内核是一件件精美的艺术品,从某种意义上来讲,万事万物皆为艺术,而探索艺术本身是...

OnePlus 7 Pro LineageOS 19.1 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南

OnePlus 7 Pro LineageOS 19.1 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南 OnePlus 7 Pro LineageOS 19.1 构建与内核 Docker 支持并在 Termux 上实现容器运行全流程指南 #docker,#linux,#termux,#android,#kernel,#lineageos,#oneplus,#git, gmkm6 x86_64 主机配置环境 安装配置 docker 防止污染环境 更新 docker 插件 compose 更新 docker 插件 buildx 创建编译容器 容器内编译镜像刷机 安装magisk,termux获取root termux检测内核docker缺失功能 根据内核docker缺失功能编译boot.img并获取root 安装测试运行 termux docker 其它关于termux的docker-compose和docker-buildx更新 参考&感谢 注意,获取自己的手机型号代号,这一点很重要在后续的命令中都要用到 比如我的手机 oneplus7pro 是 guacamole 也可以尝试通过命令获取获取,但是我不知道是不是所有设备都是这样获取的 adb shell getprop ro.boot.project_codename 最重要的是,一定要找好固件包,免得变成砖头,有线刷包就可以怎么折腾都不怕 最近 OP7P 设备型号是 guacamole 手机刷了 GM1910_11_H.40 即 android 12 https://gauss-componentotacostmanual-sg.allawnofs.com/remove-d74c973c240292cb011317bb07f424a2/component-ota/23/03/28/6d4604798d27450e8de05671d5effbae.zip 内核版本 4.14.180-perf+ 发现 github.com/OnePlusOSS 官方有相关的开放残缺的内核源码,但缺失了很多代码配置 https://github.com/OnePlusOSS/android_kernel_o...