可迭代对象与迭代器对象

1 > 常见的内置函数2

1.1 > help() 查看注释信息

	
	help(len)

1.2 > id() 返回一串相当于内存地址的数字


	print(id('jason'))

1.3 > int() 类型转换、机制转换

	
	int(123)

1.4 > isinstance() 判断数据类型


		print(type('jason') is str)  # 类型判断 别扭的很 不推荐
		print(isinstance('jason', str))  # True
		print(isinstance('jason', int))  # False

1.5 > pow() 幂指数


	print(pow(10,2))

1.6 > round() 四舍五入


	print(round(11, 1))  # 第二个参数控制需要保留几位小数部分
	print(round(11.29, 1))
	print(round(11.59, 1))

1.7 > sum()求和


	print(sum([11,2,2,3,4,3,2]))

2 > 可迭代对象

  迭代其实就是跟新换代,每一次迭代的过程都需要依赖上一次的结果。类似于我们的游戏的更新其实就是版本的迭代。具体操作代码如下:


	'''单纯的循环,并不是迭代'''
	import time
	while True:
		print(123)
		time.sleep(0.1)
	'''迭代的具体写法如下:'''
	n = 1
	while True:
		print(n)
		n +=1
		
	'''迭代取值的具体写法如下:'''
	l1 = [11, 22, 33, 44, 55]
	n = 0
	while n < len(l1):
		print(l1[n])
		n += 1

2.1 > 可迭代对象的定义

  内置有_ _ iter _ _ 方法的都可以称之为是可迭代对象。
  用大白话理解就是数据可以通过点的方式点出来 _ _ iter _ _,它的读法就是双下iter方法。

2.2 > 可迭代对象有哪些

  可迭代对象有:字符串、列表、字典、元组、集合、文件。

  可迭代对象其实就是为了后续迭代取值做准备,提供了不依赖索引取值的方式。

2.3 > 迭代器对象

# 1.迭代器对象的含义
	可迭代对象调用_ _ iter _ _ 方法之后生成的结果就是迭代器对象
# 2.迭代器对象的特征
	含有_ _iter_ _方法和_ _ next_ _ 方法
# 3.迭代器对象的本质
	迭代器对象能够极大的节省存储空间
		类似于一个哆啦a梦的口袋,我们不用的时候就是一个口袋的面积,用到的时候可以从中取出很多的数据
# 4.迭代器对象的取值方式
	调用_ _ next_ _方法即可,如果取完了则会直接报错!!!
	开辟了一种不需要索引取值的方式(for循环底层依据的就是迭代器对象)
# 5.迭代器对象补充说明
	#5.1 有很多双下方法其实都有简便写法 但不是全部
	'''
	_ _ 方法名_ _ 等价 方法名()
	最常见的两个是
		__iter__   iter()
		__next__   next()
	
	#5.2 有一些可迭代对象本身也是迭代器对象 :>>>> 文件对象
	#5.3 可迭代对象调用一次__iter__方法编程迭代器对象  
		如果继续调用 结果还是迭代器对象本身
		res = s.__iter__()
		res1 = s.__iter__().__iter__().__iter__()
		print(res, res1)  # <str_iterator object at 0x10762bdd8> <str_iterator object at 0x107636dd8>
 	# 5.4 迭代取值的要求
 		S = 'bob'
 	  # print(s.__iter__().__next__())  # b 每次先产生一个新的迭代器对象然后取值
	  # print(s.__iter__().__next__())  # b 每次先产生一个新的迭代器对象然后取值
	  # print(s.__iter__().__next__())  # b 每次先产生一个新的迭代器对象然后取值
	
	  res = s.__iter__()  # 已经变成迭代器对象了
	  print(res.__iter__().__next__())  # b  之后再调用还是自身
	  print(res.__iter__().__next__())  # o

	'''

2.4 > for循环内部原理

  for 循环底层原理如下:

	for 变量名 in 可迭代对象:
		循环体代码
	'''
	1.会将in后面的数据调用__iter__()变成迭代器对象
		文件对象也可以for循环 因为本身就是迭代器对象,再次调用不变
	2.针对产生的迭代器对象依此调用__next__()方法迭代取值
	3.当值取完之后,会自动处理报错并退出循环
	'''

  我们也可以不依赖for循环完成对列表元素的取值,如下:

	l1 = [11,22,33,44,55,66,77,88]
	res = l1.__iter__()
	n = 0
	while n< len(l1):
		print(res.__next__())
		n += 1

