python的编程方式模块化_我的Python笔记·模块化编程(一)
如何自定义和调用函数
定义一个函数
def my_function(arg1, arg2, ...):
'''documentation'''
return value1, value2, ...
my_function是函数名,函数名可以是除了保留字以外的任意名字。查看保留字:
import keyword
keyword.kwlist
(arg1, arg2, ...)为函数的参数,是可选的(有些函数可以不需要参数)。
'''documentation'''是用三引号引起来的可选注释。
return就是将结果返回到调用的地方,并把程序的控制权一起返回。
return value1, value2, ...是指函数返回的值。
例如,一个计算两数之和的函数可以这么写:
def add(num1,num2):
'''calculates the sum of two numbers'''
result = num1 + num2
return result
add函数取两个参数相加并返回结果。
调用函数
调用一个函数时,必须在函数后加圆括号。如果函数需要参数,则需要在括号中填入参数。比如,调用前面的add函数:
result = add(12,8)
print(result)
Python函数的十大注意事项def为定义函数的语句标识;
必须使用圆括号来定义和调用函数;
函数代码块以冒号开头,后面紧跟缩进;
最后一个缩进是函数定义结束的标志;
传递给函数的参数序列是一个元组,函数也会以元组的形式返回多个值;
可以在函数内定义变量;
return会退出函数,也可以选择将值传回调用方;
return可以无返回值,而函数也可以无返回语句,这两种情况下,默认的返回值为None;
可以在函数中插入用三引号引起来的文档字符串。这些字符串会在函数调用时被忽略,但可以利用函数对象的__doc__属性来检索;
函数内的变量为局部变量,而不再脚本或模块的全局空间内。当一个函数被调用时,首先会在函数命名空间内搜索函数内的变量名,如果在函数和体内未找到对象名称,然后就会在脚本或模块的全局空间内进行搜索。
lambda函数(又称匿名函数)
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,不如就重新定义一个函数吧。
比如上面的add函数用lambda写就是这样:
result = lambda x,y : x + y
print(result(12,8))
lambda函数不包括return,而是包括一个表达式,而且总是会返回该表达式的值。且可以有任意多个参数,并返回单个表达式的值。
当然,也不是任何情况下lambda函数都要比常规函数更清晰明了,Python之禅中有这么一句话:Explicit is better than implicit,就是说那种方式更清晰就用哪一种方式,不要盲目的都使用lambda表达式。
struct模块
struct模块是Python的内置模块,可以在自定义格式的基础上将字符串转化为元组。struct方法pack(format, v1, v2, ...)可以根据字符串格式返回由v1, v2, ...值压缩成的单一字符串。例如:
import struct
format = '2s3s'
a = struct.pack(format, '10','100')
a
表示两个字符的字符串后面跟一个三个字符的字符串。
需要注意的是上面的例子在Python 2.x中可以编译成功,因为s表示的是字符串:
而在Python 3.x中则会报错:
---------------------------------------------------------------------------
error Traceback (most recent call last)
<>-6-5811fc7b09a8> in ()
1 import struct
2 format = '2s3s'
----> 3 a = struct.pack(format, '10','100')
4 a
error: argument for 's' must be a bytes object
这是因为在Python 3.x中,格式化字符串的s参数,在Python中的类型是bytes类型。所以把字符串的地方转为字节类型即可解决:
import struct
format = '2s3s'
a = struct.pack(format, b'10',b'100')
a
在表中可以看到,c,s,p的Python type都是bytes类型,所以在使用这些类型的时候,要将需要pack的字符串写成bytes型的。
方法unpack(format, string)按照根据format编码格式将string解压为元组,字符串中包含的字符与格式字符数必须相等。
import struct
format = '2s3s'
line = '10100'
col = struct.unpack(format, line)
col
同样的,在Python 3.x需要写成:
import struct
format = '2s3s'
line = '10100'
col = struct.unpack(format, bytes(line.encode('utf-8')))
col
这里除了要把字符串的地方转为字节类型,还要先转成utf-8的编码,否则报错string argument without an encoding。
方法calcsize(fmt)返回给定格式化字符串的总字符数。
import struct
format = '2s3s'
struct.calcsize(format) # 5
问题
在PDB数据库中下载1tld.pdb文件。已知胰蛋白酶活性部位为 Asp 102、His 57和Ser 195。识别pdb文件中的这三个残基并提取其坐标保存到文件中。
PDB文件的格式:pdb
pdb_format = '6s5s1s4s1s3s1s1s4s1s3s8s8s8s6s6s10s2s3s'
答案
代码使用两个函数来完成这项任务:一个从PDB文件中解析单行,调用struct模块来将单行进行切分,得到所需的数据(残基名称,序号,坐标)输出为元组;另一个则用于处理整个文件,进行条件判断和写入。
正如上一部分所说的在Python3中s的Python type是bytes类型,所以当进行条件判断时需要进行decode解码。decodePython3答案
import struct
pdb_format = '6s5s1s4s1s3s1s1s4s1s3s8s8s8s6s6s10s2s3s'
def parse_atom_line(line):
'''return an ATOM line parsed to a tuple'''
tmp = struct.unpack(pdb_format, bytes(line.encode('utf-8')))
atom = tmp[3].strip()
res_type = tmp[5].strip()
res_num = tmp[8].strip()
chain = tmp[7].strip()
x = float(tmp[11].strip())
y = float(tmp[12].strip())
z = float(tmp[13].strip())
return chain, res_type, res_num, atom, x, y, z
def main(pdb_file, residues, outfile):
'''writes residues from a PDB file to an output file'''
pdb = open(pdb_file)
outfile = open(outfile, 'w')
for line in pdb:
if line.startswith('ATOM'):
res_data = parse_atom_line(line)
res2type = bytes.decode(res_data[1])
res2num = bytes.decode(res_data[2])
for aa,num in residues:
if res2type == aa and res2num == num:
outfile.write(line)
outfile.close()
residues = [('ASP', '102'), ('HIS', '57'), ('SER', '195')]
main('1TLD.pdb', residues, 'trypsin_triad.pdb')Python2答案
import struct
pdb_format = '6s5s1s4s1s3s1s1s4s1s3s8s8s8s6s6s10s2s3s'
def parse_atom_line(line):
'''return an ATOM line parsed to a tuple'''
tmp = struct.unpack(pdb_format, line)
atom = tmp[3].strip()
res_type = tmp[5].strip()
res_num = tmp[8].strip()
chain = tmp[7].strip()
x = float(tmp[11].strip())
y = float(tmp[12].strip())
z = float(tmp[13].strip())
return chain, res_type, res_num, atom, x, y, z
def main(pdb_file, residues, outfile):
'''writes residues from a PDB file to an output file'''
pdb = open(pdb_file)
outfile = open(outfile, 'w')
for line in pdb:
if line.startswith('ATOM'):
res_data = parse_atom_line(line)
for aa,num in residues:
if res_data[1] == aa and res_data[2] == num:
outfile.write(line)
outfile.close()
residues = [('ASP', '102'), ('HIS', '57'), ('SER', '195')]
main('1TLD.pdb', residues, 'trypsin_triad.pdb')
python的编程方式模块化_我的Python笔记·模块化编程(一)相关推荐
- 计算机编程导论python程序设计答案-学堂在线_计算机科学与Python编程导论_作业课后答案...
学堂在线_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 近代中国完全沦为半殖民地半封建社会的标志是:A.<马关条约>B.<辛丑条约>C.<凡尔赛和 ...
- python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?
现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...
- python如何初始化对象数组_如何理解Python中的面向对象编程?
(由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...
- 计算机编程导论python程序设计答案-学堂云_计算机科学与Python编程导论_作业课后答案...
学堂云_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 保本基金参与股指期货交易,应当根据风险管理的原则,以套期保值为目的.() 基金经理主要依据股票投资价值报告来决定实际的投资 ...
- python都有什么包_常用的Python包有哪些,如何快速掌握Python编程
Python入门简单.功能强大,是很多想要入行IT开发行业人士的主要选择.Python包可以帮助Web开发人员快速和容易地创建应用程序和功能,因此很多企业在招聘时都会考察求职者对于Python包的掌握 ...
- python最常用的编程方式是什么_python常用模块和对象编程
1.摘要 常用模块 对象编程 领域模型 2.常用模块 2.1shutil模块 2.1.1 shutil.copyfileobj(fsrc, fdst[, length]) 1 f = open(&qu ...
- 编写python程序、计算账户余额_《易学Python》——第1章 为何学习Python 1.1 学习编程...
本节书摘来自异步社区<易学Python>一书中的第1章,第1.1节,作者[澳]Anthony Briggs,王威,袁国忠 译,更多章节内容可以访问云栖社区"异步社区"公 ...
- python编程第一程序_第一个Python程序_Python编程开发教程
第一个Python程序 用notepad++编写程序代码 语言设置为python(高量显示函数和关键字)(注意:行首不能有空格,Python对缩进要求严格) 命令提示符运行 cd \文件名 #打开py ...
- python编程大数据分析_大数据分析Python学习技巧
大数据分析Python是任何开发人员都应该知道的重要编程语言.许多程序员使用这种语言来构建网站,创建学习算法以及执行其他重要任务.但是尝试学习大数据分析Python可能会令人感到恐惧,沮丧和困难,尤其 ...
- python windows窗口置顶_想用Python编程却不知如何下手?一篇搞定编程准备工作
导读:为了简化Python编程的学习难度,开发过程中的工具.环境尽量使用同一套,此后所有的编程环境都以Windows系统下Python3.8为准,代码编辑器及IDE(集成开发环境)使用VS Code. ...
最新文章
- 信息安全评论员18期
- mysql的概念和入门语句
- 【招聘(北京)】北京华光普泰生物招聘.NET软件开发
- 201312-5 I’m stuck!
- 注意力公式步骤每一步的含义,总共三步
- YUV格式学习:YUYV、YVYU、UYVY、VYUY格式转换成RGB24
- 学习日志---hbase学习(最大版本查询)
- 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。
- paip.提升用户体验----置顶菜单
- 过VMP加壳程序的自效验
- ue编辑器漏洞_UEditor编辑器任意文件上传漏洞分析
- 关于.net dll文件反编译
- Oracle 购买价格 和 服务费 计算方式
- diy服务器个人主机_DIY个人服务器
- VR乒乓球项目Unity3D 开发经验整理,1总纲
- 6 个常用的 API 接口在线管理平台
- 电商产品设计:拆单规则和业务场景详解
- 力扣-两数之和 (梦开始的地方)
- Can't locate Time/HiRes.pm
- 搭建邮件群发服务器费用,自建邮件群发服务器优缺点分析
热门文章
- svg path绘制心形_SVG 菜鸟的 Recharts 自定义图表实战
- fiddler设置中文版本_突破安卓7.0以上版本WX小程序抓包篇
- php邮件html模板下载,PHP Mailer与HTML模板和发送变量
- java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...
- mac 安装laravel Valet环境
- vim之添加多行和删除多行
- Opencv3 形态学操作
- 解决网卡无法自动获取ip的办法
- BBAug: 一个用于PyTorch的物体检测包围框数据增强包
- ICCV2021 workshop 多视角残缺点云的补全与配准