这篇文章主要讲解了“Python怎么计算球的个数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么计算球的个数”吧! 代码如下: # author: DE8UG # 创建垃圾桶和垃圾 # 规则:k:v,一个k对应一个v,代码表示用冒号分割 # 输入 # 判断 # 保存 # 函数 # 综合
import json
rule = { "湿垃圾": ["菜叶", "橙皮", "葱", "饼干"], "干垃圾": ["旧浴缸", "盆子", "海绵", "卫生纸"] }
# print('加载文件:', ljt_gan) def load_data(filename): with open(filename) as f: data = json.load(f) return data
def reng_laji(rule_k, laji, ljt): if rule_k == ljt['name']: ljt['data'].append(laji)
def fenlei(laji, rule, ljt): for k, v in rule.items(): print(k, v) if laji in v: print('找到了垃圾:', laji, k) reng_laji(k, laji, ljt) # reng_laji(k, laji, ljt_shi)
# 用函数封装写文件的代码 def save_to_file(filename, data): with open(filename, 'w') as f: json.dump(data, f)
def main():
# 定义垃圾桶 ljt_shi = { 'name': "湿垃圾", 'data': [] }
ljt_gan = { 'name': "干垃圾", 'data': [] }
# 加载已有的垃圾 ljt_gan = load_data('gan.json') ljt_shi = load_data('shi.json')
print('加载文件:', ljt_gan, ljt_shi)
# 扔垃圾 laji = input("输入要扔的垃圾:") print("垃圾:", laji)
# 分类 fenlei(laji, rule, ljt_gan) fenlei(laji, rule, ljt_shi)
print('-'*20) print(ljt_shi) print(ljt_gan)
# 调用函数,保存到具体的垃圾桶文件 save_to_file('gan.json', ljt_gan) save_to_file('shi.json', ljt_shi)
if __name__ == "__main__": main()
这段代码不长,但是包含了变量,注释,函数等部分,可以用来做第一个分析目标了。
以下内容用代码和注释来解释做了什么。
# Python算个球 # author:DE8UG # 首先准备好目标文件 filename = 'rengleme_07.py'
# 写函数得到里面所有行 def get_lines(filename): with open(filename) as f: return f.readlines()
# 执行这个函数打印的话,会是下面这一大堆字符串,但,注意看,是个列表。那就好办了 """ ['# author: DE8UG\n', '# 创建垃圾桶和垃圾\n', '# 规则:k:v,一个k对应一个v,代码表示用冒号分割\n', '# 输入\n', '# 判断\n', '# 保存\n', '# 函数\n', '# 综合\n', '\n', '\n',
'import json\n', '\n', '\n', 'rule = {\n', ' "湿垃圾": ["菜叶", "橙皮", "葱", "饼干"], \n', ' "干垃圾": ["旧浴缸", "盆子", "海绵", "卫生纸"]\n', '}\n', '\n', '\n', "# print('加载文件:', ljt_gan)\n", 'def load_data(filename):\n', ' with open(filename) as f:\n', ' data = json.load(f)\n', ' return data\n', '\n', '\n', 'def reng_laji(rule_k, laji, ljt):\n', " if rule_k == ljt['name']:\n", " ljt['data'].append(laji)\n", '\n', '\n', 'def fenlei(laji, rule, ljt):\n', ' for k, v in rule.items():\n', ' print(k, v)\n', ' if laji in v:\n', " print('找到了垃圾:', laji, k)\n", ' reng_laji(k, laji, ljt)\n', ' # reng_laji(k, laji, ljt_shi)\n', ' \n', '\n', '# 用函数封装写文件的代码\n', 'def save_to_file(filename, data):\n', " with open(filename, 'w') as f:\n", ' json.dump(data, f)\n', '\n', '\n', 'def main():\n', '\n', ' # 定义垃圾桶\n', ' ljt_shi = {\n', ' \'name\': "湿垃圾",\n', " 'data': []\n", ' }\n', '\n', ' ljt_gan = {\n', ' \'name\': "干垃圾",\n', " 'data': []\n", ' }\n', '\n', ' # 加载已有的垃圾\n', " ljt_gan = load_data('gan.json')\n", " ljt_shi = load_data('shi.json')\n", '\n', " print('加载文件:', ljt_gan, ljt_shi)\n", '\n', ' # 扔垃圾\n', ' laji = input("输入要扔的垃圾:")\n', ' print("垃圾:", laji)\n', '\n', ' # 分类\n', ' fenlei(laji, rule, ljt_gan)\n', ' fenlei(laji, rule, ljt_shi)\n', '\n', " print('-'*20)\n", ' print(ljt_shi)\n', ' print(ljt_gan)\n', '\n', ' # 调用函数,保存到具体的垃圾桶文件\n', " save_to_file('gan.json', ljt_gan)\n", " save_to_file('shi.json', ljt_shi)\n", '\n', '\n', 'if __name__ == "__main__":\n', ' main()\n', '\n', '\n', '\n'] """
# 我们定义一下结果格式,把每一行代码格式化一下为字典,包含行号,字符串,类型,含义四部分,然后组合为新的列表 [ { 'line':1, 'str':'def load_data(filename):\n', 'type':'function', # code, comment, import, var 'mean':'函数load_data,包含参数:filename' } ]
def analysis_code(lines): """分析每一行代码,根据不同特点,划分不同类型,注意换行的变量和函数会有内部代码,我们通过上一次保存的结果进行分解判断。把格式化后的行保存为新列表,并返回。 """ results = [] count = 1 for line in lines: format_line = { 'line': count, 'str': line, 'type':'code', # code, comment, import, var 'inner_code': [], 'mean':'' } if line.startswith('#'): format_line['type'] = 'comment' elif line.startswith('import'): format_line['type'] = 'import' elif line.find('=') > 0: format_line['type'] = 'var' elif line.startswith('def'): format_line['type'] = 'function'
# 空行,函数内部代码,变量内部代码,不加入结果 if line.startswith(' ') or line.startswith('}\n'): # print(results[-1]) if results[-1]['type'] == 'function' or results[-1]['type'] == 'var': results[-1]['inner_code'].append(line) elif line.startswith('\n'): pass # 空行直接掠过 else: results.append(format_line)
# 循环下一行 count += 1
return results
# 下面开始测试 if __name__ == "__main__": print('*'*50) print('欢迎使用Python算个球,掐指一算,你的代码内容如下:') lines = get_lines(filename) # print(lines[:10]) r = analysis_code(lines) # print(r) comment_list = [] function_list = [] for line in r: # print(line) if line['type']=='comment': comment_list.append(line) elif line['type']=='function': function_list.append(line) print(f'- 共{len(comment_list)}个注释') print(f'- 共{len(function_list)}个函数:') for f in function_list: print(f'line:{f["line"]}', f['str'].strip())
如代码所示,我们今天把目标代码进行了分解,根据每一行不同特点从新进行了格式化,转换为包含行号,字符串,类型,含义四部分的字典。这里还可以根据需要扩展不同的格式,方便我们进一步处理。比如解析代码含义,描述运行流程等。 感谢各位的阅读,以上就是“Python怎么计算球的个数”的内容了,经过本文的学习后,相信大家对Python怎么计算球的个数这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是天达云,小编将为大家推送更多相关知识点的文章,欢迎关注!
|