-
今日内容
- 默认参数的坑
- 函数名的应用
- python新特性:f-string
- 可迭代对象
- 迭代器
- 可迭代对象与迭代器的对比
-
昨日回顾
- 万能参数,动态参数
def func(*args,**kwargs): pass #函数的定义:*将实参角度的所有位置参数聚合成一个元组,赋值给args #**将实参角度的所有的关键字参数聚合成一个字典赋值kwargs func(*[1,2,3],**{'name':'alex','age':18})#函数的执行:* ** 打散
-
第四种传参:
仅限关键字参数:* ,c
-
形参角度的最终顺序:
位置参数,*args,默认参数,仅限关键字参数,**kwargs
-
名称空间:
内置,全局,局部
-
取值,加载顺序
加载:内置,全局,局部
取值:就近原则
-
作用域
全局,局部
-
glocals():返回字典,全局作用域的所有内容
locals():返回字典,当前作用域的所有内容
-
嵌套函数
-
具体内容
- 默认参数的坑
#当默认参数是可变的数据类型,坑坑坑 def func(a,l=[]): l.append(a) return l print(func(1))#[1,] print(func(2))#[1,2] print(func(3))#[1,2,3] def func(val,li=[]): li.append(val) return li list1 = func(1)#[1,] list2 = func(123,[])#[123,] list3 = func(2)#[1,2] print(f'list1={list1}')#[1,2] print(f'list2={list2}')#[123] print('list3=%s'%list3)#[1,2] def func(val,lis=[]): lis.append(val) return lis print(f'lis1={func(1)}')#[1,] print(f'lis2={func(123,[])}')#[123,] print(f'lis3={func(2)}')#[1,2]
-
函数名的应用
- 函数名是一个特殊的函数
def func(): print(666) print(func)#func = <function func at 0x00000000003F1EA0> #函数名指向的是函数的内存地址, fucn()#执行函数
- 函数名是一个变量
def func(): print(666) ret = func ret1 =ret ret1() ret()
- 函数名可以作为容器类类型的元素
def func1(): print('func1') def func2(): print('func2') def func3(): print('func3') li = [func1,func2,fucn3] for i in li: i()
- 函数名可以作为函数的实参
def func1(): print('func1') def func2(argv): print('func2') argv() print(func2(func1))
- 函数名可以作为函数的返回值
def func1(): print('func1') def func2(argv): print('func2') return argv ret = func2(func1) ret()
-
python 新特性 f-string
#f不区分大小写 num = input('>>>') s = F'{num}' print(s) #加入表达式 s = 'alex' s1 = f'我的名字是{s.upper()}' print(s1) #结合函数 li = [1,2,3,4] s1 = f'{li[0],{li[1]}}' print(s1) #不能放一些特殊的函数 ! , : { } ; print(f'{{{66}}}')#{66}
-
可迭代对象
- 字面意思:一个可以重复取值的实实在在的东西。
专业角度:内部函数 'iter' 方法的对象,就是可迭代对象
-
内置函数:dir()
-
判断一个对象是否是可迭代对象:
print('iter'in dir(obj))
-
优点:
- 直观
- 操作方法较多
- 效率相对比较高
-
缺点:
- 占内存
- 不能迭代取值(索引,字典的key)
-
迭代器
-
字面意思:可以重复的工具
专业角度:内部含有 'iter' 和 'next' 方法的对象
-
可迭代对象转化成迭代器
li = [1,2,3,4] obj = iter(li) #迭代器利用next()取值 print(next(obj)) print(next(obj)) #迭代器一条路走到底,不会头 li = [1,2,3,4,5,6] obj = iter(li) for i in range(3): print(next(obj)) for i in range(2): print(next(obj)) #迭代器: #利用while循环,模拟for循环内部循环可迭代对象的机制 #1.先要将可迭代对象转化成迭代器 #2.利用next对迭代器进行取值 #3.利用异常处理try一下防止报错 li = [1,2,3,4,5] obj = iter(li) while 1 : try: print(next(obj)) except StopIteration: break
-
优点
- 非常节省内存
- 惰性机制
-
缺点:
- 效率低
- 不直观
- 操作不灵活
-
-
可迭代对象与迭代器的对比
可迭代对象:可迭代对象是一个操作比较灵活,直观,效率相对高,但是比 较占内存的数据集
迭代器:迭代器是一个非常节省内存,满足惰性机制,但是效率相对低,操 作不灵活的数据集