019--python内置函数
一、内置高阶函数
map函数:接收两个数据 函数和序列,map()将函数调用'映射'到序列身上,并返回一个含有所有返回值的一个列表
num1 = [1,2,3,4,5]
num2 = [5,4,3,2,1] def add_one(x): #加
return x+1 def reduce_one(x): #减
return x-1 def pow(x): #平方
return x**2 def map_test(func,array):
res = []
for i in array:
res.append(func(i))
return res res1 = map_test(pow,num1)
print(res1)
res2 = map_test(lambda x:x+1,num1)
print(res2) #内置函数map
res3 = map(reduce_one,num2)
print(list(res3))
reduce函数:接收两个数据 函数和序列,reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做相应计算
num1 = [1,2,3,4,100,200]
def reduce_test(func,array,init=None): if init==None:
res=array.pop(0)
else:
res=init
for i in array:
res=func(res,i)
return res
print(reduce_test(lambda x,y:x*y,num1,10)) #内置reduce函数
from functools import reduce
print(reduce(lambda x,y:x+y,num1))
filter函数:接收两个数据 函数和序列,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
num1 = [1,5,20,30,100,200]
def filter_test(func,array):
res = []
for i in array:
res.append(func(i))
return res res1 = filter_test(lambda x:x>99,num1)
print(res1) #内置filter函数
res2 = filter(lambda n:n>99,num1)
print(list(res2))
二、其它内置函数
eval()把字符串中的数据结构提取出来
a = "{'a':23,'b':43,'book':'english'}"
print(eval(a)) hash()可以hash的数据类型是不可变数据类型
a = 'alex'
b = hash(a)
print(b)
zip 函数(组成一一对应的元组)(如果外面不加一个lis那没得到的就是一个zip对象)
print(list(zip(('a','b','c'),(1,2,3))))
print(list(zip(('a','b','c'),(1,2,3,4))))
print(list(zip(('a','b','c','d'),(1,2,3)))) p = {'name':'alex','age':23,'gender':'male'}
print(list(zip(p.keys(),p.values())))
输出结果为:
[('a', 1), ('b', 2), ('c', 3)]
[('a', 1), ('b', 2), ('c', 3)]
[('a', 1), ('b', 2), ('c', 3)]
[('name', 'alex'), ('age', 23), ('gender', 'male')] max 和 min 函数
l = [
(5,'e'),
(2,'b'),
(3,'c'),
(6,'d')
] print(list(max(l)))
max 函数的两点说明:
1.max处理的是可以迭代的对象,相当于for循环取出每个元素进行比较,不同数据类型之间不可以比较
2.每个元素之间的比较是从每个元素的第一个位置依次比较,如果此位置可以区分出大小,后面就不需要比较了,直接得出这两个元素的大小 sorted函数的使用(都是按照从小到大的顺序进行排列) name_dict ={
'yuanhao':80,
'alex':99,
'wupeiqi':700
}
print(sorted(name_dict))
print(sorted(name_dict,key = lambda key:name_dict[key]))
1.对数据的进制转化
a = hex(12)#十进制转十六进制
b = bin(12) #十进制转二进制
c = oct(12) #十进制转八进制
print(a)
print(b)
print(c) 输出结果为:
0xc
0b1100
0o14 2.数字转字母,字母转数字(ASCII表)
a = ord('A')
b = chr(99)
print(a,b)
输出结果:65 c 3.divmod 取余函数(用在做网页的文章分页)
c = divmod(10,3)
print(c)
输出结果:(3, 1) #3余数为1 4.求次方函数
d = pow(2,3)
e = pow(2,3,4)
print(d,e) #d:2的3次方;e:2的3次方对4取余 5.reversed函数取翻转 6.round() #四舍五入函数
7.abs()
# print(abs(-10))
输出 10 8.all()函数 判断列表内是否都为真
>>> print(all([1,2,'','']))
False 9.any()函数 有一真则为真 >>>print(any([0,'',1])) >>>True 10.bytes()函数 name='你好'
print(bytes(name,encoding='utf-8'))
print(bytes(name,encoding='utf-8').decode('utf-8')) print(bytes(name,encoding='gbk'))
print(bytes(name,encoding='gbk').decode('gbk')) print(bytes(name,encoding='ascii'))#ascii不能编码中文 11.isinstance()函数 判断数据类型 print(isinstance(1,int))
print(isinstance('abc',str))
print(isinstance([],list))
print(isinstance({},dict))
print(isinstance({1,2},set))
三、迭代器和生成器
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
你可能会问,为什么list、dict、str等数据类型不是Iterator?
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
迭代器小结
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的,例如:
for x in [1, 2, 3, 4, 5]:
pass 实际上完全等价于: # 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break
生成器
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,把列表解析式的中括号改为小括号
生成器小结:
1.是可迭代对象
2.实现了延迟计算,省内存
3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处.
4.只能遍历一次
生成器表达式:
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630> 生成器函数:裴波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
闭包问题示例:
def multipliers():
gs = []
for i in (0, 1, 2, 3):
def g(x):
return i * x
gs.append(g)
return gs # 即4个g(x) gs = [g(x),g(x),g(x),g(x),g(x)]
print([m(2) for m in multipliers()])
# [m(2) for m in multipliers()] 相当于 [m(2) for m in [g(x),g(x),g(x),g(x),g(x)]] 这里的个g(x)就是 def g(x):
# return i * x
# m(2) for m in multipliers()即m是multipliers的一个返回值,即g(x)。 m(2)即g(2),2*3 = 6
# 故结果是【6,6,6,6】 #解决方法一: 使用map函数先生成一个序列(i for i in range(4)) 然后传入lambda表达式i * x 进行计算
def multipliers(x):
return map(lambda i :i * x ,(i for i in range(4)))
print(list(multipliers(2))) # 解决方法二: 在循环的时候就把每次的i值当默认参数传进去
def multipliers():
return [lambda x, i=i : i * x for i in range(4)]
print([m(2) for m in multipliers()]) def multiplier():
gs = []
for i in (0, 1, 2, 3):
def g(x,i=i): # 在循环的时候就把每次的i值当默认参数传进去
return i * x
gs.append(g)
return gs # gs = [ return 0*x , return 1*x , return 2*x , return 3*x ]
print([m(2) for m in multiplier()])
# [m(2) for m in multiplier()] 相当于 [m(2) for m in [ return 0*x , return 1*x , return 2*x , return 3*x ] ]
菜鸟教程:内置函数详解
资料来源:廖雪峰迭代器说明 林海峰迭代器生成器说明
019--python内置函数的更多相关文章
- python内置函数
python内置函数 官方文档:点击 在这里我只列举一些常见的内置函数用法 1.abs()[求数字的绝对值] >>> abs(-13) 13 2.all() 判断所有集合元素都为真的 ...
- python 内置函数和函数装饰器
python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...
- Python基础篇【第2篇】: Python内置函数(一)
Python内置函数 lambda lambda表达式相当于函数体为单个return语句的普通函数的匿名函数.请注意,lambda语法并没有使用return关键字.开发者可以在任何可以使用函数引用的位 ...
- [python基础知识]python内置函数map/reduce/filter
python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...
- Python内置函数进制转换的用法
使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x)Convert an integer numb ...
- Python内置函数(12)——str
英文文档: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string ...
- Python内置函数(61)——str
英文文档: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string ...
- 那些年,很多人没看懂的Python内置函数
Python之所以特别的简单就是因为有很多的内置函数是在你的程序"运行之前"就已经帮你运行好了,所以,可以用这个的特性简化很多的步骤.这也是让Python语言变得特别的简单的原因之 ...
- Python 内置函数笔记
其中有几个方法没怎么用过, 所以没整理到 Python内置函数 abs(a) 返回a的绝对值.该参数可以是整数或浮点数.如果参数是一个复数,则返回其大小 all(a) 如果元组.列表里面的所有元素都非 ...
- 【转】实习小记-python 内置函数__eq__函数引发的探索
[转]实习小记-python 内置函数__eq__函数引发的探索 乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, othe ...
随机推荐
- centos的python2.6.x升级到python2.7.x方法;python2.6.x的版本就不要用了
python2.6.x的版本,现在使用的很多插件都不支持了.所以如果你的centos还是使用的2.6.x版本,不要犹豫,赶紧升级到2.7.x版本 1.所谓升级,就是再安装一个python2.7.x版本 ...
- 如何快速的开发一个完整的iOS直播app(美颜篇)
前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,美颜功能是很重要的,如果没有美颜功能,可能分分钟钟掉粉千万,本篇主要讲 ...
- 关于one-hot encoding思考
Many learning algorithms either learn a single weight per feature, or they use distances between sam ...
- AspNet MVC4 教学-23:Asp.Net MVC4 Display And Editor 模板技术高速应用Demo
A.创建Basic类型的项目. B.在Model文件夹下,创建3个文件: Role.cs: using System; using System.Collections.Generic; using ...
- Oracle创建JOB定时任务
--- DECLARE JOB NUMBER;BEGIN DBMS_JOB.SUBMIT( JOB=>JOB, WHAT=>'CTABLE_T ...
- Method Swizzling以及AOP编程:在运行时进行代码注入-b
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
- 芯片史称:“长平之战”----Intel的东进与ARM的西征(3)--人生如戏,全靠演技
http://www.36kr.com/p/177143.html 从 2003 年到 2008 年,处理器双雄 Intel 和 AMD 在 64 位 CPU 领域展开了一场长达五年,极为惨烈的科技战 ...
- Hadoop源代码分析(完整版)
Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...
- [转]XCode中修改缺省公司名称/开发人员名称
本文转载至 http://www.cnblogs.com/zhulin/archive/2011/11/24/2261537.html XCode新建文件后,头部会有开发人员名称,公司名称等信息 ...
- POJ 1182 食物链(并查集)
题目链接 经过宝哥的讲解,终于对这种问题有了进一步的理解.根据flag[x]和flag[y]求flag[tx]是最关键的了. 0吃1,1吃2,2吃0. 假设flag[tx] = X; 那么X + fl ...