学习11:内容# 1.函数名第一类对象及使用 ***** # 2.f格式化 *** # 3.迭代器 **** # 4.递归 ****
程序员文章站
2022-03-20 17:14:00
[TOC] 1.第一类对象 特殊点 1.可以当做值被赋值给变量 2.当做元素存放在容器中 3.函数名可以当做函数的参数 4.函数名可以当做函数的返回值 2.f.格式化 Python3.6版本以上才能够使用 3.迭代器 迭代 : 器 : 工具 可迭代对象 官方声明只要具有__iter__()方法的就是 ......
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())
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 print(new_s.__next__()) print(new_s.__next__()) print(new_s.__next__()) print(new_s.__next__()) print(new_s.__next__()) print(new_s.__next__())
s = "12345" new_s = s.__iter__() while true: try: print(new_s.__next__()) # for真实本质 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))