迭代器总结、生成器、生成器表达式、常用的68个内置函数

发布时间 2023-09-14 16:59:52作者: jntmwl

迭代器总结(迭代取值和索引取值的对比)

# 迭代器主要就是一个迭代取值,另外一种取值方式就是索引(下标)取值

l = [1, 2, 3, 4]

res = l.__iter__()
res.__next__() # 1
res.__next__() # 2

res1 = l.__iter__()
res1.__next__()  # 1
res1.__next__()  # 2

迭代取值
	1. 不依赖于索引取值的一种取值方式
    2. 不能够重复取值,只能够从左往右固定取值
索引取值
	1. 它能够重复取值(通过索引l[0])
    2. 它需要是容器类型

生成器

背景:
通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

  所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator
python中生成器是自定义迭代器的一种

关键字:yield

'''
当函数中一旦出现了yield关键字,函数在没有被调用的时候仍然是普通函数,但是只要一调用函数,那么,该函数就不是普通函数了
就变成了生成器
'''
def index():
    print('from index')
    print('from index')
    print('from index')
    yield 123,234,345 # 以元组的方式返回
    print('second')
    print('second')
    print('second')
    print('second')
    yield 'hello'
    print('three')
    yield

res=index()  # res.__iter__()
print(res)  # <generator object index at 0x000002CDB20BEA50>

## 生成器其实就是一个自定义的迭代器
# res.__next__() # 只要你调用next方法,代码就会走到函数中第一个yield关键字所在的位置停住
# res.__next__() # 代码从上一次yield停住的地方继续往下执行,走到遇到下一个yield停住
print(res.__next__()) # None  123
print(res.__next__()) # None  123
print(res.__next__()) # None  123

生成器练习题

利用生成器的原理实现range函数的功能
# range() 三种玩法

def my_range():
    pass

for i in range(0,10):
    print(i)

    
def my_range(start, stop=None, step=1):
    if not stop: # 意味着只传了一个参数,stop没有值
        stop = start
        start = 0
    while start < stop:
        yield start
        start+=step

# print(my_range(0, 20))
# for i in my_range(0, 20):
#     print(i)

# for i in my_range(0, 20, 2):
#     print(i)

for i in my_range(10):
    print(i)

生成器yield的其他用法

def eater(name):
    print('%s:正在吃...' % name)
    while True:
        food = yield
        print('%s正在吃%s' % (name, food))

'''eater就变成了生成器'''
res=eater('jerry') # 生成器对象:generator object
print(res) # <generator object eater at 0x0000021869489B30>

res.__next__()
# res.__next__()

# send做了两件事情:1. 传值给yield、2. 执行__next__
res.send('包子')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')

pPR73Js.png

生成器表达式

列表生成式
res = [name for name in names_list]
print(res) # 就是一个列表

res1 = (name for name in names_list)
print(res1)
names_list = ['kevin', 'jerry', 'tony', 'oscar']
res1 = (name for name in names_list)
print(res1) # <generator object <genexpr> at 0x00000218F4569CF0>

print(res1.__next__())
print(res1.__next__())
print(res1.__next__())
print(res1.__next__())

"""生成器表达式如果不使用数据,就不给你数据"""

把迭代器、生成器看成是一个工厂,什么时候需要数据工厂就给你加工数据
目的:就是为了节省内存空间

生成器笔试题

# 求和
def add(n, i):
    return n + i
# 调用之前是函数 调用之后是生成器
def test():
    for i in range(4):
        yield i
g = test()  # 初始化生成器对象
for n in [1, 10]:
    g = (add(n, i) for i in g)

res = list(g)
print(res)

#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
C. res=[20,21,22,23]
#D. res=[21,22,23,24]

yield和return的对比

yield
	1. 代码遇到yield不会停止,而是停住
    2. yield也可以有返回值,并且还支持多个,以元组的形式返回
    3. yield可以把一个函数变成生成器,next取值
    

return
	1. 代码遇到return就会停止
    2. return可以有返回值并且还支持多个,以元组的形式返回

常用的内置函数(68个)

01.运算函数

abs(x)

abs函数用来返回一个数值的绝对值,输入的参数x可以是整数浮点数,也可以是复数。

max(x,key=None)

max函数的参数x是可迭代对象或者是多个参数,返回其中的最大的元素。max函数可以通过指定关键参数key,来返回最大值。如果有多个最大值时,则返回第一个值。

