迭代器总结(迭代取值和索引取值的对比)
# 迭代器主要就是一个迭代取值,另外一种取值方式就是索引(下标)取值
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('水果')
生成器表达式
列表生成式
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、等
标签:返回,函数,迭代,对象,res,object,生成器,print,68
From: https://www.cnblogs.com/wolongnp/p/17702902.html