ICode9

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

今日总结 3.26

2022-03-26 15:00:06  阅读:130  来源: 互联网

标签:总结 __ res name 迭代 import 模块 3.26 今日


今日内容概要

昨日内容回顾:
1.可迭代对象 迭代就是更新换代 但是每次迭代的过程都需要依赖上次的结果  就是有一个奠定基础让他去更新
2.可迭代对象:内置有 双下iter方法 都是可迭代对象  __iter__    有以下几种类型 字符串列表字典元组集合文件对象
简便写法:
__inter__  inter()
__next__   next()
__len__     len()

迭代器对象
迭代器对象就是有__inter__ 和 __next__这两种方法   可迭代器对象调用__inter__方法之后就会变成迭代器对象
 迭代器对象如果再次调用__iter__方法还是迭代器对象本身
1.迭代器对象作用
节省空间储存数据   优化数据的储存形式
2.迭代器对象取值特征
同一个迭代器内部数据内取一次就会少一个  去完了里面也就空了
3.迭代器对象的主要特征
提供了一种不依赖于索引取值的方式(非常重要的!!!)
没有它我们就无法对无序容器类型进行迭代取值
.迭代取值的要求
每次先产生一个新的迭代器对象然后取值、

for循环内部原理"""
for循环底层原理
    for 变量名 in 可迭代对象:
        循环体代码
1.会将in后面的数据调用__iter__()变成迭代器对象
    为什么文件对象也可以for循环 因为本身就是迭代器对象 再次调用不变
2.针对产生的迭代器对象依次调用__next__()方法迭代取值
3.当值取完之后 会自动处理报错并退出循环
"""
异常处理
什么是异常  bug 代码中有异常会结束进程然后整个程序停止
异常信息的组成
	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 defined
  	具体的报错原因(就是解决报错的答案)
  	总结下来就是 异常定位  异常类型  异常提示
 3A.异常的分类
	语法异常:肯定不能出现的!!!
  逻辑异常:可以被允许的 但是有时候修改起来一点也不简单
		Nameerror...XXXerror
语法结构
	try:
    	可能会出错的代码
  except 出错的类型1 as e:
    	针对出错类型的解决措施
  except 出错的类型2 as e:
    	针对出错类型的解决措施 
  except 出错的类型3 as e:
    	针对出错类型的解决措施
  except 万能异常(Exception) as e:
    	统一出错的解决措施
  else:
    	可能会出错的代码没有出错 执行完毕后就会走else
  finally:
    	无论上面怎么走 最后都要走finally
	'''异常捕获能尽量少用就尽量少用 被检测的代码越少越好!!!'''
# 5.其他补充
	断言  				assert
  主动报错 			 raise
 
for循环本质
  res = 可迭代对象.__iter__()
while True:
  try:
  	print(res.__next__)
  except StopIteration as e:
    break
"""万能异常可以捕获常见的异常类型 但是并不是所有"""

今日内容详细

* 生成器对象(自定义迭代器)
在Python中,对list、tuple、str等类型的数据可以使用for...in...的循环语法,从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。
在Python的基本数据类型中,列表、元组、字符串、字典都是可迭代的,而整数、浮点数、布尔数都是不可迭代的。
'''"""自定义  自定义迭代器本质其实还是迭代器 只不过这是我们自己写代码而产生的目的也是为了节省空间 优化代码
定义生成器需要编写函数  并且在函数替代码中使用  yield 关键字  想要自己定义就是两个点自己编写函数  函数体代码  必须有关键字 yield
再说一下 这个关键字  yield 这个功能
	1.可以返回后面的值 与return一致
	2.可以将代码停在yield位置 下次基于该位置往后执行
	3.还可以接收外界传值
		res.send()  # 传值+迭代
它每次只跑一次循环,只有等再次调用next() 时, 程序才会再执行一次/
* 自定义range方法
range   首先了解一下range的大概意思英文翻译过来 变化变动 (在一定的范围内)变化,变动;(按一定位置或顺序)排列,排序
、# 写代码一定不要想的太多 先写一个大致的主题 之后再慢慢扩展
'''先考虑range方法的一种参数情况 其余两种后面再考虑
def my_range(start, stop=None, step=1):
    if not stop:
      stop = start
      start = 0
    while start < stop:
      yield start
      start += step
yielid关键字作用
可以将函数替代吗变成生成器  也可以返回值  还可以暂停代码  就是暂停到这个关键字处
外界也可以给他传值
代码示例:
def eat(name):
    print(f'{name}准备干饭')
    while True:
        food = yield
        print(f'{name}正在吃{food}')
