【小白学 Python】介绍几个小而美的 Python 函数

函数是一个独立且封闭完成特定功能的代码块,可以在任何地方被调用。

比如print()函数,无论你在程序中的任何地方调用,都是输出()中的内容。这种独立的封闭代码块又称为封装,也可以把函数理解为一个盒子。

盒子里面的代码就是封装好的,完成特定的功能,外面的代码不属于函数。

在Python中,函数分为内建函数和用户自定义函数。

内建函数是Python程序语言已经给我们创建好了,直接可以使用。这一类的函数很多,接下来我们介绍几个经常用到的小而美的函数:

01 map 函数

概念

map函数也正如其取名一样,是一个将接受的迭代变量依次经过某种映射,并输出映射后的迭代变量。

例如,如果对列表中的某个变量依次完成求值,并返回一个新的列表,则可以应用map:

a = [1, 2, 3, 4]map(str, a)# <map at 0x1da017136d8>list(map(str, a))# ['1', '2', '3', '4']

该函数接受两个实际参数,一个是函数的名字,另一个是列表名字,目的是把列表中的每一个元素都调用在function函数进行处理,并且返回一个新的列表。如果顺序错误,就是把函数作用在列表上,会出错的。

注意一个新语法点是函数作为参数传递给其他函数,为下面的内容。如若不理解该部分内容,可以先跳过。

 

number = [2, 5, 7, 8]# 定义函数:求数字加上19的和def sum_list(s):    sum_l = s + 19    return sum_lprint('原来的数字是:',number)# 调用map ()函数print('所有数字加上10以后得到的值是:', list(map(sum_list, number)))# 顺序错误,则程序出错:’function’ object is not iterableprint('所有数字加上10以后得到的值是:', list(map(number, sum_list)))

 

原来的数字是: [2, 5, 7, 8]

所有数字加上10以后得到的值是:[21, 24, 26, 27]

Traceback (most recent call last):

  File "/Users/seven_days_python/Forth_day_strcure/list_p.py", line 278, in <module>

    print('所有数字加上10以后得到的值是:', list(map(number, sum_list)))

TypeError: 'function' object is not iterable

这是map函数的一个典型用法:接受2个参数,第一个参数(上例中是number 函数)是一个要作用的函数,第二个参数是可迭代变量。

当第一个函数的参数是是一个多变量函数时,map也可以接受更多的参数。例如:

a = [1, 2, 3, 4]b = [2, 2, 3, 3]list(map(lambda x, y:x**y, a, b))# [1, 4, 27, 64


02  ZIP 函数

Python中有一个常用的内建函数zip()把列表、元组或其他序列的元素配对,打包成一个个元组,然后返回成一个由元组对组成的列表。

该函数可以处理任意长度的序列,它生成列表的长度则由最短的序列决定。最后,我们可以使用for循环遍历这个列表,得到每一个值。

language_6 = ['Python', 'Java', 'C++']names = ['Xiaoming', 'Andy', 'Baby']# 打包变量print('打包后的列表是:',list(zip(language_6, names)))
# 使用循环输出for name, value in zip(language_6, names):    print('{}:{}'.format(name,value))
letters = ['a', 'b', 'c']nums = [1, 2]# 打包变量print('根据最短的列表打包:', list(zip(letters, nums)))# 使用循环输出for letter, num in zip(letters, nums):    print("{}: {}".format(letter, num))

03  匿名(Lambda) 函数

概念

顾名思义,匿名函数就是没有函数名字的函数。匿名函数是使用lambda关键字定义。该关键字表明定义了一个匿名函数。

 

定义匿名函数语法是:

lambda arg1, arg2, ………  : expression

 

使用lambda关键字定义;

参数arg1, arg2等表示1个或多个参数列表,注意不需要括号;

冒号:不是表示新的语句块

表达式:expression是对参数列表中的参数进行计算,

注意:没有retrun返回,整个表达式的结果为匿名函数的返回值;匿名函数只能写在一行上,也被称为单行函数;匿名函数中不需要出现if while for等语句;

 

首先,使用lambda定义匿名函数lambda x : x **2,然后查看其输出是 function类型 ,说明是一个函数。

 

例子

# lambda x : x **2 定义匿名函数,查看返回值是 function ,说明是一个函数print('lambda 是匿名函数:', lambda x : x ** 2)
 
lambda 是匿名函数:<function <lambda> at 0x10c712510>

 

匿名函数也是函数,与 def定义的函数有一定的区别和联系。匿名函数没有名字,并且也没有return语句。匿名函数简化了函数的定义,使得代码更为简洁。

对于一些小的计算任务,我们推荐使用lambda函数,而复杂的运算可以使用 def 定义函数。

但是,匿名函数可以转化为 def 定义的函数。把lambda中的参数列表变成def 中的参数列表;lambda中的表达式变成def定义的函数体;最后给函数起一个名字。

我们把上面的lambda表达式变成def定义的函数。首先,把匿名函数中的参数 x变成 def 函数中的参数 number,也就是两者的参数必须一样;然后,我们把匿名函数中的表达式 x**2 变成def 函数中的函数体;最后给def 函数取个名字 power_function。

 

转化匿名函数

def power_function(number):    """        求一个数字的幂    :param number:    :return:    """    print('通过 def 定义函数的结果:', number ** 2)

# 调用函数power_function(3)

执行匿名函数的结果: 9

 

 

对于 def 定义的函数power_function,我们直接调用函数名字即可执行。比如求3的平方。但是,由于匿名函数没有名字,只有参数和表达式组成。我们不能像调用def定义的函数一样调用匿名函数。

