首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用工厂模式优化 ifelifelse 代码

简单直接的第一版代码 假设现在需要序列化一条数据,这条数据是一首歌,它包含了歌的名称、创作者和id。序列化的方式暂时有json、xml两种,因此你第一时间想到的代码可能像下面一样。...评价 显然如果是紧急需求,或者是没有经过思考的话,上面的代码的确是一挥而就,完成任务。作为一名不断精进的工程师,肯定是不会满足于上述代码,那么上述代码存在什么问题需要去改进呢?...当一个新的序列化格式引入的时候,serialize方法需要进行修改以适应这种变化。 当Song这个对象发生改变时,也需要重新修改SongSerializer这个类以适应Song结构的变化。...开始重构 在重构代码之前,应先思考抽象出其核心逻辑,确定每一个 if/elif/else 的执行路径(或者是逻辑路径)的公共目标。...这一版的代码相对于之前更易读和容易理解了,但是之前提到的问题依然没有得到解决,需要进一步重构。

1.3K10

使用工厂模式优化 ifelifelse 代码

简单直接的第一版代码 假设现在需要序列化一条数据,这条数据是一首歌,它包含了歌的名称、创作者和id。序列化的方式暂时有json、xml两种,因此你第一时间想到的代码可能像下面一样。...评价 显然如果是紧急需求,或者是没有经过思考的话,上面的代码的确是一挥而就,完成任务。作为一名不断精进的工程师,肯定是不会满足于上述代码,那么上述代码存在什么问题需要去改进呢?...当一个新的序列化格式引入的时候,serialize方法需要进行修改以适应这种变化。 当Song这个对象发生改变时,也需要重新修改SongSerializer这个类以适应Song结构的变化。...开始重构 在重构代码之前,应先思考抽象出其核心逻辑,确定每一个 if/elif/else 的执行路径(或者是逻辑路径)的公共目标。...这一版的代码相对于之前更易读和容易理解了,但是之前提到的问题依然没有得到解决,需要进一步重构。

