惰性求值、生成器对象是啥?
map、reduce、filter、zip对象都具有惰性求值的特性
惰性求值也叫延迟求值,顾名思义就是表达式不会在它被绑定到变量之后就立即求值,而是等用到时再求值。延迟求值的一个好处是能够建立可计算的无限列表而没有妨碍计算的无限循环或大小问题,
另外,他们还有一个特性:访问过的元素不能再次访问
如:
s1 = [1, 2 , 3]
s2 = "abcd"
r = zip(s1, s2)
for i in r:
print(i)
# 没有任何输出
for i in r:
print(i)
dir() | 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。 |
---|
可以用来获得某个对象所拥有的的方法
class A:
a = 10
def test():
pass
b = 20
print(b)
print(dir()) # 获得当前范围内的变量、方法、定义的类,等信息
print(dir(str)) # 获得str的变量、方法等信息
函数 | 结果 |
---|---|
abs(x) | 返回数字x的绝对值或复数x的模 |
all(iterable) | 如果iterator中所有元素x都有bool(x)等于True,则返回True。对于空的可迭代对象也返回True |
any(iterable) | 只要iterator中存在元素x使得bool(x)为True,则返回True。对于空的可迭代对象,返回False |
ord(x) | 返回 x 的Unicode码,x为单个字符 |
chr(x) | 返回ASCII码中第 x 个位置的字符,x 为数字 |
str(x) | 直接将 x 转换为字符串,x 任意类型参数 |
函数 | 结果 |
---|---|
bin(x) | 将 x 转换为二进制,x 为整数 |
oct() | 将 x 转换为八进制,x 为整数 (octonary) |
hex() | 将 x 转换为十六进制,x 为整数 (hexadecimal) |
函数 | 结果 |
---|---|
max(iterator ) | iterator 中所有元素的最大值 |
min(iterator ) | iterator 中所有元素的最小值 |
sum(iterator ) | iterator 的所有元素的和,其中 iterator 中的元素必须支持加法运算 |
max()和min()的key参数可以用来指定比较规则。
s = ["12", "12311", "2"]
print(min(s, key=len)) # 2
但是这个key可以指定成什么?
函数 | 结果 |
---|---|
type(obj) | 得到obj是什么类型的 |
isinstance(obj, type) | 判断 obj 是不是 type 类型。 |
s = []
print(isinstance(s, list)) # True
函数 | 结果 |
---|---|
sorted(obj) | 对obj进行排序并得到新列表,obj为列表、元组、字典、集合或其他可迭代对象 |
以字符串的长度为排序标准
s = ['12', '1111', '1', '1110']
print(sorted(s, key=lambda item: len(item)))
# ['1', '12', '1111', '1110']
以字符串的长度为排序标准;若两个字符串长度相等,则以字符串本身数字大小为第二排序标准
s = ['12', '1111', '1', '1110']
print(sorted(s, key=lambda item: (len(item), item)))
# ['1', '12', '1110', '1111']
注意这个lambda表达式是怎么写的
x = [[1, 7, 5, 3, 5],
[8, 2, 7, 1, 6],
[9, 6, 10, 7, 6],
[1, 5, 3, 9, 4],
[5, 6, 8, 7, 4]]
r = sorted(x, key= lambda item: (item[1], item[4]))
for i in r:
print(i)
函数 | 结果 |
---|---|
reversed(iterator) | 对iterator进行翻转(首尾交换)并返回可迭代的reversed对象。iterator 为可迭代对象(生成器对象和具有惰性求值特性的zip、map、filter、enumerate等类似对象除外) |
s = range(0,10)
l = reversed(s)
print(type(l)) #
for i in l:
print(i)
函数 | 结果 |
---|---|
range(start, end, step) | 返回具有惰性求值特点的range对象,其中包含左闭右开区间。参数start默认为0,step默认为1。 |
for i in range(0, 10, 3):
print(i)
函数 | 结果 |
---|---|
enumerate(iterator) | 用来枚举可迭代对象中的元素,返回可迭代的enumerate对象,其中每个元素都是包含索引和值的元组。 |
s = ['hello', 'world']
e = enumerate(s)
print(type(e)) #
for i in e:
print(i)
函数 | 结果 |
---|---|
map(func, *iterators) | 把 iterators中的每个iterator的每个元素放在 func 上过一遍,最后得到一个 map 对象。 |
s = 'hello'
s2 = 'world'
l = map(lambda char, c2: "this is {} and {}".format(char, c2), s, s2)
print(type(l)) #
for ll in l:
print(ll)
因为str也是一种序列,所以map将其每个元素都拆开
还有这种操作?
a = "123"
l = list(map(int, a))
print(l) # [1, 2, 3]
reduce(func, iterator) 是标准库 functools 中的函数
函数 | 结果 |
---|---|
reduce(func, iterator) | func 具有两个参数,iterator 中的所有变量依次按照从左向右的顺序传入 func,最终返回一个结果(这个结果不是iterator类型) |
from functools import reduce
s = range(0, 10)
r = reduce(lambda x, y: x + y, s)
r1 = reduce(lambda x, y: "{} + {}".format(x, y), s)
print(type(r)) #
print(r) # 45
print(r1) # 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9
函数 | 结果 |
---|---|
filter(func, iterator) | 将 iterator 中满足某种条件的所有元素返回成一个 filter 对象,func 具有一个参数 |
import random
s= [random.randint(0, 1000) for i in range(0,20)]
s2 = filter(lambda x: x if x> 500 else False, s)
print(type(s2)) #
for i in s2:
print(i)
函数 | 结果 |
---|---|
zip(*iterators) | 把多个可迭代对象中的元素压缩到一起,返回一个可迭代的zip对象Z。其中Z的第 i 个元素是一个长度为 len(iterators) 的元组,该元组的元素是每个 iterator 的第 i 个元素 |
有点绕口,直接看例子:
s1 = [1, 2 , 3]
s2 = "abcd"
r = zip(s1, s2)
for i in r:
print(i)
a = [1, 2, 3]
print(id(a)) # 2637522428424 这个号每运行一次都会改变
def id(*args, **kwargs): # real signature unknown
"""
Return the identity of an object.
This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)
"""
pass
def ord(==*args, **kwargs==): # real signature unknown
""" Return the Unicode code point for a one-character string. """
pass
s = ['12', '1111', '1','0','-1']
s2 = s
print(s2)
s[0] = '1001'
print(s2)
存储的是[‘12’, ‘1111’, ‘1’,‘0’,’-1’]在内存中的位置
print(id(s)) # 2759183524360
print(id(s2)) # 2759183524360
def sorted(*args, **kwargs): # real signature unknown
"""
Return a new list containing all items from the iterable in ascending order.
A custom key function can be supplied to customize the sort order, and the
reverse flag can be set to request the result in descending order.
"""
pass