ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

迭代器

2022-07-11 17:32:31  阅读:138  来源: 互联网

标签:__ .__ 迭代 iter next print


  今日内容

  • 常见的内置函数
  • 可迭代对象
  • 迭代器对象
  • for循环本质
  • 作业

常见的内置函数

内置函数:就是Python解释器提前定义好的可以之前调用,有些函数非常好用

1.abs()

# abs: 取绝对值
print(abs(-66))  # 66
print(abs(-77))  # 77
print(abs(55))  # 55

2.all()与any()

# all()与any都是判断容器中只有的数据值对应的布尔值
l1 = [11, 22, 33, 44]
l2 = [11, 22, 33, 44, 0]
l3 = [0, None, [], {}]
print(all(l1))  # True
print(all(l2))  # False
print(all(l3))  # False
# all() 所有的数据类型必须是True结果才会是True 有一个是False结果就是False
print(any(l1))  # True
print(any(l2))  # True
print(any(l3))  # False
# any() 所有的数据类型必须是False结果才会是False 有一个是True结果就是True

3.bin()、oct()、hex()

# bin() oct() hex()都是把其他进制数转换为各自的进制数
print(bin(10))  # 0b1010
print(oct(10))  # 0o12
print(hex(10))  # 0xa

print(oct(0b1010))  # 0o12
print(oct(0xa))  # 0o12
# bin和hex也可以吧其他进制数转换为各自的进制数

4.int()

# int() 就是可以进行类型转换和进制转换
# 类型转换
res1 = '11'
print(res1, type(res1))  # 11 <class 'str'>
res2 = int(res1)
print(res2, type(res2))  # 11 <class 'int'>
# 将其他进制转换成十进制
print(int(0b1010))  # 10
print(int(0o12))  # 10
print(int(0xa))  # 10

5.bytes()

# bytes 类型转换
# 以前我们想对一个文本信息进行解码或则编码的时候我们需要关键字encode和decode
res1 = '台湾是中国的一个省份'.encode('utf8')
print(res1)  # b'\xe5\x8f\xb0\xe6\xb9\xbe\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe7\x9a\x84\xe4\xb8\x80\xe4\xb8\xaa\xe7\x9c\x81\xe4\xbb\xbd'
res2 = res1.decode('utf8')
print(res2)  # 台湾是中国的一个省份
'''
之前我们有可能会把encode和decode搞混
现在我们是需要在文本信息前加上bytes即可
'''
res1 = bytes('台湾是中国的一个省份', 'utf8')
print(res1)  # b'\xe5\x8f\xb0\xe6\xb9\xbe\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe7\x9a\x84\xe4\xb8\x80\xe4\xb8\xaa\xe7\x9c\x81\xe4\xbb\xbd'
res2 = str(res1, 'utf8')  # 我们只需要通过str就可以转换成字符串
print(res2)  # 台湾是中国的一个省份

6.callable()

# callable  call在it行业中可以翻译为 调用>>>加括号执行
# 就是判断某个变量是否可以被调用
name = 'tony'
def index():
    print('from index')
print(callable(index))  # True
print(callable(name))  # False
# 因为index已经被定义为函数名了 所以index加括号就可以被调用
index()  # from index
name()  # 报错

7.chr()和ord()

# chr() ord() 根据ASCII码实现字符与数字的转换
# chr 将指定的数字根据ASCII码转换成字符
print(chr(65))  # A
print(chr(66))  # B
print(chr(97))  # a
print(chr(100))  # b
# ord 将指定的字符根据ASCII码转换成数字
print(ord('a'))  # 97
print(ord('z'))  # 122
print(ord('A'))  # 65
print(ord('Z'))  # 90

8.dir()

# dir 获取对象内部可以通过句点符获取的数据
print(dir(list)) # 会生成一个列表里面都是list的方法

9.divmod

