zoukankan      html  css  js  c++  java
  • 函数名运用 新版格式化输出 迭代器

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

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

    函数名的内存地址

    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把文件句柄设置成迭代器)。
    • 迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一种的方式,即按需一次获取一个数据项。这就是迭代器模式
  • 相关阅读:
    古典问题-兔子生兔子
    order by 执行计划索引使用不同的坑
    MybatisPlus 通用枚举无法正确取值
    Arrays.asList 使用细节
    java 生成pdf文件(易上手版)
    Mysql-tinyint使用之实际采坑记
    mysql
    mysql -- froce index 使用
    java基础全套
    javaweb之servlet 全解
  • 原文地址:https://www.cnblogs.com/fanxss/p/11047404.html
Copyright © 2011-2022 走看看