社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python - 100天从新手到大师|D8-D14学习笔记

生信菜鸟团 • 4 年前 • 674 次点击  

这一周的学习笔记,重点在于对常用的一些操作、代码进行整理,对于高阶编程如面向对象、多线程及网络编程记录一下基本概念,有兴趣支持原作者@骆昊

Python - 100天从新手到大师|D0
Python - 100天从新手到大师|D1-D7学习笔记

D8-D9面向对象编程基础

"一切皆对象。"

类(英语:class)在面向对象编程中是一种面向对象计算机编程语言的构造,是创建对象的蓝图,用于描述具有相同属性和方法。

对象(英语:object),是一个存储器地址,其中拥有值,这个地址可能有标识符指向此处。对象可以是一个变量,一个数据结构,或是一个函数。

官方注释:

"把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。"

简单的说,类是对象的蓝图和模板,而对象是类的实例。类是抽象的概念,而对象是具体的东西。

面向对象的支柱

面向对象有三大支柱:封装、继承和多态。引用作者对封装的理解:"隐藏一切可以隐藏的实现细节,只向外界暴露(提供)简单的编程接口"。

我们在类中定义的方法其实就是把数据和对数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以执行方法中的代码,也就是说我们只需要知道方法的名字和传入的参数(方法的外部视图),而不需要知道方法内部的实现细节(方法的内部视图)。

这也是定义类以后保存为py文件以后,通过from class_name import *来使用,这样会使得代码简单、高效,使得逻辑清晰。

如何获得对象信息

大土豆力,公众号:生信菜鸟团如何获得对象信息

D10 为游戏开发基础,就不班门弄斧了。

D11 文件和异常

这一节主要是讲述了如何读取文件(字符文件还是二进制文件),并对文件进行操作(读、写还是追加)。open是内置的函数。

小例子:字典与FASTA文件序列抽提 

引用@菜鸟教程 上的一张图,进行区分,常见的操作为:

f = open('test.txt','r', encoding='utf-8')
f.close()

如果文件不存或无法打开,程序运行就会报错。这里作者给到了一个可以让代码具有一定的健壮性和容错性的函数,以处理可能发生的状况。

def main():
    f = None
    try:
        f = open('致橡树.txt''r', encoding='utf-8')
        print(f.read())
    except FileNotFoundError:
        print('无法打开指定的文件!')
    except LookupError:
        print('指定了未知的编码!')
    except UnicodeDecodeError:
        print('读取文件时解码错误!')
    finally:
        if f:
            f.close()


if __name__ == '__main__':
    main()

这里要补充一下在之间的函数中,没有提到的try代码块和except。一般情况下,我们可以的在try代码块的后面可以跟上一个或多个except来捕获可能出现的异常状况。如上所示,作者在try后面跟上了三个except分别处理这三种不同的异常状况。最后的finally代码块来关闭打开的文件,为的是释放掉程序中获取的外部资源。

另一种finally代码块代替的方法:

