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

时间:2021-10-15 22:43:56

Python基础09/函数名的第一类对象及使用/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