zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/liubing8/p/11211118.html
Copyright © 2011-2022 走看看