1. 第一类对象的特点
#1. 函数名可以当作值被赋值给变量
def func():
print(1)
ret = func
print(ret) #输出func函数的地址
#2. 函数名当作元素存放在容器中
def func():
a=1
print(a)
lst = [func,func,func] #放入lst中
for i in lst:
i() # 1 1 1
#3. 函数名可以当作函数的参数
def func(f):
print(1)
f()
def foo():
print(2)
func(foo) #foo地址给f 1 2
#4. 函数名可以当作函数的返回值
def func():
print(2)
def foo():
print(5)
return foo
ret = func() #foo 地址 2 5
ret() #调用 foo函数
2. 格式化
f"你好{'a'}" #填充字符串
F"你好{'a'}" # F
s = f"你好{s1}" #填充变量
s = f"{35+15}" #填充计算公式
s = f"{a if a > b else b}" #填充表达式
s = f"{lst[0:2]}" #填充列表和字典
3. 迭代器
3.1 可迭代对象
list、dic、str、set、tuple都是可迭代对象,使用灵活
#方法:
1. list__iter__()
2. ctrl 查看源码
3. print(dir(list))
官方声明:只要对象具有__iter__()方法的就是迭代对象
可迭代对象的优点:
1.使用灵活
2.直接查看值
可迭代对象的缺点:消耗内存
取值方式:
list,tuple,str -- 索引
dict -- 键
set -- 直接取值
3.2 迭代器
#官方声明只要具有__iter__()方法__next__()方法就是迭代器
lst = [1,2,3,4,6]
new_lst = lst.__iter__() #将可迭代对象转换成迭代器
print(new_lst.__next__()) #从上一个位置开始向下打印一个元素
#迭代器取值超出范围时,会报错
#迭代器特性:
#1.一次性的(用完就没有了)
#2.不能逆行(不能后退)
#3.惰性机制(节省内存)
#迭代器什么时候用:当容器数据量较大时,使用迭代器
s = [1,2,3,4,5,7] # 更改版 for循环
count = len(s)
new_s = s.__iter__()
while count:
print(new_s.__next__())
count -= 1
# while循环实现for循环的本质
s = "12345"
new_s = s.__iter__()
while True:
try: #会处理错误
print(new_s.__next__()) # for真实本质
except StopIteration: #当出StopIteration错误时,关闭
break
#或
except Exception: #万能异常捕获错误
break
4. 递归
1. 不断调用自己本身(自己调用自己)——死循环
最大层次1000,实际测试997/998
2. 有明确的终止条件
满足以上两个才是有效递归。
递:一直执行直到碰到结束条件
归:从结束条件开始往回退
def age(n):
if n == 3:
return 30
else:
return age(n+1)-5
print(age(1)) # 20
#上面解开:
def age3(n):
if n == 3:
return 30
# else:
# return age2(n+1)-5
def age2(n):
if n == 3:
return 30
else:
return age3(n+1)-5
def age1(n):
if n == 3:
return 30
else:
return age2(n+1)-5
print(age1(1))