3 > 异常处理

  异常的意思就是代码运行出错之后就会产生的,异常会导致程序立刻停止,所以要极力避免出现这种情况的发生,异常也有个响亮的名字叫Bug。

3.1 > 异常信息的组成部分

  我们选取一段报错信息来进行说明:

Traceback (most recent call last):
  File "/Users/jiboyuan/PycharmProjects/day16/05 异常处理.py", line 3, in <module>
    name
NameError: name 'name' is not defined

  1.line关键字所在的一行:用于提示你代码哪一行出错了,点击前面的蓝色字体可以直接定位
  2.NameError错误的类型:报错类型可以分为很多类型。
  3.name ’ name ’ is not defind:具体的报错原因(就是解决报错的答案)

3.2 > 异常的分类

  1.语法异常,不允许出现,出现了我估计你也从公司直接滚蛋了。
  2.逻辑异常,可以出现,出现咱就尽快改就可以了。

3.3 >异常的类型

异常代码异常名称异常原因
print(name)NameError名字错误
print(l1[100])IndexError索引错误
print(d[‘age’])KeyError键错误
int(‘bob’)ValueError值错误

4 > 异常处理实操

  有时候针对可能会出错的代码,也可以自己提前写好处理措施。

4.1 > 基本语法结构

  正常情况下代码出错 肯定是直接导致程序停止,但是也可以自己通过代码来处理 从而避免程序的停止。代码如下:


	try:
	可能会出错的代码
	except 错误的类型1 as e:  # e指代的就是错误的提示信息
		针对性的处理措施
	except 错误的类型2 as e:  
	...
	

  很多时候可能自己都不知道会报什么类型的错误,这时候我们就要用到这个万能异常类型 Exception。具体代码如下:


	try:
		可能会出错的代码
	except Exception as e:  
		统一的处理措施
		

  异常处理使用原则:1.被检测的代码越少越好,2.能尽量少用就尽量少用

4.2 > 异常处理了解

4.2-1 > 结合else使用

   当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码,具体代码如下:

	try:
    可能会出错的代码
 	except Exception as e:  
    统一的处理措施
  	else:
    可能会出错的代码没有出错 最后走else子代码

4.2-2 > 结合finally使用

   无论try检测的代码是否有异常 最后都会执行finally子代码,具体代码如下:

	 try:
	    name
	except Exception as e:
	    print(e)
	finally:
	    无论try检测的代码是否有异常 最后都会执行finally子代码

4.2-3 > 全部整合到一起使用

  将else和finall结合一起使用;

  try:
      name
  except Exception as e:
      print(e)
  else:
      print('没报错 好极了')
  finally:
      print('管你错不错 都执行')

4.2-4 > 断言(了解中的了解)

  主要是用于判断自己写的代码是什么数据类型,具体代码如下:


	name = 'jason'
	assert isinstance(name,str)

4.2-5 > 主动报错(需要掌握)

  主要就是来主动将自己写的代码报错:

	
	raise NameError('不爽 就要作!!!')

5 > for循环的本质

  for循环的本质其实就是利用了while与异常捕获,实现的for循环的功能,具体代码如下:


'''例如:编写循环获取字典当中的K值'''
	info = {'name': 'jason', 'age': 18, 'pwd': 123}
	# 1.先转换成迭代器对象
	res = iter(info)
	# 2.进行迭代取值
	while True:
		# 3. 使用异常捕获处理迭代结束后的报错问题
		try:
			print(next(res))
		except StopIteration as e:
			# 报错就结束while循环
			break

6 > 迭代取值与索引取值的对比

6.1 >索引取值

  优势:可以反复的获取相同的元素 并且没有固定的方向。
  劣势:只能支持有序的容器类型 无序的无法取值兼容性没有迭代器取值高

6.2 > 迭代取值

  优势:兼容所有的容器类型
  劣势:取值的顺序永远都是从左到右 ,并且无法重复获取,去完就完了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值