打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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
<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 1in <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, [12842,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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python基础篇(五)——函数和表达式
教小朋友学 Python -- 函数与Lambda表达式
Python基础【函数】
大牛带你学习Python中这些简单的函数,看一遍就会
Python函数参数实例解读
100 个 Python 小例子(练习题二)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服