# divmod 可以获取除法之后的整数和余数
print(100 / 7)  # 14.285714285714286
print(divmod(100, 7))  # (14, 2)
print(9 / 3)  # 3.0
print(divmod(9, 3))  # (3, 0)
print(55 / 3)  # 18.333333333333332
print(divmod(55, 3))  # (18, 1)
# 可以把整数和余数提取出来然后组织成元祖返回
'''
这个时候我们就可以通过这些来计算一些问题:
比如:
现在我们手上有N个数据需要在网页上展示每页只能展示10条数据需要几个网页
总数据           每页展示           网页数
100               10               10
98                10               10                
10145             10               ?
我们可以通过divmod求出网页数
'''
real_num, more = divmod(10145, 10)
if more:
    real_num += 1
print(real_num)  # 1015

10.enumerate

# enumerate 枚举
# 现在我们需要把列表一个一个取出来然后加上索引
l = ['jason', 'tony', 'kevin', 'jerry', 'oscar']
# 我们可以使用for循环
count = 0
for i in l:
    print(count, i)
    count += 1
'''
0 jason
1 tony
2 kevin
3 jerry
4 oscar
'''
# 现在我们可以使用enumerate方法快速生成
for i, j in enumerate(l):
    print(i, j)
'''
0 jason
1 tony
2 kevin
3 jerry
4 oscar
'''
# enumerate还可以指定开始的数字
for i, j in enumerate(l, start=10):  # 可以是任何数字
    print(i, j)
'''
10 jason
11 tony
12 kevin
13 jerry
14 oscar
'''

 

 

11.eval()和exec()

# eval()和exec()是检测字符串中的python语法并执行
res = 'print(123)'
print(res)  # print(123) 如果只是打印字符串的话是不会识别代码
eval(res)  # 123
exec(res)  # 123
# exec可以识别复杂的代码而eval只能识别最简单的代码
res1 = 'for i in range(10):print(i)'
eval(res1)  # 报错
exec(res1)
'''
0
1
2
3
4
5
6
7
8
9
'''

12.hash()

# hash()是把传入的值通过某种算法然后返回一串随机的数字(哈希值)
print(hash('jason'))  # -1221214690944433835
print(hash('123'))  # -7390004770846579291
print(hash('tony'))  # 1425372491557816673
print(hash(123))
print(6655)
# 数字就是返回原来的数字

13.help()

# help() 就是查看帮助信息
def index():
    'index的注释'
    print('form index')
help(index)  # 会查看函数的名字和注释
'''
index()
    index的注释
'''
help(len)  # 也可以查看内置函数
'''
len(obj, /)
    Return the number of items in a container.
'''

14.isinstance()

# isinstance 判断某个数据值是否是某个数据类型
print(isinstance(11, int))  # True
print(isinstance(12, float))  # False
print(isinstance([11, 22], list))  # True
print(isinstance([], int))  # False

15.pow()

# pow() 就是幂指数
print(pow(2, 3))  # 8
print(pow(2, 10))  # 1024
# 前面的值是被幂指数 后面的值就是幂指数

16.round()

'''
round() 四舍五入
round(参数, 保留的位数)
如果被约的5前面是奇数就会进1
如果前面是偶数就会舍弃5
如果5后面有非0数字也会进1
round()默认保留一位小数 传入一个数时默认返回整数
'''
print(round(11.56, 2))
print(round(11.5))  # 12
print(round(12.5))  # 12
print(round(12.53))  # 13
print(round(10))  # 10

 

 

可迭代对象

迭代就是更新换代>>每次更新都需要基于上次的成果更新

代码演示:

# 不属于迭代
while True:
    print(1)
# 属于迭代
for i in range(10):
    print(i)

1.可迭代对象的判断

内置有__iter__方法的都可以叫做可迭代对象

内置就是可以通过句点符能够直接点出来的方法

__xxx__ 针对双下划线开头和双下划线结尾的方法 统一叫做 双下xxx