我们使用双括号的方法实现。

第一个括号:把整个lambda表达式用小括号括起来,就可以一直执行匿名函数;

第二个括号:在第一个括号之后,用来给匿名函数传递参数。

同样是求3的平方。当我们使用lambda的时候,我们首先把lambda表达式括起来,然后再使用一个小括号给匿名函数传递参数3.

 

执行匿名函数
# 执行匿名函数print('执行匿名函数的结果:', (lambda x : x ** 2)(3))
 
执行匿名函数的结果:9

 

除了上面的双括号方法,

我们还可以使用赋值的方法,把整个匿名函数赋值给一个变量。

比如把前面的lambda表达式赋值给lam_fun;然后通过名字调用匿名函数,也就是lam_fun(3)

 

# 通过赋值方法定义匿名函数lam_fun = lambda x: x ** 2print(lam_fun)print('通过赋值方法定义匿名函数', lam_fun(3))
 
<function <lambda> at 0x10b90a510>
通过赋值方法调用匿名函数 9

 

匿名函数的使用场景

由于匿名函数使得代码更为简洁,我们在各个Python领域经常用到。

比如匿名函数在大数据分析中非常方便,因为匿名函数可以作为参数直接传递给其他函数。

匿名函数的代码量比较小,将其作为参数传递,比写一个完整的函数或赋值给一个变量更为方便。

假如,

在一个培训机构的课程报名信息表中,我们使用字典 word保存部分信息。其中报名Python的有40名、报名Java的15名以及报名C++的20名。然后,为了方便对其计算,我们使用list()将其转化为列表 word_list。

 

报名信息

# 报名编程语言课的人数# 排序中使用lambdaword = {'Python':40, 'Java':15, 'C++':20}
# 转化为列表,请查看其类型和输出元素word_list = list(word.items())print(type(word_list))print('输出列表:', word_list)

 

通过输出word_list,我们知道其是一个由元组构成的列表。

如果我们计划对其排序,比如按照报名人数排序,我们需要用到 sorted或者 sort()中的参数key,指明按照元组中哪个元素排序,也就是排序规则。

通常,我们使用lambda函数定义参数key中的规则。比如 x表示列表中的一个元素,在这里,表示一个元组,x只是临时起的一个名字。x[0]表示元组里的第一个元素,当然第二个元素就是x[1]。

下面代码中的意思就是按照列表中第一个元素或者第二个元素排序。  

 

排序报名信息

# 按照语言名字排序 sorted()中的key是规则,sorted_key = sorted(word_list, key=lambda x: x[0])print('按照元组中第一个元素(语言名字)排序:', sorted_key)
# 按照 value 排序print('按照元组中第二个元素(人数)排序', sorted(word_list, key=lambda x: x[1]))

 

按照元组中第一个元素(语言名字)排序: [('C++', 20), ('Java', 15), ('Python', 40)]

按照元组中第二个元素(人数)排序 [('Java', 15), ('C++', 20), ('Python', 40)]

 

更近一步,我可以把lambda函数当作参数,放在filter()或者map()函数中。

首先,我们查找报名人数大于18人的课程信息,

然后分别查看课程名字以及报名人数信息。

 

其他查询条件

# filter: 根据条件查找数据# 查找报名人数大于18的课程filtered_list = list(filter(lambda x:x[1] > 18, word_list))print('查找报名人数大于18的课程', filtered_list)
print()
# map()mapped_list = list(map(lambda x:x[0], word_list))print('只查看课程名字:', mapped_list)
print()
# map()mapped_list = list(map(lambda x:x[0], word_list))print('只查看报名信息:', mapped_list)

 

查找报名人数大于18的课程 [('Python', 40), ('C++', 20)]

 

只查看课程名字: ['Python', 'Java', 'C++']

 

只查看报名信息: ['Python', 'Java', 'C++']

04 reduce 函数

map和filter函数都是多入多出型,实质上是完成了特定的变换或筛选。

reduce则是归约函数,将一系列输入变量经过特定的函数后转化为一个结果输出。

不过可能是由于应用场景有限的原因,reduce在python3中已不再是全局调用函数,必须要从functools包中导入方可使用:

from functools import reducea = range(5)reduce(lambda x, y: x+y, a)# 10

reduce函数还可以接受一个可选的初始值作为参数。应用reduce函数可以实现很多小trick,就看能不能想的到用的出

from functools import reduces = 'abcdefg'reduce(lambda x, y: y+x, s, 'AA')# 'gfedcbaAA'

正是因为这些小而美的函数使得 Python更加流行,

但是,作为初学者不需要像背书一样背下来,而是要根据业务的需要去写代码,然后记住这些函数。老话说的很有道理,用多了就知道了。

另外,如果您是初学  Python,请往下阅读

以上内容摘自《零基础轻松学 Python》

零基础学 Python,请往看下嘛

 只需7天时间,跨进Python编程大门,已有3800+加入

【基础】0基础入门python,24小时有人快速解答问题;
【提高】40多个项目实战,老手可以从真实场景中学习python;
【直播】不定期直播项目案例讲解,手把手教你如何分析项目;
【分享】优质python学习资料分享,让你在最短时间获得有价值的学习资源;圈友优质资料或学习分享,会不时给予赞赏支持,希望每个优质圈友既能赚回加入费用,也能快速成长,并享受分享与帮助他人的乐趣。
【人脉】收获一群志同道合的朋友,并且都是python从业者
【价格】本着布道思想,只需 69元 加入一个能保证学习效果的良心圈子。

【赠予】价值109元 0基础入门在线课程,免费送给圈友们,供巩固

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值