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
则将储存于num1
和num2
中的值返回。代码段需要缩进。
Python不同于其他语言,也是它灵活和优势地方,就是能够同时返回多个值。因此在第九行中,num1
赋值给了n1
,num2
赋值给了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, [1, 2, 8, 4, 2,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 1, in
TypeError: 'int' object is not callable
在前两个测试中,内置函数可以赋值给变量,使变量具有该函数的能力(接受实参)。但是,当一个值赋值给内置函数时,该函数就体现为一个变量,不再具有函数本身的能力。这也就是在一开始介绍定义函数名的时候,要规避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, [1, 2, 8, 4
, 2,15,3]):
02 print(i)
sorted()
函数(排序):
参考资料:
《你也能看的懂的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图片!
为了保证质量,
我们将对人数限额。
中秋专场入场券发放 (点击收获)
哦对了想学上面的酷炫动图的可以现场缠着@小洁 小姐姐就好了。别说是我教的!溜~
哦对了,你都看到了这里,
不点个「在看」么?
谢谢老板