min(x,key=None)

min函数同max函数的用法是一致的,min函数返回的是可迭代对象或者是多个参数中的最小值。

pow(x,y, mod)

pow函数当只有x和y两个参数时,它的作用是返回x的y次幂,当存在第三个参数mod存在时,pow函数是在x的y次幂基础上对mod进行取余。

round(number,ndigits)

返回 number舍入到小数点后 ndigits位精度的值。如果 ndigits被省略, 则返回最接近number的整数。

sum(x, start=0)

sum函数是将x中的数值进行从左向右的求和,然后加上start的数值,求和并返回总值。

divmod(a, b)

divmod函数将a, b两个数值作为实参,返回a/b的商值和余数。

02.转换类型

int(x)

对于输入的数字或者是字符串x,返回x的整数形式,如果x数值为空时,则返回0。

float(x)

对于输入的数字或者是字符串x,返回x的浮点数形式,如果x数值为空时,则返回0.0。

complex(real, imag)

complex函数的返回值为 real + imag*1j 的复数形式,或者将字符串或数字转换为复数形式。如果第一个参数real是字符串,那么就不能存在第二个参数。

bool(x)

判断参数x是否为真,并返回True或者False。

str(x)

将输入值x转换为字符串类型,并将结果进行返回。

bytearray(x, encoding="utf-8")

bytearray是将输入值x转变为字节组成的有序的可变数组,并将数组进行返回。

bytes(x, encoding="utf-8")

bytes则是将传入的参数x转变为一个不可变的字节数组,并返回该数组。

memoryview(x)

memoryview函数返回的是参数x的内存查看对象,而内存查看对象指的是对支持缓冲区协议的数据,进行包装的一种形式,其返回的对象是元组列表的形式。需要注意的是,传入参数x必须为bytes类型值。

03.进制转换

bin(x)

将输入的整数x转变为一个前缀为“0b”的二进制字符串。

oct(x)

将输入的整数x转变为一个前缀为“0o”的八进制字符串。

hex(x)

将输入的整数x转变为一个前缀为“0x”的十六进制字符串。

ord(x)

对于输入的单个Unicode 字符,返回它对应的Unicode 码整数。

chr(x)

chr函数是ord函数的逆函数,其作用是对于输入的整数值x,返回其对应的单个Unicode 字符。

04.数组操作

Python的内置函数,除了数值,字符串等操作,还包括了tuple、list、set等一系列的数组操作。

list(x)

list函数将传入的参数改变为新的列表并进行返回,除此之外,list本身也是一个可变对象。

dict(x)

dict函数将传入的参数值x改变成新的字典对象并进行返回,字典对象为不可变类型。

set(x)

set函数用来将输入的参数x,改变为新的集合对象,并进行返回,set对象为可变对象,同时它内部的元素都是不可重复的。

frozenset(x)

从名字上可以看出,frozenset函数同样可以完成set函数的功能,但是frozenset对象属于不可变对象。因此无法向frozenset对象中插入数值。

tuple(x)

tuple函数将传入的参数值x改变成新的元组对象并进行返回,元组对象为不可变类型。

enumerate(x)

enumerate函数返回的是一个枚举对象,输入的参数x是一个可迭代对象。返回的枚举对象通过__next__()方法来返回一个元组,包含了计数值和通过迭代获取得到的x中的数值。

range(x)

range函数通过输入值x生成不可变的数字序列,通常用于在 for 循环中循环指定的次数。

iter(x)

iter函数根据输入参数x生成一个可迭代对象,并返回该可迭代对象。

slice(x)

slice函数主要用作灵活的构建切片,其返回的也是一个slice对象。

object()

在Python中,object类是所有类的基类,object函数不接受任何参数,返回的是一个没有任何特征的对象。

super()

super函数常用在Python类对象,子类对于父类的继承中,子类用来引用父类中的对象和方法,而不需要显式的指明父类的名称。

05.排序操作

sorted(x, key=None, reverse=False)

对可迭代对象x进行排序,并返回一个排序后的新的对象,key参数可以规定按照何种方式进行比较,而reverse为True时,表示按照递减的方式进行排序

reversed(seq )

对于输入的序列seq进行反转,生成新的可迭代对象并返回。

06.序列操作

all(x)

针对于可迭代对象x中的每一个元素,判断是否都为真,如果有一个元素为False(0),则返回False。

any(x)

