目录
迭代器
迭代器是访问集合元素的一种方式,是一个可以记住遍历的位置的对象
迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束,迭代器只能往前不能后退
迭代器有两个基本方法: iter() 和 next()
字符串,列表和元组对象都可以创建迭代器
迭代器有两个基本遍历方法:
lista = [1, 2, 3, 4, 5]
it = iter(lista)
# 使用 while 语句 等到截获异常时结束
while True:
try:
print(next(it), end="")
except StopIteration:
print("\nprint list end")
break
# 直接使用 for 语句进行迭代
itb = iter(lista)
for x in itb:
print(x, end="")
print("\n")
类的迭代器支持
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 和 __next__()
__iter__() 方法返回一个特殊的迭代器对象,这个跌代器对实现了 __next__() 方法并通过 StopIteration 异常标志迭代的完成
__next__() 方法会返回下一个迭代器对象
class myNumber:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a < 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = myNumber()
myiter = iter(myclass)
#for x in myiter:
# print(f" {x}", end="")
while True:
try:
print(f" {next(myiter)}", end="")
except StopIteration:
print(f"\nmyNumber iter end")
break
生成器(Generator)
在 Python 中,使用了 yield 的函数被称为生成器(generator)
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不会是一次性返回所有结果 和普通函数不同,生成器函数会返回迭代器,只能用于迭代操作
在生成器中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式座位当前迭代的值返回
然后,每次调用生成器的 next()方法或使用 for 进行迭代的时,函数会从上次暂停的地方继续执行,直到遇到 yield 语句
这样,生成器函数可以逐步产生值,而不需要一次性计算返回所有结果
调用生成器函数,返回的是一个迭代器对象
TBD
Python Module
Python 模块(module), 是一个 python 文件, 以 py 结尾, 包含了 Python 对象定义和 Python 语句
模块能够更有逻辑的组织你的 python 代码, 模块能够定义函数, 类和变量, 也可以包含可执行代码
import 语句
当解释器遇到 import 语句, 模块在当前的搜索路径就会被导入
搜索路径是一个解释器会先进行搜索的所有目录的列表
一个模块只会被导入一次, 不管你执行了多少次 import, 这样可以防止导入模块被一遍又一遍地执行
from … import
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中
from modulename import name1,[name2],[name3]
from lib import fibonacci
将 fib 里的 fibonacci 单个引入执行
from … import*
将模块的全部内容都导入到当前的命名空间:
from modulename import *
搜索路径的规则如下:
- 当前目录
- 如果不在当前目录,
python会搜索PYTHONPATH环境变量下的目录 - 都找不到,
python会查看默认路径,unix下一般为/usr/local/lib/python
命名空间和作用域
一个 python 表达式可以访问局部命名空间和全局命名空间, 如果一个局部变量和一个全局变量重名, 则局部变量会覆盖全局变量
Python 会智能猜测一个变量是局部的还是全局的, 它假设任何在函数内赋值的变量都是局部的, 因此要给函数内的全局变量赋值, 必须使用 global 关键字
global VarName 的表达式会告诉 Python, VarName 是一个全局变量, 这样 Python 就不会在局部命名空间里寻找这个变量了
dir 函数:
globals 和 locals 函数:
reload 函数:
python 里的自定义 Packages
包是一个分层次的文件目录结构, 它定义了一个由模块及子包, 简单说, 包就是文件夹, 但是该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空, __init__.py 用于标志当前文件夹是一个包
Python 异常
try … except
python 异常可以用 try .. except 语句捕捉

