• Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归


    Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归

    内容纲要

    1.函数名的第一类对象及使用

    2.f格式化

    3.迭代器

    4.递归

    1.函数名的第一类对象及使用

    第一类对象的的特殊点:
    1.可以当做值赋值给变量
    # def func():
    #     print(1)
    # # print(func)
    # a = func
    # a()
    2.当做元素存放在容器中
    # def func():
    #     print(1)
    #
    # lst = [func,func,func]
    # for i in lst:
    #     i()
    3.函数名可以当做函数的参数
    # def func(f):
    #     f()
    #
    # def foo():
    #     print("is foo")
    #
    # func(foo)
    4.函数名可以当做返回值
    # def f1():
    #     def f2():
    #         print(1)
    #         def f3():
    #             print(2)
    #         return f2
    #     ret = f2()  # f2 函数的内存地址
    #     return ret  #
    # print(f1())
    
    # def func(f):
    #     f()
    # def foo():
    #     print(123)
    # func(foo)
    
    # def func():
    #     def foo():
    #         print(123)
    #     return foo
    # a = func()
    # a()
    

    2.f 格式化

    python3.6版本及以上才能够使用
    # s = f"你好{'常鑫'}"       # 填充字符串
    # s1 = F"你好{'常鑫'}"
    
    # s1 = f"你还是挺好的{s}" # 填充变量
    # print(s1)
    
    # s1 = f"{35+15}"         # 填充计算公式
    # print(s1)
    
    # a = 10
    # b = 20
    # s1 = f"{a if a>b else b}"  # 填充表达式
    # print(s1)
    
    # s1 = f"{{{{{{'常鑫吃..'}}}}}}"  # 填充大括号
    # print(s1)
    
    # s1 = f"{{}}"
    # print(s1)
    
    # s1 = f"{'{}{}{}{}{}'}"
    # print(s1)
    
    # s1 = f"{print(123)}"
    # print(s1)
    
    # def prin(a):
    #     print(a)
    #
    # s1 = f"{prin(123)}"
    # prin(s1)
    
    # def foo():
    #     def func():
    #         a = 1
    #         return a
    #     return func()
    #
    # s1 = f"{foo()}"
    # print(s1)
    
    # lst = [1,3,4,5,6]
    # s1 = f"{lst[0:5]}"
    # print(s1)  # [1,3,4,5,6]
    
    # dic = {"key1":123,"key2":345}
    # s1 = f"{dic['key2']}"
    # print(s1)
    
    字符串格式化的三种方法:
    # %s,format,f
    

    3.迭代器

    迭代 器(工具)
    可迭代对象:
    # list,dict,str,set,tuple -- 可迭代对象  使用灵活
    
    方式一:
    # list.__iter__()
    # dict.__iter__()
    # str.__iter__()
    # set.__iter__()
    # tuple.__iter__()
    
    # 方法二:
    # 查看源码
    
    # 方法三:
    # print(dir(list))
    
    官方声明只要具有__iter__()方法的就是可迭代对象
    
    可迭代对象的优点:
        1.使用灵活
        2.直接查看值
    可跌代对象的缺点:
        1.消耗内存
        
    # list,tuple,str -- 索引
    # dict -- 键
    # set  -- 直接取值
    
    迭代器:
    官方声明只要具有__iter__()方法__next__()方法就是迭代器
    # f = open("xxxx","w")
    # f.__iter__()
    # f.__next__()
    
    # lst = [1,2,3,4,6]
    # new_list = lst.__iter__()  #将可迭代对象转换成迭代器
    #
    # new_list.__iter__()
    # new_list.__next__()
    
    # s = "123434"
    # new_s = s.__iter__()       #将可迭代对象转换成迭代器
    # print(new_s)
    # new_s.__iter__()
    # new_s.__next__()
    
    # new_s = s.__iter__()       #将可迭代对象转换成迭代器
    # print(new_s)
    # new_s.__iter__()
    # print(new_s.__next__())
    # print(new_s.__next__())
    # print(new_s.__next__())
    
    # s = "12343"               # 更改版for的本质
    # s = [1,2,3,4,5,7]
    # count = len(s)
    # new_s = s.__iter__()
    # while count:
    #     print(new_s.__next__())
    #     count -= 1
    
    for的真实本质:
    s = "12345"
    new_s = s.__iter__():
    while True:
        try:
            print(new_s.__next__())
        except StopIteration
        	break
       
    # except Exception:
    #     print("我是万能的!")
    #     break
    
    总结:
    #     可迭代对象:
    #         优点:使用灵活,可以直接查看值
    #         缺点:占内存,不能迭代取值
    #
    #     迭代器:
    #         优点:节省内存,惰性机制
    #         缺点:使用不灵活,操作比较繁琐,不能直接查看元素
    
    迭代器的特性:
    #     1.一次性的(用完就没有了)
    #     2.不能逆行(不能后退)
    #     3.惰性机制(节省内存)
    
    什么是可迭代对象:
    #     具有很多私有方法,具有__iter__()方法的就是一个可迭代对象
    
    什么是迭代器:
    #     具有__iter__()和__next__()方法的就是迭代器
    
    迭代器什么时候使用:当容器中数据量较多的时候使用迭代器
    

    4.递归

    递归:
    1.自己调用自己(不断调用自己本身)---死递归
    2.有明确的终止条件
    满足以上两个才是有效递归
    
    递:一直执行直到碰到结束条件
    归:从结束条件开始往回退
        
    官方声明:最大层次1000,实际测试:998/997
            
    # def func():
    #     print(123)
    #     func()
    # func()
    
    # def age(n): # 1,2,3
    #     if n == 3:
    #         return "猜对了"
    #     else:
    #         age(n+1)
    # print(age(1))
    
    # def age2(n):
    #     if n == 3:
    #         return "猜对了"
    #
    # def age1(n):
    #     if n == 3:
    #         return "猜对了"
    #     else:
    #         age2(n+1)
    #
    # def age(n):
    #     if n == 3:
    #         return "猜对了"
    #     else:
    #         age1(n+1)
    # age(1)
    
    # 1.宝元  18-2-2-2
    # 2.太白  18-2-2
    # 3.wusir 18-2
    # 4.alex  18
    
    # def age(n):
    #     if n == 4:
    #         return 18
    #     else:
    #         return age(n+1)-2
    # print(age(1))
    
    # def age4(n):
    #     if n == 4:
    #         return 18
    # def age3(n):
    #     if n == 4: # 问的是不是第四个了
    #         return 18
    #     else:
    #         return age4(n+1)-2
    # def age2(n):
    #     if n == 4:  # 问的是不是第四个了
    #         return 18
    #     else:
    #         return age3(n+1)-2
    # def age1(n):
    #     if n == 4: # 问的是不是第四个了
    #         return 18
    #     else:
    #         return age2(n+1)-2
    # print(age1(1))
    
    #(自己学习的方法, -- 学会百度[学会自学] -- 先同学讨论)        
    

    5.今日总结

    # 1.函数名的第一类对象及使用
    #     1.1 函数名可以当做值被赋值
    #     1.2 函数名可以改当做元素存放在容器中
    #     1.3 函数名可以当做另一个函数的参数
    #     1.4 函数名可以当做返回值
    
    # 2.f格式化
    #     支持:F,表达式,函数调用,数字计算,列表取值,字典取值
    
    # 3.迭代器
    #     可迭代对象:
    #         优点:使用灵活,可以直接查看值
    #         缺点:占内存,不能迭代取值
    #
    #     迭代器:
    #         优点:节省内存,惰性机制
    #         缺点:使用不灵活,操作比较繁琐,不能直接查看元素
    
    # 迭代器的特性:
    #     1.一次性的(用完就没有了)
    #     2.不能逆行(不能后退)
    #     3.惰性机制(节省内存)
    
    # 什么是可迭代对象:
    #     具有很多私有方法,具有__iter__()方法的就是一个可迭代对象
    
    # 什么是迭代器:
    #     具有__iter__()和__next__()方法的就是迭代器
    
    # 迭代器什么时候使用:当容器中数据量较多的时候使用迭代器
    
    # 4.递归
        # 1.不断调用自己本身
        # 2.有明确的结束条件
        # 一递  一归
    

    6.今日练习

    # 1.请写出下列代码的执行结果:
    # 例一:
    # def func1():
    #     print('in func1')
    # def func2():
    #     print('in func2')
    # ret = func1
    # ret()
    # ret1 = func2
    # ret1()
    # ret2 = ret
    # ret3 = ret2
    # ret2()
    # ret3()
    # 执行结果:
    # in func1
    # in func2
    # in func1
    # in func1
    #
    # 例二:
    # def func1():
    #     print('in func1')
    # def func2():
    #     print('in func2')
    # def func3(x, y):
    #     x()
    #     print('in func3')
    #     y()
    # print(111)
    # func3(func2, func1)
    # print(222)
    # 执行结果:
    # 111
    # in func2
    # in func3
    # in func1
    # 222
    #
    # 例三(选做题):
    # def func1():
    #     print('in func1')
    # def func2(x):
    #     print('in func2')
    #     return x
    # def func3(y):
    #     print('in func3')
    #     return y
    # ret = func2(func1)
    # ret()
    # ret2 = func3(func2)
    # ret3 = ret2(func1)
    # ret3()
    # 执行结果:
    # in func2
    # in func1
    # in func3
    # in func2
    # in func1
    #
    # 看代码写结果:
    # 例四:
    # def func(arg):
    #     return arg.replace('苍老师', '***')
    # def run():
    #     msg = "Alex的女朋友苍老师和大家都是好朋友"
    #     result = func(msg)
    #     print(result)
    # run()
    # data = run()
    # print(data)
    # 看代码写结果:
    # Alex的女朋友***和大家都是好朋友
    # Alex的女朋友***和大家都是好朋友
    # None
    #
    # 例五:
    # data_list = []
    # def func(arg):
    #     return data_list.insert(0, arg)
    # data = func('绕不死你')
    # print(data)
    # print(data_list)
    # 看代码写结果:
    # None
    # ['绕不死你']
    #
    # 例六:
    # def func():
    #     print('你好呀')
    #     return '好你妹呀'
    # func_list = [func, func, func]
    # for item in func_list:
    #     val = item()
    #     print(val)
    # 看代码写结果:
    # 你好呀
    # '好你妹呀'
    # 你好呀
    # '好你妹呀'
    # 你好呀
    # '好你妹呀'
    #
    # 例七:
    # def func():
    #     print('你好呀')
    #     return '好你妹呀'
    # func_list = [func, func, func]
    # for i in range(len(func_list)):
    #     val = func_list[i]()
    #     print(val)
    # 看代码写结果:
    # 你好呀
    # '好你妹呀'
    # 你好呀
    # '好你妹呀'
    # 你好呀
    # '好你妹呀'
    #
    # 例八:
    # def func():
    #     return '大烧饼'
    # def bar():
    #     return '吃煎饼'
    # def base(a1, a2):
    #     return a1() + a2()
    # result = base(func, bar)
    # print(result)
    # 看代码写结果:
    # 大烧饼吃煎饼
    #
    # 例九:
    # for item in range(10):
    #     print(item)
    # print(item)
    # 看代码写结果:
    # 0
    # 1
    # 2
    # 3
    # 4
    # 5
    # 6
    # 7
    # 8
    # 9
    # 9
    #
    # 例十:
    # def func():
    #     for item in range(10):
    #         pass
    #     print(item)
    # func()
    # 看代码写结果:
    # 9
    #
    # 例十一:
    # item = '老男孩'
    # def func():
    #     item = 'alex'
    #     def inner():
    #         print(item)
    #     for item in range(10):
    #         pass
    #     inner()
    # func()
    # 看代码写结果:
    # 9
    ![](https://img2018.cnblogs.com/blog/1730001/201907/1730001-20190719141311176-1984719003.png)
    #
    # 例十二:
    # l1 = []
    # def func(args):
    #     l1.append(args)
    #     return l1
    # print(func(1))
    # print(func(2))
    # print(func(3))
    # 看代码写结果:
    # [1]
    # [1,2]
    # [1,2,3]
    #
    # 例十三:
    # name = '宝元'
    # def func():
    #     global name
    #     name = '男神'
    # print(name)
    # func()
    # print(name)
    # 看代码写结果:
    # 宝元
    # 男神
    #
    # 例十四:
    # name = '宝元'
    # def func():
    #     print(name)
    # func()
    # 宝元
    #
    # 例十五:
    # name = '宝元'
    # def func():
    #     print(name)
    #     name = 'alex'
    # func()
    # 看代码写结果:
    # 报错
    # 开辟def func():这块空间的时候,会先检查一下def func():里边有没有语法错误,
    # 里边有语法错误就会报错,但是并不会去执行def func():空间里边的内容.
    # 第一次检查的时候,看到里边有一个name = 'alex',但是print(name)并没有找到
    #
    # 例十六:
    # def func():
    #     count = 1
    #     def inner():
    #         nonlocal count
    #         count += 1
    #         print(count)
    #     print(count)
    #     inner()
    #     print(count)
    # func()
    # 看代码写结果:
    # 1
    # 2
    # 2
    #
    # 例十七:
    # def extendList(val, list=[]):
    #     list.append(val)
    #     return list
    # list1 = extendList(10)
    # list2 = extendList(123, [])
    # list3 = extendList('a')
    # print('list1=%s' % list1)
    # print('list2=%s' % list2)
    # print('list3=%s' % list3)
    # 看代码写结果:
    # list1=[10, 'a']
    # list2=[123]
    # list3=[10, 'a']
    #
    # 例十八:
    # def extendList(val, list=[]):
    #     list.append(val)
    #     return list
    # print('list1=%s' % extendList(10))
    # print('list2=%s' % extendList(123, []))
    # print('list3=%s' % extendList('a'))
    # [10]
    # [123]
    # [10,'a']
    #
    # 2.用你的理解解释一下什么是可迭代对象,什么是迭代器。
    # 可迭代对象:有__iter__()方法的就是可迭代对象
    # 迭代器:有__iter__()方法和__next__()方法的就是迭代器
    #
    # 3.使用while循环实现for循环的本质(面试题)
    # for循环的本质:
    # s = "abcdefg"
    # new_s = s.__iter__()
    # while True:
    #     try:
    #         print(new_s.__next__())
    #     except StopIteration:
    #         break
    
  • 相关阅读:
    LR在CTR中的实践经验
    我的新书:《工业机器学习算法详解与实战》
    XSS漏洞解析(一)
    netty 解决TCP粘包与拆包问题(二)
    java实现ftp文件的上传与下载
    webService-cxf
    centos7下安装gitlab
    完全卸载删除gitlab
    tomcat 在widows的下的一些常见配置
    JAVA中使用JSch库实现SSH功能
  • 原文地址:https://www.cnblogs.com/liubing8/p/11211118.html
Copyright © 2020-2023  润新知