与all函数相同,any函数对于输入的可迭代对象x,判断x中每一个元素是否为True,只要有一个元素为True,则返回True。

map(func, iter)

map函数返回的是一个迭代器,在该迭代器中, func函数将应用于 可迭代对象iter中的每一个元素。

filter(func, iter)

通过func函数来过滤可迭代对象iter中的元素值,并返回由过滤元素所构成新的迭代器。

next(iter)

next函数返回可迭代对象中的下一个元素值。

zip(*iter)

根据多个不同的迭代器,进行对应位置元素的聚合,并返回一个新的迭代器。

07.对象元素操作

help(object)

通过help函数可以帮助用户来查询不同对象的信息,包括内置方法、属性等信息。

id(object)

返回object对象的标识值,这个标识值是一个整数,且在对象的生命周期中保持唯一。

hash(object)

如果object对象有对应的哈希值则返回对应的哈希值。

type(object)

type函数用来返回object对象的所属类型。

dir(object)

如果没有实参object,则dir函数返回的是当前本地作用域中的名称列表。如果有实参object,函数会尝试返回该对象的有效属性列表。

len(object)

返回object对象的长度或者是所包含的元素个数。

repr(object)

repr函数返回包含一个对象的可打印表示形式的字符串。

ascii(object)

ascii函数与repr的功能相似,ascii函数返回包含一个对象的可打印表示形式的字符串,,但是与repr函数不同的是,ascii() 比 repr() 多一个对于非 ASCII 编码的字符的转义处理。

format(value ,format_spec)

format函数将 value 转换为 由format_spec参数控制的“格式化”表示形式,多用在字符串的格式化处理中。

vars(object)

函数返回模块、类、实例等具有 _dict__属性的对象的 _dict__属性。

08.属性操作

isinstance(object, classinfo)

函数用来判断object对象是否属于classinfo的类型,如果是则返回True,否则返回False。

issubclass(class, classinfo)

如果class是classinfo类的子类,则函数返回True,否则返回False。

hasattr(object, name)

如果name字符串是object对象的属性之一的名称,则返回 True,否则返回 False。

getattr(object, name)

返回对象命名属性的值。name 必须是字符串。如果字符串name是object对象的属性之一,则返回该属性的值。

setattr(object, name, value)

字符串name是指对于object对象的一个已经存在的属性或者新增属性。只要object对象允许setattr操作, 函数会将值value赋给该属性。

delattr(object, name)

字符串name必须是object对象的某个属性的名字。如果object对象允许删除属性,则delattr函数将删除指定的name属性。

****import(name)

通过动态的方式来导入模块。

callable(object)

如果对象 object 是可调用的就返回 True,否则返回 False。

09.变量操作

globals()

返回作用域内的全局变量和其数值所构成的字典。

locals()

与globals函数对应的,locals函数返回的是当前作用域下局部变量和其数值所构成的字典。

10.人机交互操作

print(*objects, end='\n', file=sys.stdout)

将objects的内容打印到file指定的文本流当中,末尾以end作为结束。

input()

用来读取用户的输入值。

open(file, mode='r')

打开 file 并返回对应的 file object对象,mode对应的是向file文件进行读或者是写等操作。如果该文件不能被打开,那么程序会引发 OSError报错。

11.编译操作

compile(source,, mode)

函数将source编译成代码,然后被exec函数或者是eval函数执行,其中mode参数表示的是编译代码所需要使用的模式。

exec(object)

exec函数支持动态的来执行Python代码,其中object必须是字符串或者是代码对象。如果是字符串,则字符串会被解析成Python语句来执行,二u果实打码的话,则直接执行。

eval(expression)

eval函数会将字符串expression当成有效的表达式来求值并返回计算结果。eval函数只能单个运算表达式,而不能是复杂的代码逻辑或者是赋值运算。

12.装饰器函数

classmethod()

classmethod的作用是将一个方法封装成类方法,可以在不创建类对象的前提下调用该装饰器修似的方法。

staticmethod()

staticmethod方法是将类中的方法转换为静态的方法,静态方法不会接受隐式的参数,同样也可以在不创建类对象的前提下调用静态方法。

property()

作为装饰器,property可以将类方法转换为类属性来使用。

程序员必知的几个网站

1. https://www.runoob.com/python/python-func-dir.html
2. https://www.w3school.com.cn/html/index.asp
3. 博客园、CSDN、github、gitee、等