函数中的陷进,定义全局变量以及可迭代对象和迭代器

默认参数的陷阱

默认参数为不可变类型(无陷阱)

默认参数为可以变类型

如果你的默认参数指向可变的数据类型,那么你无论调用多少次这个默认参数.都是同一个
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内存可以承受.)的一个数据集.
    - 当你侧重于对数据可以灵活处理,并且内存空间足够.可以将数据设置为可迭代对象进行操作.
  - 迭代器
    - 当你数据量过大,达到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择
      #今日总结
- 默认参数的陷阱(默认参数为可变类型)
- 局部作用域的坑(先引用变量,后定义变量)
- 格式化输出
- 函数名的应用
- 对比:迭代器是什么?迭代器的优缺点.
- 可迭代对象如何转化成迭代器
原文地址:https://www.cnblogs.com/luyi84895838/p/11726714.html