day11
第十一章
1、函数的第一类对象及使用
函数名可以当做值,赋值给变量:
def func(): print(1) print(func) #函数的内存的地址 a = (func) print(a) a()
函数名可以当做容器中的元素
def login(): print("这是登录") def register(): print("这是注册") def index(): print("这是主页") msg = """ 1 登录 2 注册 3 主页 """ choose = input(msg) # 1 if choose.isdecimal(): if choose == "1": login() elif choose == "2": register() elif choose == "3": index()
改良:
def login(): print("这是登录") def register(): print("这是注册") def index(): print("这是博客园的主页") dic = {"1":login,"2":register,"3":index} msg = """1 登录2 注册3 主页""" choose = input(msg) # 1 if choose.isdecimal(): if dic.get(choose): dic[choose]() else: print("请正确输入!")
函数名可以当做函数的参数
def func(a): print(111) a() def foo(): print(222) func(foo)
函数名可以当做函数的返回值
def func(): def foo(): print(111) return foo a = func() a() func()()
练习:
def f1(): def a(): def f3(): print(333) return [f3, a, f1] print(11) return f3() ret = a() return c(ret) def aa(b): print(111) return b print(f1(aa))
2、格式化 f-string
任意表达式
f"姓名:{name} 年龄: {}" f"姓名:{"cai"}" f"年龄:{34}"
可以插入表达式
print(f"{3 if 3>2 else 2}")
多行f
speaker = f'Hi {name}.'\ f'You are {age} years old.'\ f'You are a {ajd} guy!'
其他细节
# ! , : { } ;这些标点不能出现在{} 这里面。 # print(f'{;12}') # 报错 # 所以使用lambda 表达式会出现一些问题。 # 解决方式:可将lambda嵌套在圆括号里面解决此问
3、迭代器
可迭代对象:
具有 __ iter __() 方法就是可迭代对象
我们可以通过dir()方法去判断一个对象具有什么方法,dir()会返回一个列表,这个列表中含有该对象的以字符串的形式的所有方法名
lst.__iter__() dict.__iter__()
迭代器:工具
具有_ iter () 和 next _ () l两个方法的才是迭代器
iter() 和 _ iter _ () 是一样的 推荐使用iter()
lst = [1,2,3,4] l = lst.__iter__() # 将可迭代对象转换成迭代 l.__iter__() # 迭代器指定__iter__()还是原来的迭代 print(l.__next__()) print(l.__next__())
迭代器基于上一次停留的位置,进行取值
迭代器的优点:
惰性机制:节省空间
迭代器的缺点:
不能直接查看值,迭代器看查到的是一个迭代器的内存地址
一次性,用完就没有了
不能逆行(后退)
空间换时间:容器存储大量的元素,取值时间短,但是容器占用空间大
时间换空间:迭代器就是节省了空间,但是取值时间较长
for 循环的本质:(重点)
while True: try: print(l.__next__()) exxept StopIteration: break
python2 和 python3 中的区别
pyhton3: iter()和 __iter__() 都有 next()和__next__()都有 python2: iter() next()
python 三大器
迭代器
生成器
装饰器