社区所有版块导航
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

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

生信菜鸟团 • 5 年前 • 752 次点击  

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
 
752 次点击