zoukankan      html  css  js  c++  java
  • day11__函数名的应用,python新特f-strings格式化输出、迭代器

    一、函数名的应用

    ​ 函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值;但是作为函数名他也有特殊的功能就是加上()就会执行对应的函数,所以我们可以把函数名当做一个特殊的变量

    1、函数名指向的是函数的内存地址

    ​ 函数名 + ()就可以执行次函数

    def func():       ​ 
        print("呵呵")
    ​print(func)
    输出结果:
        <function func at 0x1101e4ea0>
    

    ​ 通过上面代码可以我们知道,函数名指向的是这个函数的内存地址,其实深一步理解可得知,与其说函数名()可以执行这个函数,不如说是函数的内存地址()才是执行这个函数的关键,就好比:

    a = 1
    b = 2
    c = a + b
    print(c)  # 3
    

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

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

    3、函数名可以当容器类元素

    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()
    

    4、函数名可以当做函数的参数

    def func1():
        print('in func1')
    
    def func2(f):
        print('in func2')
        f()
    
    func2(func1)
    输出结果:
    in func2
    in func1
    

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

    def func1():
        print('in func1')
    
    def func2(f):
        print('in func2')
        return f
    ret = func2(func1)
    ret()
    输出结果:
        in func2
    	in func1
    

    二、Python新特性:f-strings格式化输出

    1、旧的格式化输出方式

    name = 'mrxiong'
    age = 19
    msg = '我叫%s,今年%s'%(name,age)
    msg1 = '我叫{},今年{}'.format(name,age)
    print(msg)
    print(msg1)
    

    2、新特性:格式化输出 python3.6版本后适用

    name = 'mrxiong'
    age = 19
    msg = f'我叫{name},今年{age}'
    print(msg)
    

    可以加表达式

    dic={'name':'mrxiong','age':19}
    msg = f'我叫{dic["name"]},今年{dic["age"]}'
    print(msg)
    
    
    count= 7
    a = f'最终结果:{count*7}'
    print(a)
    
    name= 'mrxiong'
    msg1= f'我的名字是 :{name.upper()}'
    print(msg1)
    

    结合函数 使用

    def _sum(a,b):
        return a+b
    msg2 = f'最终的计算结果是:{_sum(10,20)}'
    print(msg2)
    
    def _sum(a,b):
        return a+b
    num=int(input('请输入弟一个数字:'))
    num1=int(input('请输入第二个数字:'))
    
    msg2 = f'最终的计算结果是:{_sum(num,num1)}'
    print(msg2)
    

    优点:1、结构更清晰更简化,2、可以结合表达式及函数进行使用,3、效率提升很多

    三、迭代器

    1、可迭代对象

    ​ 字面意思:对像,python中一切皆对象,一个实实在在存在的值,对象

    ​ 可迭代:更新迭代。 重复的,循环的一个过程。可进行循环更新的一个实实在在值

    ​ 专业角度:可迭代对像,内部含有’____iter‘_方法的对像,可迭代对像

    ​ 目前学过的可迭代对象:str list tuple dict set range 文件句柄

    ​ 判断一个对像的所有方法:dir()

    s1 = 'mrxiong'
    print(dir(s1))
    
    s1 = 'mrxiong'
    print('__iter__'in dir(s1))
    
    • 小结
      • 字面意思:可以进行循环更新的一个实实在在值
      • 专业角度:可迭代对像,内部含有’____iter‘_方法的对像,可迭代对象
      • 判断一个对像是不是可迭代对像:’____iter‘ in dir(对像)
      • str list tuple dict set range 文件句柄
      • 优点:
        • 存储的数据直接能显示,比较直观
        • 拥有的方法比较多
      • 缺点:
        • 占用内存
        • 不能直接通过for循环,不能直接取值(索引,key)

    2、迭代器

    • 迭代器的定义:

      • 字面意思:更新迭代,器:工具,可更新迭代的工具
      • 专业角度:内部含有'_____iter' 方法并且含有 '_____next' 方法的对象就是迭代器
      • 可以判断是否是迭代器:'inter'and '_____next' 在不在dir(对象)
      • 判断一个对象是否是迭代器
    with open('a.txt', encoding='utf-8', mode='w') as f1:
        print('__iter__' in dir(f1) and '__next__' in dir(f1))
    
    • 可迭代对象如何转化成迭代器并取值
    s1 = 'adf'
    obj = iter(s1)   #把s1转换为一个迭代器
    obj.__iter__()   #把s1转换为一个迭代器第二种方法
    print(next(obj)) #next对己转换的迭代器进行取值
    print(obj.__next__()) #next对己转换的迭代器进行取值第二种方法
    print(next(obj))
    
    
    l1 = [11,22,33,44,55,66]
    l2 = iter(l1)
    print(next(l2))
    print(next(l2))
    print(next(l2))
    print(next(l2))
    print(next(l2))
    print(next(l2))
    
    l3 = iter([1,2,3,4])
    print(next(l3))
    print(next(l3))
    print(next(l3))
    print(next(l3))
    

    可迭代对象转换成迭代器

    iter([1,2,3])
    

    利用while循环模拟for循环对可迭代对象进行取值的机制

    s1 = [11, 22, 33, 44, 55, 66, 77, 88]
    obj = iter(s1)
    while 1:
        try:
            print(next(obj))
        except StopIteration:
            break
    
    • 小结

      • 迭代器优点:

      1)节省内存。迭代器在内存中相当于只占一个数据的空间:因为每次取值都上一条数据会在内存释放,加载当前的此条数据。

      2) 惰性机制。next一次,取一个值,绝不过多取值。

        有一个迭代器模式可以很好的解释上面这两条:迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器模式。
      
      • 迭代器的缺点:

      ​ 不能直观的查看里面的数据。

      ​ 取值时不走回头路,只能一直向下取值。

      ​ 速度慢

      • 可迭代对象与迭代器的对比

        • 可迭代对象:

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

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

        • 迭代器:

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

           **应用**:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)。
        
        
        
        
  • 相关阅读:
    LCA问题第二弹
    LCA问题
    树状数组(Binary Indexed Tree,BIT)
    线段树第二弹(区间更新)
    线段树+RMQ问题第二弹
    RMQ问题第一弹
    分治法二(平面最近点对)
    分治法(一)
    带权并查集
    提交一个变量或数组到另一个jsp页面
  • 原文地址:https://www.cnblogs.com/mr-xiong/p/13296632.html
Copyright © 2011-2022 走看看