函数名的第一类对象(概述):
使用方式:
-
函数名可以当做值赋值给变量
def func(): print(1) print (func) #查看函数的内存地址 a = func print (a) #
-
函数名可以当做容器中的元素
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 fuc(a): a() print(111) def foo(): print(222) def f1() print(333) fun(f1) foo()
-
函数名可以当函数的返回值
def func(): def foo(): print(111) return foo a = func() a() func()() #foo() 输出结果:111 111
进阶题:
def foo(a):
def func(a):
def f1(a):
print(a)
return "aelx"
return f1(a)
return func(a)
print(foo(5))
输出结果: 5 ,alex
def func(a):
a()
def foo(b):
return b()
def f1(c):
def a():
def f3():
print(3333)
return [f3,a,f1]
print(11)
return f3()
return c(a())
def aa(b):
print(111)
return b
print(f1(aa))
输出结果:
11
3333
111
[<function f1.<locals>.a.<locals>.f3 at 0x00000187D0649C80>, <function f1.<locals>.a at 0x00000187D0649BF8>, <function f1 at 0x00000187D0649AE8>]
def f1(c):
def a():
def f3():
print(3333)
return [f3,a,f1]
print(11)
return f3()
ret = a()
return c(ret)
def aa(b):
print(111)
return b
print(f1(aa))
f-strings
f"{变量名}"
F"{变量名}"
f"""{变量名}"""
print(F"姓名:{input('name:')} 年龄:{input('age:')}")
def foo():
print("is foo")
lst = [1,2,3,4]
dic = {"key1":23,"key2":56}
print(f"""{dic['key1']}""")
print(f"{3+5}")
print(f"{3 if 3>2 else 2}")
print(f"""{':'}""")
msg = f"""{{{{'alex'}}}}""" #必须是偶数
print(msg)
name = "alex"
print(f"{name.upper()}")
print(f"{':'}")
迭代器:是基于上一次停留的位置,进行取值
-
可迭代对象:
-
list,tuple,str,set,dict取值方式只能直接看、
-
只要具有__ iter __()方法就是一个可迭代对象
lst = [1,23,4,5] for i in lst: print(i)
lst = [1,2,3,4] lst.__iter__() dict.__iter__()
-
-
迭代器:工具
-
具有__ iter __ () 和 __ next __ () 两个方法才是迭代器
-
lst = [1,2,3,4,5] l = lst.__iter__() # 将可迭代对象转换成迭代器 l.__iter__() # 迭代器指定__iter__()还是原来的迭代器 print(l.__next__()) # 1 print(l.__next__()) # 2
-
-
for循环的本质(重点):
while True: try: #异常处理机制 print(l.__next__()) except StopIteration: #接收到异常提醒就终止 break
lst = [] for i in range(10000): lst.append(i) l = lst.__iter__() for i in range(16): print(l.__next__()) print(''.center(50,"*")) for i in range(16): print(l.__next__()) print(''.center(50,"*")) for i in range(16): print(l.__next__())
-
优点:
- 惰性机制:节省空间
-
缺点:
- 不能直接查看值 -- 迭代器查看到的是一个迭代器的内存地址
- 一次性,用完就没了
- 不能逆行,后退,只能继续执行下一条
-
空间换时间:容器存储大量的数据,取值快,占用空间大
-
时间换空间:迭代器就是一个节省了空间,但是取值慢
-
可迭代对象:具有 iter() 方法的就是一个可迭代对象
-
迭代器:具有 iter()和next()方法就是一个迭代器
-
python2和python3中的区别:
- python 3
- iter ()和 __ iter __() 都有
- next () 和 __ next __ () 都有
- Python 2
- iter ()和 __ iter __()
- next ()
- python 3