函数名运用 新版格式化输出 迭代器

函数名运用 新版格式化输出 迭代器

函数名的运用 (第一类对象)

函数名的内存地址

def func():
    print(0)
print(func) # 函数变量的内存地址
#  <function func at 0x1101e4ea0>
# 其实深一步理解可得知,与其说函数名()可以执行这个函数,不如说是函数的内存地址()才是执行这个函数的关键

函数名可以赋值给其他变量

def func():        
    print("呵呵")    
print(func) 
a = func  # 把函数当成一个变量赋值给另一个变量
a() # 函数调用 func()

函数名可以当作容器类的元素(作为list元素)

def func1():
    print("in func1: 嘻嘻")
def func2():
    print("in func2: 哈哈")
def func3():
    print("in func3: 咯咯")
def func4():
    print("in func4: 吱吱")
lst = [func1, func2, func3, func4]
for i in lst:
    i() # 分别去执行四个函数
# in func1: 嘻嘻
# in func2: 哈哈
# in func3: 咯咯
# in func4: 吱吱

函数名可以当作函数的实参

def func1():
    print('in func1')

def func2(f):
    print('in func2')
    f()

func2(func1)  # in func1

函数名可以作为函数的返回值

def func1():
    print('in func1')

def func2(f):
    print('in func2')
    return f

ret = func2(func1)
ret()  # ret, f, func1 都是指向的func1这个函数的内存地址
func2()() # 简化

f-strings 格式化输出

不区分大小写 (F(f)+ str)

任意表达式

可以结合函数

不能放一些特殊字符 :

print(f"{{73}}")  # {73}
print(f"{{{73}}}")  # {73}
print(f"{{{{73}}}}")  # {{73}}
m = 21
# ! , : { } ;这些标点不能出现在{} 这里面。  ","放在数据后面可以用
# print(f'{;12}')  # 报错
# 所以使用lambda 表达式会出现一些问题。
# 解决方式:可将lambda嵌套在圆括号里面解决此问题。
x = 5
print(f'{(lambda x: x*2) (x)}')  # 10

迭代器

可迭代对象

  • 在python中,但凡内部含有_ iter _方法的对象,都是可迭代对象。
  • 类型 : str list tuple dic set range

_ iter _ 查看是否是可迭代

  • 内置函数dir() 查看对象内部 print(dir(对象)) 里面是否有_ iter _
  • 判断python中的一个对象是不是可迭代对象
s1 = 'alex'
i = 100
print('__iter__' in dir(i))  # False
print('__iter__' in dir(s1))  # True

或者
s1 = 'alex'
print(dir(s1)) # 查看s1中具有的函数方法

迭代器

  • 内部含有'_ Iter _'方法并且含有' _ next _'方法的对象就是迭代器

_ iter _ 且_ next _查看是否是迭代器

文件句柄是迭代器

o1 = 'alex'
o2 = [1, 2, 3]
o3 = (1, 2, 3)
o4 = {'name': '太白','age': 18}
o5 = {1, 2, 3}
f = open('file',encoding='utf-8', mode='w')
print('__iter__' in dir(o1))  # True
print('__iter__' in dir(o2))  # True
print('__iter__' in dir(o3))  # True
print('__iter__' in dir(o4))  # True
print('__iter__' in dir(o5))  # True
print('__iter__' in dir(f))  # True
# hsagn
print('__next__' in dir(o1))  # False
print('__next__' in dir(o2))  # False
print('__next__' in dir(o3))  # False
print('__next__' in dir(o4))  # False
print('__next__' in dir(o5))  # False
print('__next__' in dir(f))   # True  文件句柄是迭代器
f.close()

可迭代对象转化为迭代器

li = [1,2,3,4]
#   利用   内置函数 .iter()   或者  __iter__()
obj = iter(li) 或者
obj = li.__iter__()
print(obj) # <list_iterator object at 0x0000000001DEA2E8>

next() 进行取值

迭代器可以迭代取值,利用进行取值,一个一个拿元素,有位置记忆

#   利用   内置函数   .next()  或者  __next__()
li = [1,2,3,4]
obj = iter(li)
print(obj)
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj)) # 只限 li的长度之内
print(next(obj)) # 超范围会报错

使用 while 循环 + 迭代器来模拟 for 循环(必须掌握)

li = [1,2,3,4]
li_1 = li.__iter__()   # 将可迭代对象转化成迭代器
while 1:  # 利用while循环,next进行取值
    try:   # 利用异常处理终止循环
        print(next(li_1))  
    except StopIteration:
        break

可迭代对象与迭代器 对比 及 应用

可迭代对象

  • 是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,但是占用内存,而且不能直接通过循环迭代取值的这么一个数据集。

应用

  • 当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。

迭代器

  • 是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。

应用

  • 当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)。
  • 迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一种的方式,即按需一次获取一个数据项。这就是迭代器模式
posted @ 2019-06-12 23:38  樊xs  阅读(242)  评论(1编辑  收藏  举报