Python 内置函数II,匿名函数

举报
Yuchuan 发表于 2019/12/19 01:42:23 2019/12/19
【摘要】 Python 内置函数和匿名函数学习

1. 内置函数Ⅱ

1576801796929754.png

作用域相关

1576801922304976.png

基于字典的形式获取局部变量和全局变量

globals()——获取全局变量的字典

locals()——获取执行本方法所在命名空间内的局部变量的字典

其他

1576802020372407.png

和数字相关

1576802089780206.png

数字——数据类型相关:bool,int,float,complex

数字——进制转换相关:bin,oct,hex

数字——数学运算:abs,divmod,min,max,sum,round,pow

和数据结构相关

1576802173508721.png

序列——列表和元组相关的:list和tuple

序列——字符串相关的:str,format,bytes,bytearry,memoryview,ord,chr,ascii,repr

数据集合——字典和集合:dict,set,frozenset

数据集合:len,sorted,enumerate,all,any,zip,filter,map

红色重点讲解

abs()enumerate()filter()map()max()min()open()range()print()
len()list()dict()str()reversed()set()sorted()sum()tuple()
type()zip()dir()





昨天,我们已经比较重要的内置函数讲完了,那么今天我们要讲的是最最重要的内置函数,这些内置函数是面试与工作中经常用到的,所以,今天的这些内置函数,我们一定要全部记住,并且熟练使用。

print() 屏幕输出。

"""
源码分析
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print

    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    file:  默认是输出到屏幕,如果设置为文件句柄,输出到文件
    sep:   打印多个值之间的分隔符,默认为空格
    end:   每一次打印的结尾,默认为换行符
    flush: 立即把内容输出到流文件,不作缓存

"""

print(666, 888, 999, sep='*')  # 111*222*333
print(666, end='')
print(777)  # 两行的结果 111222
fd = open('log', 'w', encoding='utf-8')
print('Hello World', file=fd, flush=True)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
666*888*999
666777

Process finished with exit code 0

int():pass

str():pass

bool():pass

set(): pass

list() 将一个可迭代对象转换成列表

tuple() 将一个可迭代对象转换成元组

dict() 通过相应的方式创建字典。

lis1 = list("abcd")
print(lis1)

tu1 = tuple("abcd")
print(tu1)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
['a', 'b', 'c', 'd']
('a', 'b', 'c', 'd')

Process finished with exit code 0

abs() 返回绝对值

num = -166
print(abs(num))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
166

Process finished with exit code 0

sum() 求和

print(sum([1, 2, 3, 4, 5]))
print(sum((1, 2, 3, 4, 5), 112))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
15
127

Process finished with exit code 0

min() 求最小值

print(min([1, 2, 3]))  # 返回此序列最小值
ret = min([1, 2, -5, ], key=abs)  # 按照绝对值的大小,返回此序列最小值
print(ret)
# 加key是可以加函数名,min自动会获取传入函数中的参数的每个元素,然后通过你设定的返回值比较大小,返回最小的传入的那个参数。
print(min(1, 2, -5, 6, -3, key=lambda x: abs(x)))  # 可以设置很多参数比较大小
dic = {'a': 3, 'b': 2, 'c': 1}
print(min(dic, key=lambda x: dic[x]))
# x为dic的key,lambda的返回值(即dic的值进行比较)返回最小的值对应的键

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
1
1
1
c

Process finished with exit code 0

max() 最大值与最小值用法相同。

reversed() 将一个序列翻转, 返回翻转序列的迭代器 reversed 示例:

genera = reversed("你好")
print(list(genera))
genera1 = reversed([1, "和和", 2, 3, 6])
print(list(genera1))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
['好', '你']
[6, 3, 2, '和和', 1]

Process finished with exit code 0

bytes() 把字符串转换成bytes类型

s = "你好妹妹"
s_data = s.encode("utf-8")
print(s_data)

s_data1 = s_data.decode("utf-8")
print(s_data1)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\xa6\xb9\xe5\xa6\xb9'
你好妹妹

Process finished with exit code 0
s = "你好妹妹"
s_data = bytes(s, encoding="utf-8")
print(s_data)

s_data1 = str(s_data, encoding="utf-8")
print(s_data1)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\xa6\xb9\xe5\xa6\xb9'
你好妹妹

Process finished with exit code 0

