默认参数的陷阱
默认参数为不可变类型(无陷阱)
默认参数为可以变类型
如果你的默认参数指向可变的数据类型,那么你无论调用多少次这个默认参数.都是同一个
def a(b,c=[]):
c.append(b)
return c
ret1 = a("alex")
print(ret1,id(ret1)) #---> 结果:['alex'] 2882348361928
ret2 = a("天天")
print(ret2,id(ret2)) #---> 结果:['alex', '天天'] 2882348361928
print(globals())
现象:ret2并没插入alex 但列表还是任有alex
局部作用域的陷阱
如果你在全局作用域定义了一个变量,并且在函数中如果你定义相同变量名的一个变量,但是在定义这个变量之前对其引用,那么解释器认为你这是语法问题.解释器认为你应该在使用之前定义.
count = 1
def func():
print(count)
count = 3
func()
现象:如果函数内不定义count变量则不会报错,函数内定义的变量误导了函数
global nonlocal
global
- 在局部作用域声明(创建)一个全局变量
- 修改一个全局变量
def s():
global ts
ts=[1,2,3,4]
print(ts)
s()
print(ts)
nonlocal
- 不能操作全局变量.
- 局部作用域内: 内存函数对外层函数的局部变量进行修改时使用
def s():
nonlocal ts
ts=[1,2,3,4]
print(ts)
s()
print(ts)
函数名运用
函数名指向的是函数的内存地址
- 函数名+()就可以执行此函数(因为函数名指向的内存地址)
- 函数名可以作为容器类数据类型的元素.
- 函数名可以作为函数的参数
- 函数名可以作为函数的返回值
迭代器
可迭代对象
对象:python 一切皆对象.一个实实在在存在的值,对象.
迭代:重复,类似于循环的一个过程.更新迭代每次都有新的内容.
可迭代对象:可以循环更新的一个实实在在的值.
专业角度:
内部含有"__iter__"方法的对象就是可以迭代对象
常见的可迭代对象:str list tuple dict set range 文件句柄
查看对象的所有方法
dir()
获取括号内为你需要查看对象的所有方法
判断一个对象是否是可迭代对象:
s1 = range(10)
if "__iter__" in dir(s1):
print("是可迭代对象")
else:
print("别闹")
可迭代对象小结
- 字面意思:一个实实在在存在的值,对象.
- 专业角度:使用方法内部含有"__iter__"方法的对象,可以迭代对象
- 判断一个对象是否为可迭代对象: 使用in
- 可迭代对象优点:(str list tuple dict set range)
- 存储的数据能直接显示,比较直观
- 拥有的方法比较多
- 可迭代对象缺点:(str list tuple dict set range)
- 占用内存
- 不能直接通过for循环,不能直接取值.(索引,key除外) **通过for循环能取值是因为内部转换为迭代器**
迭代器
什么是迭代器
- 字面意思:迭代:更新迭代 器:工具 可更新迭代的工具
- 专业角度:内部含有"__iter__"并且含有"__next__"方法的对象就是迭代器
判断一个对象是否是迭代器
with open("a.txt",mode="w",encoding="utf -8") as f:
f.write("aaaa")
print("__iter__" in dir(f)and "__next__" in dir(f))
从迭代器中取值的三种方法
print(next(obj)) #显示迭代器的值另一种:obj.__next__() 一个next对应一个值
print(list(obj)) #将迭代器内容放在列表里返回
for i in obj:
print(i) #通过for循环将迭代器内内容一条一条返回
可迭代对象如何转换成迭代器
s1 = "dsadasdsad"
obj = iter(s1) # 另一种方法:s1.__iter__() 转化成迭代器
while循环模拟for循环机制
li = [11,22,33,44,55]
obj = iter(li)
while 1:
try:
print(next(obj))
except StopIteration: #当报错为StopIteration(超出取值范围)
break #跳出循环
迭代器小结
- - 字面意思:迭代:更新迭代 器:工具 可更新迭代的工具
- 专业角度:内部含有"__iter__"并且含有"__next__"方法的对象就是迭代器
- 迭代器的优缺点:
- 优点:节省内存,惰性机制(next一次,取一个值,绝不多取)
- 缺点:速度要慢.不走回头路.
- 可迭代对象与迭代器的对比
- 可迭代对象
- 是一个操作方法比较多,比较直观存储数据相对少(几百万个数据对象,8G内存可以承受.)的一个数据集.
- 当你侧重于对数据可以灵活处理,并且内存空间足够.可以将数据设置为可迭代对象进行操作.
- 迭代器
- 当你数据量过大,达到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择
#今日总结
- 默认参数的陷阱(默认参数为可变类型)
- 局部作用域的坑(先引用变量,后定义变量)
- 格式化输出
- 函数名的应用
- 对比:迭代器是什么?迭代器的优缺点.
- 可迭代对象如何转化成迭代器