常见内置函数

  • 内置函数:提前定义好的,可以直接使用
函数 说明 例子
abs() 求绝对值 print(abs(-99)) # 99
all() 判断容器类型中的所有数据值对应的布尔值是否为True,所有的数据值都为True的情况下结果才是True print(all([1, 2, 3, 4, 5, 0])) # False
print(all([1, 2, 3, 4, 5, 0])) # False
any() 判断容器类型中的所有数据值对应的布尔值是否为True,所有的数据值只要有一个为True结果就是True print(any([1, 2, 3, 4, 5, 0])) # True
print(any([1, 2, 3, 4, 5])) # True
bin() 十进制转二进制 print(bin(10)) # 0b1010
oct() 十进制转八进制 print(oct(10)) # 0o12
hex() 十进制转十六进制 print(hex(10)) # 0xa
int() 类型转换,其他进制转十进制 print(int(0b1010))
print(int(0o12))
print(int(0xa))
bytes() 类型转换,返回一个字节对象 res = bytes('现在有多苦 将来就有多轻松','utf8')
print(res)
res1 = str(res,'utf8')
print(res1)
callable() 判断某个变量是否可以加括号调用(call在IT专业名词中翻译成 调用>>>:加括号执行) name = 'jason' def index():
print('from index')
print(callable(name)) # False
print(callable(index)) # True
chr() 依据ASCII码表实现字符与数字的转换 print(chr(65)) # A
print(chr(97)) # a
ord() 依据ASCII码表实现字符与数字的转换 print(ord('A')) # 65
print(ord('a')) # 97
dir() 获取对象内部可以通过句点符获取的数据 print(dir(str))
divmod() 获取除法之后的整数和余数 real_num, more = divmod(898, 10)
if more:
  real_num += 1
print('总页数:%s' % real_num) # 总页数:90
enumerate() 枚举 name_list = ['jason', 'kevin', 'oscar', 'jerry']
# 需求:循环打印出数据值并且对应的索引值
for i, j in enumerate(name_list, 100):
  print(i, j) # 100
# jason
# 101 kevin
# 102 oscar
# 103 jerry
eval() 能够识别字符串中python代码并执行(不识别复杂结构的代码,只能识别最简单的) res = 'print(123)'
eval(res) # 123
res1 = "for i in range(10):print(i)"
eval(res1)
exec() 能够识别字符串中python代码并执行(能够识别复杂结构的代码) res = 'print(123)'
exec(res) # 123
res1 = "for i in range(10):print(i)"
exec(res1)
hash() 返回一串随机的数字(哈希值) print(hash('jason')) # -2652256475250055779
print(hash('123')) # -4030458021024186029
help() 查看帮助信息 help(len)
isinstance() 判断某个数据是否属于某个数据类型 print(isinstance(123,int)) # True
print(isinstance(123,str)) # False
pow() 幂指数 print(pow(2, 3)) # 8
round() 四舍五入 print(round(98.3)) # 98
print(round(98.6)) # 99

迭代器

​ 迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代

可迭代对象

  • 迭代:迭代就是更新换代,每次迭代都需要基于上一次的成果
  • 代码演示
# 不属于迭代
while True:
    print('HHH')
# 属于迭代
n = 0
while n < 10:
    print(n)
    n += 1
  • 判断可迭代对象
    • 内置有 __ iter__ 方法的都叫做可迭代对象
      • 内置:通过句点符直接能够点出来的东西都叫内置
      • __ XXX__:针对双下划线开头双下划线结尾的方法,统一读作双下XXX
  • 可迭代对象(能够支持for循环取值):字符串(str)、列表(list)、字典(dict)、元组(tuple)、集合(set)、文件对象(本身就是迭代器对象)
  • 不可迭代对象:整型(int)、浮点型(float)、布尔值(bool)、函数名

迭代器对象

  • 作用:迭代器对象给我们提供了一种不依赖于索引取值的方式,因为有迭代器对象的存在,我们才能对字典、集合这些无序类型循环取值

  • 判断迭代器对象:内置有__ iter__ 和 __ next __的对象都称为迭代器对象

  • 可迭代对象与迭代器对象的关系:

    • 可迭代对象调用__ iter__方法之后就会变成迭代器对象
    • 迭代器对象调用__ iter__方法无论多少次还是迭代器对象本身
  • 迭代器对象取值

res = 'jason'.__iter__()  # res已经是迭代器对象
print(res.__next__())  # j
print(res.__next__())  # a
print(res.__next__())  # s
print(res.__next__())  # o
print(res.__next__())  # n
print(res.__next__())  # 没有了直接报错

d1 = {'name': 'jason', 'pwd': 123}
res = d1.__iter__()
print(res.__next__()) # name
print(res.__next__()) # pwd


l1 = [11, 22, 33, 44, 55, 66, 77, 88]
# 需求:不使用for循环 依次打印出列表中所有的数据值
# 1.先将列表变成迭代器对象
res = l1.__iter__()
# 2.定义一个计数器
count = 0
# 3.编写while循环
while count < len(l1):
    print(res.__next__())
    count += 1
  • 迭代器反复使用
l = [11, 22, 33, 44]
print(l.__iter__().__next__())  # 11  每次都是产生了一个新的迭代器对象
print(l.__iter__().__next__())  # 11
print(l.__iter__().__next__())  # 11
print(l.__iter__().__next__())  # 11

res = l.__iter__()
print(res.__iter__().__next__())  # 11  每次使用的都是一个迭代器对象
print(res.__iter__().__next__())  # 22
print(res.__iter__().__next__())  # 33
print(res.__iter__().__next__())  # 44
  • 双下方法
res = l.__iter__()  # 可以简写iter(l)
res.__next__()  # 可以简写next(res1)
  • 迭代器对象特殊地方:可迭代对象、迭代器对象通过打印操作无法直接看出内部数据的情况,这个时候他们都能够帮你节省内存,相当于是一个工厂 你要一个数据就临时给你造一个

迭代器优缺点

​ 基于索引的迭代取值,所有迭代的状态都保存在了索引中,而基于迭代器实现迭代的方式不再需要索引,所有迭代的状态就保存在迭代器中,然而这种处理方式优点与缺点并存:

优点

  1. 为序列和非序列类型提供了一种统一的迭代取值方式。
  2. 惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用__next__来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。

缺点

  1. 除非取尽,否则无法获取迭代器的长度
  2. 只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

for循环本质

语法结构

for 变量名 in 可迭代对象:
        for循环体代码
  1. for会自动将in后面的数据调用__iter__()变成迭代器对象
  2. 之后每次循环调用__next__()取值
  3. 最后没有值__next__()会报错 for能够自动处理该错误 让循环正常结束
 posted on 2022-07-11 17:38  念白SAMA  阅读(51)  评论(0)    收藏  举报