zip() 拉链方法。函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,

然后返回由这些元祖组成的内容,如果各个迭代器的元素个数不一致,则按照长度最短的返回,

lst1 = [1, 2, 3]
lst2 = ['a', 'b', 'c', 'd']
lst3 = (111, 121, 131, 141, 151)

for i in zip(lst1, lst2, lst3):
    print(i)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
(1, 'a', 111)
(2, 'b', 121)
(3, 'c', 131)

Process finished with exit code 0

sorted排序函数

"""
语法: sorted(iterable, key=None, reverse=False)
iterable: 可迭代对象
key: 排序规则(排序函数), 在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数.根据函数运算的结果进行排序
reverse: 是否是倒叙, True
倒叙
False
正序
"""

lst = [1, 3, 2, 5, 4]
lst2 = sorted(lst)
print(lst)  # 原列表不会改变
print(lst2)  # 返回的新列表是经过排序的

lst3 = sorted(lst, reverse=True)
print(lst3)  # 倒叙

# 字典使用sorted排序
dic = {1: 'a', 3: 'c', 2: 'b'}
print(sorted(dic))  # 字典排序返回的就是排序后的key

# 和函数组合使用
# 定义一个列表,然后根据一元素的长度排序
lst = ['天龙八部', '西游记', '红楼梦', '三国演义']


# 计算字符串的长度
def func(s):
    return len(s)


print(sorted(lst, key=func))

# 和lambda组合使用

lst = ['天龙八部', '西游记', '红楼梦', '三国演义']

print(sorted(lst, key=lambda s: len(s)))

lst = [{'id': 1, 'name': 'alex', 'age': 18},
       {'id': 2, 'name': 'wusir', 'age': 17},
       {'id': 3, 'name': 'taibai', 'age': 16}, ]

# 按照年龄对学生信息进行排序

print(sorted(lst, key=lambda e: e['age']))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
[1, 3, 2, 5, 4]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
[1, 2, 3]
['西游记', '红楼梦', '天龙八部', '三国演义']
['西游记', '红楼梦', '天龙八部', '三国演义']
[{'id': 3, 'name': 'taibai', 'age': 16}, {'id': 2, 'name': 'wusir', 'age': 17}, {'id': 1, 'name': 'alex', 'age': 18}]

Process finished with exit code 0

filter筛选过滤

"""
语法: filter(function, iterable)
function: 用来筛选的函数, 在filter中会自动的把iterable中的元素传递给function, 
然后根据function返回的True或者False来判断是否保留此项数据
iterable: 可迭代对象
"""

lst = [{'id': 1, 'name': 'alex', 'age': 18},
       {'id': 1, 'name': 'wusir', 'age': 17},
       {'id': 1, 'name': 'taibai', 'age': 16}, ]

ls = filter(lambda e: e['age'] > 16, lst)

print(list(ls))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
[{'id': 1, 'name': 'alex', 'age': 18}, {'id': 1, 'name': 'wusir', 'age': 17}]

Process finished with exit code 0

map

"""
映射函数
语法: map(function,iterable) 可以对可迭代对象中的每一个元素进映射,分别取执行function
计算列表中每个元素的平方,返回新列表
"""

lst = [1, 2, 3, 4, 5]


def func(s):
    return s * s


mp = map(func, lst)
print(mp)
print(list(mp))

# 改写成lambda

lst = [1, 2, 3, 4, 5]
print(list(map(lambda s: s * s, lst)))

# 计算两个列表中相同位置的数据的和

lst1 = [1, 2, 3, 4, 5]
lst2 = [2, 4, 6, 8, 10]
print(list(map(lambda x, y: x + y, lst1, lst2)))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
<map object at 0x7fe51e8ab7f0>
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]
[3, 6, 9, 12, 15]

Process finished with exit code 0

reduce

from functools import reduce


def func(x, y):
    return x + y


# reduce 的使用方式:
# reduce(函数名,可迭代对象)  # 这两个参数必须都要有,缺一个不行
ret = reduce(func, [3, 4, 5, 6, 7])
print(ret)  # 结果 25
"""
reduce的作用是先把列表中的前俩个元素取出计算出一个值然后临时保存着,
接下来用这个临时保存的值和列表中第三个元素进行计算,求出一个新的值将最开始
临时保存的值覆盖掉,然后在用这个新的临时值和列表中第四个元素计算.依次类推
注意:我们放进去的可迭代对象没有更改
以上这个例子我们使用sum就可以完全的实现了.我现在有[1,2,3,4]想让列表中的数变成1234,就要用到reduce了.
普通函数版
"""