def main():
    try:
        with open('致橡树.txt''r', encoding='utf-8'as f:
            print(f.read())
    except FileNotFoundError:
        print('无法打开指定的文件!' )
    except LookupError:
        print('指定了未知的编码!')
    except UnicodeDecodeError:
        print('读取文件时解码错误!')


if __name__ == '__main__':
    main()

读写JSON文件

JSON是“JavaScript Object Notation”的缩写,它本来是JavaScript语言中创建对象的一种字面量语法,现在已经被广泛的应用于跨平台跨语言的数据交换,原因很简单,因为JSON也是纯文本,任何系统任何编程语言处理纯文本都是没有问题的。目前JSON基本上已经取代了XML作为异构系统间交换数据的事实标准。

在Python中,我们可以把一个列表或一个字典中的数据以JSON格式保存到文件中。例如:

{
    "name""骆昊",
    "age"38,
    "qq"957658,
    "friends": ["王大锤""白元芳"],
    "cars": [
        {"brand""BYD""max_speed"180},
        {"brand""Audi""max_speed"280},
        {"brand""Benz""max_speed"320}
    ]
}

不难发现,JSON跟Python中的字典其实是一样的,因此也很容易读取数据。

PythonJSON
dictobject
list, tuplearray
strstring
int, float, int- & float-derived Enumsnumber
True / Falsetrue / false
Nonenull

json模块主要有四个比较重要的函数,分别是:

  • dump - 将Python对象按照JSON格式序列化到文件中

  • dumps - 将Python对象处理成JSON格式的字符串

  • load - 将文件中的JSON数据反序列化成对象

  • loads - 将字符串的内容反序列化成Python对象

D12 字符串和正则表达式

在python3入门之前,我们就不同的正则表达式及符号说明记录,本节就提一下重点:

正则表达速查表

大土豆力,公众号:生信菜鸟团Shell文本处理三剑客使用小技巧 |awk grep sed +正则表达式

Python提供了re模块来支持正则表达式相关操作,下面是re模块中的核心函数。

函数说明
compile(pattern, flags=0)编译正则表达式返回正则表达式对象
match(pattern, string, flags=0)用正则表达式匹配字符串 成功返回匹配对象 否则返回None
search(pattern, string, flags=0)搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None
split(pattern, string, maxsplit=0, flags=0)用正则表达式指定的模式分隔符拆分字符串 返回列表
sub(pattern, repl, string, count=0, flags=0)用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数
fullmatch(pattern, string, flags=0)match函数的完全匹配(从字符串开头到结尾)版本
findall(pattern, string, flags=0)查找字符串所有与正则表达式匹配的模式 返回字符串的列表
finditer(pattern, string, flags=0)查找字符串所有与正则表达式匹配的模式 返回一个迭代器
purge()清除隐式编译的正则表达式的缓存
re.I / re.IGNORECASE忽略大小写匹配标记
re.M / re.MULTILINE多行匹配标记

很丰富对吧… 一般来说,我最常使用的是re.compile  和re.findall。例如:

pattern = re.compile(r'(?<=\D)1[34578]\d{9}(?=\D)')的意思是:从数字开始,1开头,可选[34578]中任意个数字,然后连接9个数字,最后一个数字结束。换句话说,该正则限定了数字匹配,且13,14,15,17,18开头,共十一位数字的匹配。

提示:上面在书写正则表达式时使用了“原始字符串”的写法(在字符串前面加上了r),所谓“原始字符串”就是字符串中的每个字符都是它原始的意义。因为正则表达式中有很多元字符和需要进行转义的地方,如果不使用原始字符串就需要将反斜杠写作\,例如表示数字的\d得书写成\\d,这样不仅写起来不方便,阅读的时候也会很吃力。

re模块的正则表达式相关函数中都有一个flags参数,即上表中最后两个,可用作标记匹配时是否忽略大小写、多行匹配等。如果需要为flags参数指定多个值,可以使用按位或运算符进行叠加,如flags=re.I | re.M

13.进程和线程

这个整篇读完还是有点懵。简单来说,进程就相当于是程序运行,可以拥有多线程,即更多的资源快速运算实现,但同时多线程的程序不太友好,会导致其他程序无法获得足够的CPU执行时间。

以下是专业的概念介绍:

进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。

一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。由于线程在同一个进程下,它们可以共享相同的上下文,因此相对于进程而言,线程间的信息共享和通信更加容易。当然在单核CPU系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯一的一个线程,多个线程共享了CPU的执行时间。使用多线程实现并发编程为程序带来的好处是不言而喻的,最主要的体现在提升程序的性能和改善用户体验,今天我们使用的软件几乎都用到了多线程技术,这一点可以利用系统自带的进程监控工具(如macOS中的“活动监视器”、Windows中的“任务管理器”)来证实,如下图所示。

Python既支持多进程又支持多线程,因此使用Python实现并发编程主要有3种方式:多进程、多线程、多进程+多线程。

14.网络编程入门和网络应用开发

TCP/IP是一个四层模型,也就是说,该模型将我们使用的网络从逻辑上分解为四个层次,自底向上依次是:网络接口层、网络层、传输层和应用层,如下图所示。

我们经常听到的路由/路由器,主要功能就是存储转发我们发送到网络上的数据分组,让从源头发出的数据最终能够找到传送到目的地通路。也就是说网络之间有协议,我们需要通过路由派发数据传输,然后体现在终端上,实现上网。

在本节中还记录了一些有意思的实操:

发送电子邮件 & 发送短信

先mark一下。


以上是在基于Python-100天教程中挑选基础内容查漏补缺的笔记,不断迭代。如果对你也有一点点帮助,点点在看或者分享到朋友圈,你们的支持是我继续分享的动力

鸣谢作者@骆昊

Python - 100天从新手到大师 

https://github.com/jackfrued/Python-100-Days


往期回顾:

生信分析方向如何系统入门Python3|2020更新版

Python - 100天从新手到大师|D0Python - 100天从新手到大师|D1-D7学习笔记

文末友情宣传

强烈建议你推荐给身边的博士后以及年轻生物学PI,多一点数据认知,让他们的科研上一个台阶:
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/61958
 
674 次点击