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
<built-in function abs>
>>> x = abs
>>> x
<built-in function abs>
#函数本身赋值给变量
>>> x = abs(-10)
>>> x
10
>>> f = abs
>>> f(-10)
10
#函数名也是变量
>>> abs = 10
>>> abs(-10)
Traceback (most recent call last):
File '<stdin>', line 1, in <module>
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, [1, 2, 8, 4, 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
联系客服