函数名的第一类对象及使用
第一类对象-特殊点
1.可以当作值被赋值给变量
2.当作元素存放在容器中
3.函数名可以当作函数的参数
4.函数名可以当作函数的返回值
def func():
print(1)
a = func
print(a)
print(func)
结果:
def func():
print(1)
lst = [func,func,func]
print(lst)
for i in lst:
i()
结果:
[<function func at 0x000002954B78CB70>, <function func at 0x000002954B78CB70>, <function func at 0x000002954B78CB70>]
1
1
1
def func(f):
print(f)
def foo():
print(233)
func(foo)
结果:
def func():
def foo():
print(233)
return foo
print(func())
结果:
def f1():
def f2():
print(1)
def f3():
print(123)
return f2
ret = f2()
return ret
print(f1())
结果:
1
<function f1.<locals>.f2 at 0x0000018B0361CBF8>
f格式化--python3.6以上版本才可使用
%s 和format都可以 f
s = f"你好{'常鑫'}"#填充字符串
s1 = F"你好{'常鑫'}"
print(s,s1)
s = f"你好{s}"#填充变量
print(s)
s1 = f"{35+12}"#填充计算公式
print(s1)
a = 10
b = 20
s1 = f"{a if a>b else b}"#填充三元运算符
print(s1)
s1 = f"{{{{{'常鑫djb'}}}}}"#两个括号合一个
print(s1)
s1 = f"{print(123)}"#填充函数
print(s1)
def foo():
def func():
a = 1
return a
return func()
s1 = f"{foo()}"
print(s1)
lst = [1,2,3,4,5,6]
s1 = f"{lst[:5]}"
print(s1)
dic = {"key":123,"key2":345}
s1 = f"{dic['key']}"
print(s1)
迭代器
当容器中数据量较大的时候使用迭代器,如文件句柄
迭代器优点:节省内存,惰性机制
迭代器缺点:使用不灵活,操作繁琐,不能直接(查看元素)查看所有的值
迭代器的特性:
- 一次性的
- 不能逆行(不能后退)
- 惰性机制(要一个给一个,不要就不给)----节省内存
器:工具
**可迭代对象---------list, dict, str, set ,tuple **--具有很多私有方法,具有__iter-_()方法就是一个可迭代对象,使用灵活
可迭代对象不一定是迭代器,但是迭代器一定是可迭代对象.
查看 是否是可迭代对象的方法
# list.__iter__()
# dict.__iter__()
# str.__iter__()
# set.__iter__()
# tuple.__iter__()
方法二
看源码
方法三 :dir
print(dir(list))
方法四
官方声明只具有__iter__方法就是可迭代对象
可迭代对象的优点:
1.使用灵活
2.直接查看值
可迭代对象的缺点:
消耗内存
取值方式:
list ,tuple,str --索引
dict--键
set--直接取值
for
迭代器: __iter__()将可迭代对象转化乘迭代器
官方声明只要具有__iter__方法__next__就是迭代器
基于上一个停留的位置进行取值
s = "152132"
new_s = s.__iter__()#将可迭代对象转化乘迭代器
print(new_s)
print(new_s.__next__())
print(new_s.__next__())
print(new_s.__next__())
print(new_s.__next__())
结果
1
5
2
1
for 循环原理
s = "12332"
new_s = s.__iter__()
while True:
try:
print(new_s.__next__())
except StopIteration: #捕获错误
break
s = "12332"
new_s = s.__iter__()
while True:
try:
print(new_s.__next__())
except Exception: #万能异常捕获
break
递归:
自己学习---学会百度
递归条件:1.自己调用自己(官方话,不断调用自己本身)
2.要有明确的终止条件
满足以上两个才是有效递归
递:一直执行到带结束条件
归:从结束条件往回退
官方声明最大层次1000,实际测试998/997 可以修改
def age(n):
if n == 4:
return 18
else :
return age(n+1)-2
print(age(1))