# from functools import reduce


def func(x, y):
    return x * 10 + y
    # 第一次的时候 x是1 y是2  x乘以10就是10,然后加上y也就是2最终结果是12然后临时存储起来了
    # 第二次的时候x是临时存储的值12 x乘以10就是 120 然后加上y也就是3最终结果是123临时存储起来了
    # 第三次的时候x是临时存储的值123 x乘以10就是 1230 然后加上y也就是4最终结果是1234然后返回了


l = reduce(func, [1, 2, 3, 4])
print(l)
# 匿名函数版
l = reduce(lambda x, y: x * 10 + y, [1, 2, 3, 4])
print(l)
"""
在Python2.x版本中recude是直接
import就可以的, Python3.x版本中需要从functools这个包中导入
龟叔本打算将
lambda 和 reduce
都从全局名字空间都移除, 舆论说龟叔不喜欢lambda和reduce
最后lambda没删除是因为和一个人写信写了好多封, 进行交流然后把lambda保住了.
"""

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo006.py
25
1234
1234

Process finished with exit code 0

2. 匿名函数

匿名函数,顾名思义就是没有名字的函数,那么什么函数没有名字呢?这个就是我们以后面试或者工作中经常用匿名函数 lambda,也叫一句话函数。

现在有一个需求:你们写一个函数,此函数接收两个int参数,返回和值。

def sum_func(num1, num2):
    return num1 + num2


print(sum_func(22, 98))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo007.py
120

Process finished with exit code 0

那么接下来我们用匿名函数完成上面的需求:

sum_func = lambda num1, num2: num1 + num2
print(sum_func(66, 88))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo007.py
154

Process finished with exit code 0

我们分析一下上面的代码:

语法:

1576801376676653.png

  函数名 = lambda 参数:返回值

    1)此函数不是没有名字,他是有名字的,他的名字就是你给其设置的变量,比如func

    2)lambda 是定义匿名函数的关键字,相当于函数的def

    3)lambda 后面直接加形参,形参加多少都可以,只要用逗号隔开就行。

#参数可以有多个,用逗号隔开
#匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
#返回值和正常的函数一样可以是任意数据类型

func = lambda a, b, *args, sex='fmale', c, **kwargs: kwargs
print(func(3, 4, c=666, name='HuayingWen'))  # {'name': 'alex'}
# 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到。

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo007.py
{'name': 'HuayingWen'}

Process finished with exit code 0

    4)返回值在冒号之后设置,返回值和正常的函数一样,可以是任意数据类型。

    5)匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据

接下来做几个匿名函数的小题:

写匿名函数:接收一个可切片的数据,返回索引为0与2的对应的元素(元组形式)。

func = lambda args: (args[0], args[2])
print(func("dhsdkdjskjhf"))
print(func([0, 1, 2, 3, 4, 5]))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo007.py
('d', 's')
(0, 2)

Process finished with exit code 0

写匿名函数:接收两个int参数,将较大的数据返回。

func = lambda num1, num2: num1 if num1 > num2 else num2
print(func(67, 10))
print(func(67, 99))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo007.py
67
99

Process finished with exit code 0

本章小结

说学习内置函数,不如说整理自己的知识体系。其实整理这些内置函数的过程也是在整理自己的知识体系。

我们讲课的时候会归类:常用或者不常用,主要还是根据场景而言。

一个优秀的程序员就应该是在该用这个方法的时候信手拈来,把每一个内置的函数都用的恰到好处。

要想做到这一点,至少要先了解,才能在需要的时候想起,进而将它用在该用的地方。

但是在这里,我还是以自己的一点经验之谈,把几个平时工作中相对更常用的方法推荐一下,请务必重点掌握:

其他:input,print,type,hash,open,import,dir

str类型代码执行:eval,exec

数字:bool,int,float,abs,divmod,min,max,sum,round,pow

序列——列表和元组相关的:list和tuple

序列——字符串相关的:str,bytes,repr

序列:reversed,slice

数据集合——字典和集合:dict,set,frozenset

数据集合:len,sorted,enumerate,zip,filter,map






【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。