try 语句按照下面的方式进行工作:
- 首先, 执行
try子句( 关键字try和 关键字except之间的语句) - 如果没有异常发生,忽略
except子句,try子句执行后结束 - 如果在
try子句的过程中发生了异常, 那么try子句余下的部分会被忽略, 如果异常类型和except之后的名称相符
那么对应的except子句将被执行 - 如果一个异常没有和任何
except匹配, 那么这个异常将会被传递到上层try中
一个 except 可以处理多个异常, 这些异常将被放在括号里称为一个元组 例如:
try:
except(RuntimeError, TypeError, NameError):
pass
一个 except 语句可以忽略异常的名称,这意味着它要捕获所有异常,可以使用这种方法打印一个错误信息,再将异常抛出
def exceptDemo():
try:
f = open("./file.txt")
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS Error: {0}".format(err))
except ValueError:
print("Value Error: {0}".format(ValueError))
except Exception as e:
print(f"error:{type(e).__name__} - {e}")
print("Unexpected error:", sys.exc_info()[0])
print("exiting...")
return
try/except … else
try/except 语句后面还有一个可选的 else 语句, 如果使用这个子句, 那么必须放在所有的 except 子句之后
else 子句将在 try 子句没有发生任何异常的时候执行
def exceptElseDemo():
try:
f = open("./source/example.txt")
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS Error: {0}".format(err))
except ValueError:
print("Value Error: {0}".format(ValueError))
except Exception as e:
print(f"error:{type(e).__name__} - {e}")
print("Unexpected error:", sys.exc_info()[0])
else:
print("this in else case")
print("exiting...")
return
try-finnally 语句
try-finnaly 语句无论是否发生异常都将会执行最后的代码

def exceptElseFinallyDemo():
try:
f = open("./source/example.txt")
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS Error: {0}".format(err))
except ValueError:
print("Value Error: {0}".format(ValueError))
except Exception as e:
print(f"error:{type(e).__name__} - {e}")
print("Unexpected error:", sys.exc_info()[0])
else:
print("this in else case")
finally:
print("this is in finally demo")
print("exiting...")
return

with 语句
python 编程中的资源管理是一个重要但是容易被忽视的细节, with 关键字为我们提供了一种优雅的方式处理文件操作,数据库连接等需要明确释放资源的场景
with 是 python 的一个关键字, 用于上下文协议(Context Management protocol), 简化了资源管理代码,特别是那些需要明确释放和清理的资源(资源,网络连接,数据库连接)
一个常见的情形:
file = open("example.txt", r)
try:
content = file.read()
finally:
file.close()
这种写法弊端:
- 容易忘记关闭资源
- 代码冗长
- 异常处理复杂
with 关键字的优势
- 自动资源释放
- 代码简洁
- 异常安全
- 可读性强
with 语句工作原理
上面打开文件的操作改用 with 写法:
with open("python_basic/source/example.txt", 'r+') as f:
content = f.read()
print(content)
with 是使用 python 的上下文管理协议, 该协议要求对象实现两种方法:
- enter(): 进入上下文时调用,返回后赋给
as后的变量 - exit(): 退出上下文调用,处理清理工作
exit() 方法接受三个参数:
exc_type:异常类型
exc_val: 异常值
exc_tb: 移除追踪信息
如果 exit() 返回 true, 表示异常被处理,不会继续传播,返回 False 或者 None, 异常会继续向外传播

# 一次性读取整个文件内容 并返回一个字符串
with open("python_basic/source/example.txt", 'r+') as f:
content = f.read()
print(content)
print("=========================readline================================")
# readline 每次读取一行
with open("python_basic/source/example.txt", 'r') as f:
lines = f.readlines()
print("lines type is:{0} size:{1}".format(type(lines), len(lines)))
index = 0
for line in lines:
print("line[{0}]: {1}".format(index, line), end="")
index += 1
print("\n=========================================================")
with open("python_basic/source/example.txt", 'r') as f:
line = f.readline()
while line:
print(line, end="")
line = f.readline()
print("\n=========================================================")
with open("python_basic/source/example_write.txt", 'w+') as f:
f.write("wangchen date:20250810\n")
print("write success!")
__name__
`__name__ 是一个内置变量,表示当前模块的名称
__name__ 的值取决于 模块是如何被使用的, 如果作为主程序运行, __name__ 会被设置为 __main__
如果作为子模块被导入, __name__ 会被设置为模块的名称
__main__ 是一个特殊的字符串,用于表示当前模块是作为主程序运行的, __main__ 通常与 __name__ 变量一起使用,以确定模块是被导入还是作为独立脚本运行

被折叠的 条评论
为什么被折叠?



