如何自定义和调用函数

定义一个函数

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笔记·模块化编程(一)相关推荐

  1. 计算机编程导论python程序设计答案-学堂在线_计算机科学与Python编程导论_作业课后答案...

    学堂在线_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 近代中国完全沦为半殖民地半封建社会的标志是:A.<马关条约>B.<辛丑条约>C.<凡尔赛和 ...

  2. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...

  3. python如何初始化对象数组_如何理解Python中的面向对象编程?

    (由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...

  4. 计算机编程导论python程序设计答案-学堂云_计算机科学与Python编程导论_作业课后答案...

    学堂云_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 保本基金参与股指期货交易,应当根据风险管理的原则,以套期保值为目的.() 基金经理主要依据股票投资价值报告来决定实际的投资 ...

  5. python都有什么包_常用的Python包有哪些,如何快速掌握Python编程

    Python入门简单.功能强大,是很多想要入行IT开发行业人士的主要选择.Python包可以帮助Web开发人员快速和容易地创建应用程序和功能,因此很多企业在招聘时都会考察求职者对于Python包的掌握 ...

  6. python最常用的编程方式是什么_python常用模块和对象编程

    1.摘要 常用模块 对象编程 领域模型 2.常用模块 2.1shutil模块 2.1.1 shutil.copyfileobj(fsrc, fdst[, length]) 1 f = open(&qu ...

  7. 编写python程序、计算账户余额_《易学Python》——第1章 为何学习Python 1.1 学习编程...

    本节书摘来自异步社区<易学Python>一书中的第1章,第1.1节,作者[澳]Anthony Briggs,王威,袁国忠 译,更多章节内容可以访问云栖社区"异步社区"公 ...

  8. python编程第一程序_第一个Python程序_Python编程开发教程

    第一个Python程序 用notepad++编写程序代码 语言设置为python(高量显示函数和关键字)(注意:行首不能有空格,Python对缩进要求严格) 命令提示符运行 cd \文件名 #打开py ...

  9. python编程大数据分析_大数据分析Python学习技巧

    大数据分析Python是任何开发人员都应该知道的重要编程语言.许多程序员使用这种语言来构建网站,创建学习算法以及执行其他重要任务.但是尝试学习大数据分析Python可能会令人感到恐惧,沮丧和困难,尤其 ...

  10. python windows窗口置顶_想用Python编程却不知如何下手?一篇搞定编程准备工作

    导读:为了简化Python编程的学习难度,开发过程中的工具.环境尽量使用同一套,此后所有的编程环境都以Windows系统下Python3.8为准,代码编辑器及IDE(集成开发环境)使用VS Code. ...

最新文章

  1. 信息安全评论员18期
  2. mysql的概念和入门语句
  3. 【招聘(北京)】北京华光普泰生物招聘.NET软件开发
  4. 201312-5 I’m stuck!
  5. 注意力公式步骤每一步的含义,总共三步
  6. YUV格式学习:YUYV、YVYU、UYVY、VYUY格式转换成RGB24
  7. 学习日志---hbase学习(最大版本查询)
  8. 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。
  9. paip.提升用户体验----置顶菜单
  10. 过VMP加壳程序的自效验
  11. ue编辑器漏洞_UEditor编辑器任意文件上传漏洞分析
  12. 关于.net dll文件反编译
  13. Oracle 购买价格 和 服务费 计算方式
  14. diy服务器个人主机_DIY个人服务器
  15. VR乒乓球项目Unity3D 开发经验整理,1总纲
  16. 6 个常用的 API 接口在线管理平台
  17. 电商产品设计:拆单规则和业务场景详解
  18. 力扣-两数之和 (梦开始的地方)
  19. Can't locate Time/HiRes.pm
  20. 搭建邮件群发服务器费用,自建邮件群发服务器优缺点分析

热门文章

  1. svg path绘制心形_SVG 菜鸟的 Recharts 自定义图表实战
  2. fiddler设置中文版本_突破安卓7.0以上版本WX小程序抓包篇
  3. php邮件html模板下载,PHP Mailer与HTML模板和发送变量
  4. java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...
  5. mac 安装laravel Valet环境
  6. vim之添加多行和删除多行
  7. Opencv3 形态学操作
  8. 解决网卡无法自动获取ip的办法
  9. BBAug: 一个用于PyTorch的物体检测包围框数据增强包
  10. ICCV2021 workshop 多视角残缺点云的补全与配准