int      # 整型不是可迭代对象
float   #  浮点型不是可迭代对象
str      # 字符串是可迭代对象
list      # 列表是可迭代对象
dict     # 字典是可迭代对象
tuple    # 元祖是可迭代对象
set       # 集合是可迭代对象
bool      # 布尔值不是可迭代对象
def index():  # 函数名不是可迭代对象
    pass
f = open(r'a.txt', 'r', encoding='utf8')  # 文件名是可迭代对象
    pass
"""
    可迭代对象
        字符串 列表 字典 元组 集合 文件对象(本身就是迭代器对象)
    不是可迭代对象
        整型 浮点型 布尔值 函数名

    可迭代对象能够支持for循环取值
"""

迭代器对象

'''
迭代器对象给我们提供了一种不依赖于索引取值的方式
因为想列表这种是可以通过索引取值的 但是字典、集合这种是无序的不能通过索引取值
正是因为有迭代器对象的存在 我们才能对字典、集合这些无序类型循环取值
'''

1.如何判断是否是迭代器对象

  内置中有__iter__和__next__方法的对象都称之为迭代器对象

2.可迭代对象和迭代器对象的关系

  可迭代对象调用了__iter__方法之后就会变成迭代器对象

  迭代器对象调用__iter__方法无论多少次都还是迭代器对象本身

3.迭代器对象迭代取值

res = 'jason'.__iter__()  # 现在已经是迭代器对象了
print(res.__next__())  # j
print(res.__next__())  # a
print(res.__next__())  # s
print(res.__next__())  # o
print(res.__next__())  # n
print(res.__next__())  # 报错  #每次取一个值取多了会报错

l = ['jason', 'tony', 'kevin', 'jerry', 'oscar'].__iter__()
print(l.__next__())  # jason
print(l.__next__())  # tony
print(l.__next__())  # kevin
print(l.__next__())  # jerry
print(l.__next__())  # oscar
print(l.__next__())  # 报错  列表也是一次取一个值 取多报错

d = {'name': 'tony', 'pwd': '123'}.__iter__()
print(d.__next__())  # name
print(d.__next__())  # pwd
print(d.__next__())  # 报错 字典只有k参与
'''
可迭代对象只有调用了__iter__方法才能称为迭代器对象
才能够取值
'''

4.迭代器的反复使用

# l = [1, 2, 3, 4, 5]
print(l.__iter__().__next__())  # 1
print(l.__iter__().__next__())  # 1
print(l.__iter__().__next__())  # 1
print(l.__iter__().__next__())  # 1
print(l.__iter__().__next__())  # 1
# l.__iter__方法每次都是产生新的迭代器对象

l = [1, 2, 3, 4, 5]
res = l.__iter__()
print(res.__iter__().__next__())  # 1
print(res.__iter__().__next__())  # 2
print(res.__iter__().__next__())  # 3
print(res.__iter__().__next__())  # 4
print(res.__iter__().__next__())  # 5
# 列表l首先使用__iter__方法变成了迭代器对象然后赋值给res 所以每次都是一个迭代器对象

5.针对双下方法

'''
res1 = __iter__ 可以简写为 iter(res1)
res2 = __next__可以简写为next(res2)
'''

6.可迭代对象的特殊

可迭代对象 迭代器对象 通过打印操作无法直接看出内部数据的情况

  这个时候就能够节省内存

取值的时候一个一个取 不会直接产生一个内存空间里面存放多个值

for循环的本质

for循环的本质其实就是循环可迭代对象

语法结构:

for 变量名 in 可迭代对象:
    for循环代码

1.for循环每次执行时都会自动将in后面的数据调用__iter__方法变成迭代器对象

2.之后每次取值都调用__next__方法取值

3.最后没有值__next__()就会报错,但是for循环可以自动处理改错误 让循环正常结束

 

标签:__,.__,迭代,iter,next,print
来源: https://www.cnblogs.com/stephenwzh/p/16467188.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有