55320
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#调用新浪微博API生成RSS资源文件

    XML文件中,而是每次请求得到的20条数据写成一个XML文件,最后我159个好友,按照指定的命名方法生成了8个XML文件。...(当然你要先用ACCESS在指定目录下建立一个*.mdb文件用来存储数据) 下面是对单个XML文件进行读取,并插入到数据库中(这段代码是在ASP.NET中写的) public void readTsinaFriends...,那么此语句就会多读出一条数据,这可能是此API函数的局限性吧 DataTable dtCopy = dt.Copy(); //dtCopy.Columns.Remove...对ACCESS数据库查询并写成RSS阅读器的OPML格式 对于制作RSS阅读器的OPML格式,需要的数据只有两条字段:一个是id字段,一个是name字段。...辛苦了两天,今天能有这么一点小成果,还是觉得很不错的,呵呵,也祝大家也能好运。本次代码比较还需要各种完善,比如,如何将所以的数据写成一个XML文件,这个笔者就暂时不做了,留给大家去做吧。

    85710

    python3爬取网易云音乐歌单里的歌词(含源码)

    一些注意事项: 1.看了Coursera上面的python教程,里面给了一个非常简单的示例,只传一个url就获取到响应报文。...然而很多网站是不能只通过一个url就响应请求的,你还需要填写报文头部也就是header部分。...2.得到的报文里面中文字符都是bytes,十六进制的格式,需要用utf-8解码 3.巧用控制台找到页面内容真实的网址 其余的注意点我都写在注释里了,完整源码如下: ---- #爬取网易云音乐我的歌单里面所有歌曲的歌词...id=11111111     song_id = item('a')[0].get("href",None)     #利用正则表达式提取出song_id的数字部分sid     pat = re.compile...(r'[0-9].*$')     sid = re.findall(pat,song_id)[0]     #这里的url是真实的歌词页面     url = "http://music.163.com

    1.7K100

    Python网易云音乐爬虫进阶篇

    image.png 年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了~ 思路梳理...进入歌手页可以看到展示了该歌手的「热门50单曲」,通过BeautifulSoup获取到song_id和song_name; image.png Notes: 不过这里有一点需要注意...,一般像平常我都会选择request或者urllib获取到页面代码,然后通过BeautifulSoup提取我们需要的数据,但去尝试了之后发现歌曲id等都是动态加载的,而像request请求操作都是瞬间完成...,并不会等待页面完成加载了再获取页面代码,所以后面便使用了最安全的selenium+BeautifulSoup来获取song_id和song_name。...之后就好做了,之前的文章中已经说过了,每个歌曲的评论是通过一个包含song_id的地址传递的,然后加入多线程分别保存50首歌曲,然后等着被封或者完成就好了 def save_comment(song_id

    2.8K31

    下载歌曲的时候嫌麻烦?打造专属你的音乐下载器

    前言 前面已经做出了一个只属于自己的音乐播放器,那怎么能没有一个音乐下载器呢 之前大家有没有过从电脑上下载歌曲MP3文件放到手机内存卡的经历,随着时代发展,现在的各大音乐软件已经成为播放器,下载音乐是要收费的...,现在教大家从零开始可以通过python通过爬虫爬取音乐,教大家打造自己的音乐下载器。...知识点: 1.python基础知识 2.requests库 3.urllib库 4.BeautifulSoup 环境: windows + pycharm + python3 适合零基础的同学 1、导入工具...import os from urllib.request import urlretrieve from tkinter import * import requests from selenium...,command=root.quit) #command button1.grid(row=2,column=1,sticky=E) # 显示界面 root.mainloop() 运行代码,只得到一个界面

    50310

    天天动听外链php源码

    天天动听外链php源码 作者:matrix 被围观: 5,260 次 发布时间:2014-03-30 分类:兼容并蓄 零零星星 | 32 条评论 » 这是一个创建于 3077 天前的主题,其中的信息可能已经有所发展或是发生改变...song_id=音乐ID&code=音乐ID的KEY&from=search 使用接口二较为费劲,需要得到key。...$_GET['u'] : die('Do not see the expected value');//如果没有数字型的GET参数则退出 $url = "http://ting.hotchanson.com...再说接口二: 这接口二的玩意有些麻烦,不建议使用。 需要的话只是多一个步骤,得到key。 之前我也没注意这key是哪里来的,后来才晓得是js函数算出来的。...var u = { song_id: t.song_id, code: $.CRC32(t.song_id), from: "search" }; 上面的第三行的CRC32()就是获取key的相关函数,

    1.1K10

    jackson学习之三:常用API操作

    ,前面咱们学习了jackson的低阶API,知道了底层原理,本篇开始学习平时最常用的基本功能,涉及内容如下: 体验最常用的操作,内容如下图所示: 介绍常用的可配置属性,以便按需要来设置;...对于Date字段,默认的反序列化是时间戳,可以修改配置: mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")); dateMapStr..." : "zh" } 接下来咱们做两件事,首先,是给上述json对应的实例类添加一个注解,如下图红框: 其次,执行以下配置: mapper.enable(SerializationFeature.WRAP_ROOT_VALUE...); 然后再次执行TwitterEntry实例的序列化,得到的结果如下,可见和之前的序列化结果相比,之前的整个json都变成了一个value,此value对应的key就是注解JsonRootName的value...和配置都已经介绍完成,希望能给您带来一些参考,接下来的章节,咱们一起去了解另一个常用操作:jackson注解;

    60520

    爬取网易云音乐精彩评论

    题图:by google from Instagram (一) 故事的小黄花 从出生那年就飘着 童年的荡秋千 随记忆一直晃到现在 Re So So Si Do Si La So La Si Si...正常的页面长这样: 点击查看大图 当禁用页面 JavaScript 脚本之后,正常显示数据页面会变成一个空白页面。 点击查看大图 因此,可以断定网易云音乐加载数据方式采用 Ajax。...csrf_token= 请求中有我们需要的信息。Preview 中有字段跟精彩评论中用户名一致。 点击查看大图 继续切换到 Headers 确认请求域名以及请求需要携带的参数。...id=25706282', # 夜空中最亮的星 'http://music.163.com/#/song?id=436514312', # 成都 ] 然后截取每个链接中 id 字段的值。...def get_song_id(url): """ 从 url 中截取歌曲的 id """ song_id = url.split('=')[1] return song_id

    51320

    pydantic学习与使用-4.validator 验证器的使用(pre 和 each_itemm 验证器)

    验证器 1.校验name字段包含空格 2.校验username 必须是字母和数字组成 3.校验密码1和密码2相等 from pydantic import BaseModel, ValidationError...: 验证器是“类方法”,因此它们接收的第一个参数值是UserModel类(cls),而不是UserModel的实例(self) 第二个参数始终是要验证的字段值; 可以随意命名 您还可以将以下参数的任何子集添加到签名中...在验证器依赖其他值的情况下,您应该注意: 验证是在定义的订单字段中完成的。...有关字段如何排序 的更多信息,请参阅字段排序 如果另一个字段的验证失败(或该字段丢失),它将不会包含在 中values,因此 if ‘password1’ in values and …在此示例中。...但是,在某些情况下,始终调用验证器可能很有用或需要,例如设置动态默认值。

    1.9K30

    我要学python之python语法及规

    变量 python的命名规则与java或者C#命名规则是类似的,如下 变量命名规则: 1.变量名只能是字母、数字、下划线的任意组合 2.不能数字开头 3.关键字不能声明为变量 关键字 ['False',...#3.x版本 print(name2) 流程控制 if...else if...elif...else while... while...else for... for...else 这些流程控制上的我要觉得有点意思的是...比如现在我们来写个小程序,要求如下: 题目: 写一个python程序,实现猜数字值的功能,让用户输入一个数字,如果猜对了则输出bingo!...如果猜错了,提示输入的数字相比目标数字更大还是更小,但最多使用3次机会。 下面我使用while演示一下简单逻辑: #!...常用操作:自行查阅相关文档 7.set集合 set是一个无序且不重复的元素集合 keys = set({1,2,3,4}) keys.add(2) keys.add(5) print(keys) 8.队列

    35320

    用Python分析许嵩的歌

    这里是post请求,而且参数较复杂,所以使用selenium来进行爬虫,这里除了获取基本信息外,需要获取每首歌的id,用于歌词爬虫。...from selenium import webdriver from lxml import etree import time import csv def get_info(url):...([song_id, song, singer, album]) if __name__ == '__main__': fp = open('music.csv', 'w', newline=...在这些歌中,有些是cover的,而有些是伴奏,在下载歌词之前,我们对这些数据进行清洗,尽量保证是许嵩原创而且不是伴奏的。...04 数据分析 01 数据基本情况 许嵩歌曲共计175首,妥妥的原创高产歌手~ 02 专辑单曲数 早期的许嵩,是一个网络歌手,所以都放在了许嵩单曲集中,随后发的苏格拉没有底,寻雾启示是很不错的优秀专辑。

    98010

    Python3之数组(array)

    1.数组 如果我们需要一个只包含数字的列表,那么array.array比list更高效。数组支持所有跟可变序列有关的操作,包括.pop,.insert和.extend。...创建数组需要一个类型码,这个类型码用来表示在底层的C语言应该存放怎样的数据类型。...(element) element 是要删除的元素, 该方法会删除第一次出现的元素, 如果有多次出现, 不会删除,如果希望删除所有的在array 中的元素,需要删除多次. # 如果删除 的元素的不在...array 可以紧凑地表示一个基本值的数组:字符,整数,浮点数。数组是序列类型,表现得非常像列表,除了存储在它们中的对象的类型是受约束的。...而list 里面 几乎可以放任何对象,已经类型,无论是数字,还是字典,还是对象,还是列表,都可以同时放到一个列表里面. 2.array 和list 提供的方法很多是相似的, 比如 append, insert

    22.2K71

    中国新说唱 Skr~ Skr~

    因此我们需要分析一下这个js,找出formData加密的规则即可。 ? 将js文件进行格式化,全局搜索params或者encSecKey ?...分析d函数: 1、通过 a(16) 函数生成一个长度为16的随机字符串 2、encText这个参数通过两次调用 b(a,b) 函数完成,这个函数的作用为AES加密 3、调用 c(i, e, f)得到encSecKey...只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。 通过上面分析,除了 i 是一个随机字符串,我们只需要知道d、e、f、g这四个参数就可以构造请求进行后续操作了。...经过多次调试,我们发现e、f、g这三个值是不变的,唯一改变的是d。再结合上文分析,encSecKey由函数c(i, e, f)得到的,那是不是就意味着encSeckey这个值时不变的呢?...= i['name'] song_arr = i['ar'] # 一首歌可能多人唱, 是个列表 需要遍历 for k in song_arr:

    70830

    一日一技:如何实现一个轻量插件系统

    [4uvad995cr.png] 假设我们实现了一个程序,它从 Redis 读取数据,然后写入 MongoDB。一开始程序是这样的: def read_from_redis(): ......()的循环中,每次循环返回的是一个字典,这个字典包含很多项,例如age、date等等。...我们需要设计一些逻辑对这个数据进行处理或者过滤。 但这些逻辑是逐渐增加,一开始只有一个需求,就是如果发现doc的age字段中,如果age不是数字且不能转换为数字,那么需要把它改成N/A。...后来又增加了一个新的需求,如果doc里面的date字段对应的日期小于2020-05-01,那么这条数据直接丢弃。 接下来还要新增很多其他的需求。...下面我们来实际运行一下: [dfzivxij1h.png] 可以看到,不是数字且不能被转换为数字的age字段的值被改成了N/A;date小于2020-05-01的数据就直接丢弃了。

    34450

    Python基础(一)

    如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(; )来特别地标明这种用法。分号表示一个逻辑行/语句的结束。...如果两个操作数需要都是数字 <= 小于等于 返回x是否小于等于y x = 3; y = 6; x <= y返回True >= 大于等于 返回x是否大于等于y x = 4; y = 3; x >= y返回...pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的。 (2) from .. import 如果想直接使用其他模块的变量或其他,而不加'模块名+.'...例如想直接使用sys的argv,from sys import argv 或 from sys import * (3) 模块的__name__ 每个模块都有一个名称,py文件对应模块名默认为py文件名...(value)  ---删除列表中第一次出现的value,如果列表中没有vlaue,则异常ValueError l = [1, 2, 3, 1, 2, 3] l.remove(2) print (l

    90810

    SQLAlchemy学习-10. validates()校验器

    ("failed simplified email validation") return address 默认情况下,不会为集合删除事件发出验证函数,因为典型的期望是被丢弃的值不需要验证...设置此标志时,验证函数必须接收一个额外的布尔参数,如果该参数True指示该操作是删除: from sqlalchemy.orm import validates class User(Base):...): if is_remove: raise ValueError( "not allowed to remove items...需要对属性更改行为的配置进行更多控制的应用程序可以使用此系统,如AttributeEvents. 对象名称 描述 验证(names, *kw) 将方法装饰为一个或多个命名属性的“验证器”。...include_removes  - 如果为真,“删除”事件也将被发送 - 验证函数必须接受一个额外的参数“is_remove”,这将是一个布尔值。

    83610

    Python 中 str.format() 方法详解

    数字必须是大于等于 0 的整数。带数字的替换字段可以重复使用。数字形式的简单字段名相当于把 format 中的所有位置参数整体当作一个元组,通过字段名中的数字进行取值。...# 混合使用数字形式和变量名形式的字段名 # 可以同时传递位置参数和关键字参数 print('这是一个关于{0}、{1}和{girl}的故事。'....点号的使用  传递位置参数  替换字段形式:{数字.属性名}只有一个替换字段的时候可以省略数字  # 复合字段名中使用点号传递对象属性 class Person:     def __init__(self...format(p)) """ 我是辣妹子,家在重庆。 """ # 当只有一个替换字段的时候可以省略数字 print('{.name}辣!'.format(p)) """ 辣妹子辣!...5.3 正负号  正负号选项仅对数字类型生效取值有三种:    + 正数前面添加正号,负数前面添加负号- 仅在负数前面添加负号(默认行为) 空格:正数前面需要添加一个空格,以便与负数对齐   # 正负号

    78000
    领券