Py学习  »  Python

手把手带你学 Python3(九)| 快速实现数据处理的不二工具(文末有彩蛋)

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

hi小伙伴们!欢迎来到周四推送,这里是python3学习笔记的第篇。

今天将有以下几个要点:


彩蛋你为什么不好好排排站!显得如此突兀

函数是什么

函数,即实现一个特定功能的代码段。是python中的重要技能(工具)。

函数离我们并不远,早期我们已熟练使用了一些内置函数:例如input print等;

当然,要实现更复杂的功能或任务,就需要重新定义一个函数,比如这样:

01 def Plus(a,b):
02     print(a+b)
03    
04 def Enter():
05     num1 = int(input('Please enter number:'))
06     num2 = int(input('Please enter number2:')) 
07     return num1,num2
08    
09 n1,n2 = Enter()
10 Plus(n1,n2)

上述的例子用于简单实现两个数字求和,由两个自定义的函数组成。不难发现,自定义函数的格式以关键词def开头,后接函数名,这里与变量名称定义时规则一致,不能使用 python 中已存在的关键字,大小写敏感,因此例子中的def Plus(): 也成立,小括号中添加参数(形参)。第二行以运行的功能语句为主,在调用第一个函数 Plus 中,将直接输出两者和值;第二个函数 Enter 中,定义语句中并没有变量名,因此调用时不需要提供任何值,而return则将储存于num1num2中的值返回。代码段需要缩进。

Python不同于其他语言,也是它灵活和优势地方,就是能够同时返回多个值。因此在第九行中,num1赋值给了n1num2赋值给了n2。多个变量之间用逗号隔开。在两个简单函数中,返回值可以是任意类型的,执行return后,函数终止。反之,若无返回值,直接调用就好。

主函数

Python程序运行时,只会执行主函数及不在函数内的代码,子函数只会在调用时才会运行。因此,如果程序的调用和被调用的范围仅限于文件内,即可不编写主程序。但是,为了养成良好的习惯和直观性,仍建议编写主函数。

主函数的定义:

01 if _name_ = '_main_':
02     print('This is main.')

03 def Plus(a,b):
04     print(a+b)
05    
06 def Enter():
07     num1 = int(input('Please enter number:'))
08     num2 = int(input('Please enter number2:')) 
09      return num1,num2
10    
11 n1,n2 = Enter()
12 Plus(n1,n2)

还是上面的例子,主函数部分一定会被输出,假设没有12行调用Plus函数,若不调用则不运行。在调用子函数中,需要主要变量的定义,调用时传进的数据是什么类型的变量,那么对应位置上也是该类型的变量。

全局变量

即整个程序都可以使用的变量,用global g 表示。与局部变量对应,可以由下图关系理解。

来看一个例子:

01 a = 1
02
03 def function():
04     global a
05     a += 1
06     global b
07     print (a)

07 function()
08 print (a)
09 print (b)

外部变量可以被改变,内部变量也可以在外部使用。

匿名函数

简单理解就是没有名字的函数,没有函数的格式,简单定义的表达式。用lambda [arg1 [,arg2,.....argn]]:expression 表示,比如我要实现上面的 Plus函数,在此我可以这样写:

r = lambda x,y:x+y。与上面的函数表示来看,lambda只是一个表达式,函数体比def简单很多,能体现的逻辑也少,且不能访问参数列表之外或全局命名空间里的参数。虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

比如套用在函数中,作为判断的语句:

01 for i in filter(lambda x:x<5, [12842,15,3]):
02     print(i)

高阶函数

英文为 Higher-order function ,怎么理解呢。我们从内置函数再来理解一下上面的提及到的 函数名定义规则与变量一致,换句话说 函数名也可以认为是一个变量。什么意思,来看廖老师的例子:

#变量可以指向函数
>>> abs
in function abs>

>>> x = abs
>>> x
in function abs>

#函数本身赋值给变量
>>> x = abs(-10)
>>> x
10

>>> f = abs
>>> f(-10)
10

#函数名也是变量
>>> abs = 10
>>> abs(-10)
Traceback (most recent call last):
  File "", line 1in 