res = eat('赵公子')
# 想执行一次代码  如果想执行多次直至结束 可以直接用for循环
res.__next__()
# res.__next__()  赵公子正在吃None
# res.__next__()  赵公子正在吃None
res.send('生日蛋糕')  # 可以给yield传值 并且自动调用一次__next__方法
res.send('大鸡腿')  # 可以给yield传值 并且自动调用一次__next__方法
send  '传值用 因为老是忘 所以,send方法与next的不同在于: send首先给生成器传值,再执行和Next相同的操作( 从上次暂停的地方开始,执行到下一个yield )  send(None) 等价于 Next'
生成器表达式# 也是为了节省存储空间
	在后期我们做代码优化的时候 可以考虑使用  前期学习阶段可以忽略
 
# res = (i for i in 'jason')
# print(res)  # <generator object <genexpr> at 0x1130cf468>
# print(res.__next__())
"""生成器内部的代码只有在调用__next__迭代取值的时候才会执行"""

# 普通的求和函数
def add(n, i):
    return n + i
# 生成器对象 返回 0 1 2 3
def test():
    for i in range(4):
        yield i
# 将test函数变成生成器对象
g = test()
# 简单的for循环
for n in [1, 10]:
    g = (add(n, i) for i in g)
    """
    第一次for循环
        g = (add(n, i) for i in g)
    第二次for循环
        g = (add(10, i) for i in (add(10, i) for i in g))
    """
res = list(g)  # list底层就是for循环 相当于对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]
"""正确答案是C  诀窍就是抓n是多少即可""
模块
1.什么是模块?
'首先讲一下什么是模块 模块就是一系列功能提的结合可以直接使用较为方便  Python中,一个.py文件就称之为一个模块(Module)。
2.为什么用模块?
'在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
'为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。
'最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
'使用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以,我们自己在编写模块时,不必考虑名字会与其他模块冲模块分类
3.模块的三种来源?
1.'内置模块 无需下载 解释器自带 直接可以导入
2.'自定义模块 自己写的代码  封装成模块 写的好的话可以发到网上供别人使用
3. '第三方模块  也就是别人写的  然后发布到网上 然后可以下载使用的 就是第三方模块
4.模块长啥样?
    1.使用python代码编写的py文件      # 我们需要掌握  2.多个py文件组成的文件夹(包)     # 我们需要掌握  3.已被编译为共享库或DLL的c或C++扩展(了解)  4.使用C编写并链接到python解释器的内置模块(了解)
import md
# print(md.name)
# md.read1()模块的两种导入方式
方式1>>>:import...句式"""要想使用模块 必须先导入 而导入的方法有两种"""方式 >>:import...句式import md
# print(md.name)
# md.read1()
前提:在研究模块的时候 一定要分清楚谁是执行文件 谁是被导入文件(模块)
    模块简介.py是执行文件  md.py是被导入文件(模块)
导入模块内部到底发送了什么事情
    1.执行当前文件 产生一个当前文件的名称空间
    2.执行import句式 导入模块文件(即执行模块文件代码产生模块文件的名称空间)
    3.在当前文件的名称空间中产生一个模块的名字 指向模块的名称空间 
    4.通过该名字就可以使用到模块名称空间中的所有数据
ps:相同的模块反复被导入只会执行一次
import句式的特点
    可以通过import后面的模块名点的方式 使用模块中所有的名字
    并且不会与当前名称空间中的名字冲突(指名道姓)
"""
 方式2>>>:from...import...句式
 from md import name,money,read1
# print(name)  # jasonNB
# name = 'kevin'
# print(name)  # kevin

print(money)  # 报错  from md import name 只使用模块中的name名字
read1()
"""
1.执行当前文件产生一个名称空间
2.执行导入语句 运行模块文件产生名称空间存放运行过程中的所有名字
3.将import后面的名字直接拿到当前执行文件中
"""
"""
1.重复导入也只会导入一次
2.使用模块名称空间中的名字不需要加模块名前缀 直接使用即可
3.但是from...import的句式会产生名字冲突的问题
    在使用的时候 一定要避免名字冲突
4.使用from...import的句式 只能使用import后面出现的名字
    from...import...可以简单的翻译成中文
        从...里面拿...来用 没有提到的都不能用      指名道姓
导入补充
# 1.可以给模块起别名(使用频率很高)
'''比如模块名或者变量名很复杂 可以起别名简写'''
# import md as m
# print(m.name)
# from md import name as n
# print(n)

# 2.连续导入多个模块或者变量名
# import time, sys, md
# from md import name, read1, read2
"""连续导入多个模块 这多个模块最好有相似的功能部分 如果没有建议分开导入
    如果是同一个模块下的多个变量名无所谓!!!
"""
# import time
# import sys
# import md

# 3.通用导入
from md import *
'''*表示md里面所有的名字   from...import的句式也可以导入所有的名字
如果模块文件中使用了__all__限制可以使用的名字  那么*号就会失效 依据__all__后面列举的名字
'''
print(name)
print(money)

标签:总结,__,res,name,迭代,import,模块,3.26,今日
来源: https://www.cnblogs.com/ister/p/16058830.html

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

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

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

ICode9版权所有