3.23python笔记


常见的内置函数

1.help()  查看注释信息
 help(len)

2.id()  返回一串相当于内存地址的数字
 print(id('jason'))

3.int()  类型转换、机制转换

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

5.pow()  幂指数
 print(pow(10,2))

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

7.sum()求和
 print(sum([11,2,2,3,4,3,2]))

可迭代对象

1.什么是迭代?
迭代就是指更新换代的过程,要重复进行,而且每次的迭代都必须基于上一次的结果。
我们使用for循环的时候就是把元素从容器里一个个取出来,这种过程其实就是迭代。

2.什么是可迭代对象?
内置有__iter__方法的都可以称之为是可迭代对象
  """
  1.大白话理解就是数据可以通过点的方式点出来__iter__
  2.__iter__该类代码的读法>>>:双下iter方法
  	千万不要读成杠杠iter杠杠、杠杠iter
  """

3.哪些数据是可迭代对象?
  #字符 列表 字典 元组 集合 文件

迭代器对象

迭代器:迭代取值的工具
#迭代器的作用是提供给你一种不依赖索引取值的方式。

#迭代器对象有内置__iter__的方法还有内置__next__的方法

#迭代器一定是可迭代对象

#可迭代对象不一定是迭代器对象

#迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身

#迭代器取值的特点
只能往后依次取,不能从后往前取

迭代器具体使用方法

l=[1,2,3,4]
iter_l=l.__iter__()  # 用__iter__将可迭代对象转换成一个迭代器对象
print(iter_l.__next__())  # 迭代器取值,调用__next__
print(iter_l.__next__())  # 调用一次取一个
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())  # 如果取完了直接报错StopIteration

for循环的内部原理

# for循环里的in关键字,跟的是一个可迭代对象,将in后面的对象调用__iter__转换成迭代器
l1 = [11,22,33,44,55,66,77,88]
'''需求:不依赖于for循环 完成对列表元素的取值'''
# res = l1.__iter__()
# n = 0
# while n < len(l1):
#     print(res.__next__())
#     n += 1
#for循环内部的本质
  1.让关键字in后面的对象使用__iter__转换成迭代器对象
  2.调用__next__迭代取值
  3.内部有异常捕获StopIteration,当迭代器里的元素为空时报错,自动结束循环
#迭代取值的优点:
        1.不依赖于索引取值
        2.内存中永远只占一份空间,不会导致内存溢出
#迭代取值的缺点:
        1.不能获取指定的元素
        2.迭代器里的元素取完后再取,会报StopIteration的错误

异常处理

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
#异常信息的组成部分
	Traceback (most recent call last):
 File "/Users/jiboyuan/PycharmProjects/day16/05 异常处理.py", line 3, in 
    name
NameError: name 'name' is not defined
  1.line关键字所在的一行
  	用于提示你代码哪一行出错了 点击前面的蓝色字体可以直接定位
    '''如果报错的信息很长 一般最后一个才是'''
  2.NameError错误的类型
  	代码的报错也可以分为很多类型
  3.name 'name' is not defined
  	具体的报错原因(就是解决报错的答案)
 #异常的分类
  1.语法异常
	不被允许的 如果出现了必须立刻改正
        eg:if分支结构都不会写...
        	if 1, while :,...
  2.逻辑异常
	可以允许的 如果出现了尽快修改即可
    	eg:代码动态获取到了一个字符串类型的数据但是调用了列表的内置方法
        	name = 'jason'
					print(name.append())
#4.异常的类型(有很多 不一一列举)
  print(name)  # NameError     名字错误
   l1 = [11, 22, 33]
   print(l1[100])  # IndexError 索引错误
   d = {'name':'jason'}
   print(d['age'])  # KeyError  键错误
   int('jason')  # ValueError   值错误

异常处理实操

'''有时候针对可能会出错的代码 也可以自己提前写好处理措施'''
	正常情况下代码出错 肯定是直接导致程序停止
  但是也可以自己通过代码来处理 从而避免程序的停止
# 基本语法结构
	try:
    可能会出错的代码
  except 错误的类型1 as e:  # e指代的就是错误的提示信息
    针对性的处理措施
  except 错误的类型2 as e:  # e指代的就是错误的提示信息
    针对性的处理措施
  except 错误的类型3 as e:  # e指代的就是错误的提示信息
    针对性的处理措施
  ...
# 错误类型
	很多时候可能自己都不知道会报什么类型的错误
  '''万能异常:常见的报错都可以照单全收'''
  try:
    可能会出错的代码
  except Exception as e:  
    统一的处理措施
"""
学到这里 有很多同学心里很高兴 以后永远都不会写bug了
只需要在代码的开头加try 所有代码全部写带try的里面 之后万能结尾
	这么做没有任何意义!!!
"""
##############################################
异常处理使用尊则
	1.被检测的代码越少越好
  2.能尽量少用就尽量少用
##############################################

异常处理的一些操作

# 1.结合else使用
	当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码
  try:
    可能会出错的代码
  except Exception as e:  
    统一的处理措施
  else:
    可能会出错的代码没有出错 最后走else子代码
   
# 2.结合finally使用
	无论try检测的代码是否有异常 最后都会执行finally子代码
  try:
    name
	except Exception as e:
    print(e)
	finally:
    无论try检测的代码是否有异常 最后都会执行finally子代码
 
# 3.全部整合到一起使用
  try:
      name
  except Exception as e:
      print(e)
  else:
      print('没报错 好极了')
  finally:
      print('管你错不错 都执行')
    
# 4.断言(了解中的了解)
	name = 'jason'
	assert isinstance(name,str)
 
# 5.主动报错(需要掌握)
	raise NameError('不爽 就要作!!!')
  '''由于是主动报错 所以可以非常明确的知道错误的类型'''