TypeError: 'int' object is not callable

#当然实际代码绝对不能这么写,这里是为了说明函数名也是变量。要恢复abs函数,请重启Python交互环境。
#注:由于abs函数实际上是定义在import builtins模块中的,所以要让修改abs变量的指向在其它模块也生效,要用import builtins; builtins.abs = 10。

在前两个测试中,内置函数可以赋值给变量,使变量具有该函数的能力(接受实参)。但是,当一个值赋值给内置函数时,该函数就体现为一个变量,不再具有函数本身的能力。这也就是在一开始介绍定义函数名的时候,要规避python关键词的目的。

既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

高阶函数,我们以 map(f,list) #对列表内元素逐个处理,举个栗子:

# 对每一个元素进行平方计算
def f(x):
    return x*x

for i in  map(f,[1,2,3,4,5,6,7]):
    print(i)

# 使用正则取列表中所有元素的关键字,省略部分代码
import re
def id(x):
    return re.findall(r'ORF\d+_(.*?):',x)[0]

for line in f:
    if line.startswith('P'):
        line = line.split('\t')
        line1 =list(map(id,line))
        print(line1)

当然还有一些其他的高阶函数,如下:

  • reduce (f,list) 函数:reduce把结果继续和序列的下一个元素做累积计算,比如求list中数的和;

  • filter() 函数(过滤):filter(lamdba x: x%2 ==1, [1, 2, 3, 4, 5]),比如上述匿名函数中的例子:

    01 for i in filter(lambda x:x<5, [1284
    
    2,15,3]):
    02     print(i)
  • sorted() 函数(排序):

    # sorted(iterable, key, reverse)
    # iterable  一个可迭代的对象
    # key 对什么进行排序
    # reverse  bool类型,如果为true为反序, 默认为false
    # 返回值是一个list



参考资料:

《你也能看的懂的python算法书》

枫叶云-Python3中的函数 https://my.oschina.net/u/3804957/blog/1795973

廖雪峰Python教程-高阶函数 https://www.liaoxuefeng.com/wiki/1016959663602400/1017328655674400


猜你喜欢

 三剑客 PyCharm使用  | 编程基础与规范代码 | 列表使用一文就够了 

  元组拆包是个啥?字典与FASTA文件序列抽提 

如何判断序列是否跨过剪切位点 | python3 脚本小实战(代码放送)


强分割线👇


能看到这里的人一定是真爱粉,技能归技能,毕竟也是基础知识的梳理,会显得枯燥与乏味。

可是,是不是有小伙伴直接点了收藏,先挖彩蛋要紧?!

我的彩蛋呢?

👇

👇

👇

偏函数

如果觉得上述的函数还是比较复杂,可以尝试搜索关键字 ‘偏函数’。

简单来说,偏函数指的是通过设定参数的默认值,可以降低函数调用的难度。

举个栗子:

#进制转换
>>> int('12345', base=8)
5349
>>> int('12345', 16)

74565


#二进制转换函数
def int2(x, base=2):
return int(x, base)

>>> int2('1000000')
64
>>> int2('1010101')
85

具体搜索 functools 

👇

👇


以为彩蛋就是这样?

👇

👇

👇

当然不是

生信菜鸟团,生信技能树中秋搞事情啦!

对!

没错!

搞事情!

广州!

9.13-9.15大型线下知识交流会

不用出去看人潮,

不用为资料收集而烦恼!

手把手,吹空调

三天重现发表级SCI图片!


为了保证质量,

我们将对人数限额。

中秋专场入场券发放 (点击收获)


哦对了想学上面的酷炫动图的可以现场缠着@小洁 小姐姐就好了。别说是我教的!溜~

全国巡讲约你


第1-11站北上广深杭,西安,郑州, 吉林,武汉,成都,港珠澳(全部结束)

一年一度的生信技能树单细胞线下培训班(已结束)

全国巡讲第13站-杭州(生信技能树爆款入门课)(已结束)

中秋节一起来学习!全国巡讲第16站-广州(名额紧张)



哦对了,你都看到了这里,

不点个在看么?


谢谢老板

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39512
 
663 次点击