python之路(函数进阶)
Posted mingxi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之路(函数进阶)相关的知识,希望对你有一定的参考价值。
一、函数名的应用
def func():
print(666)
1.函数名就是内存地址
print(func)#<function func at 0x0000025DB9BFD268>
2.函数名可以作为变量
def func1():
print(666)
f1 = func1
f2 = f1
f2()#666
3.函数名可以作为函数的参数
def func():
print(666)
def func1():
func()
def func2(x):
x() # func1()
func2(func1)#666
4.函数名可以当做函数的返回值
def wraaper():
def inner():
print(‘inner ‘)
return inner
ret = wraaper() # inner
ret() # inner()
5.函数名可以作为容器类类型的元素
def func1():
print(‘in func1‘)def func2():
print(‘in func2‘)
def func3():
print(‘in func3‘)
def func4():
print(‘in func4‘)
l1 = [func1,func2,func3,func4]
for i in l1:
i()
二、globals locals
globals() # 返回全局变量的一个字典。
locals() #返回 当前位置 的局部变量的字典。
def func1():
a = 2
b = 3
print(globals())#{‘__name__‘: ‘__main__‘, ‘__doc__‘: None, ‘__package__‘: None, ‘__loader__‘: <_frozen_importlib_external.SourceFileLoader object at 0x0000014F8E171CF8>, ‘__spec__‘: None, ‘__annotations__‘: {}, ‘__builtins__‘: <module ‘builtins‘ (built-in)>, ‘__file__‘: ‘D:/Python/Project/XXX/day11/03 函数名的应用.py‘, ‘__cached__‘: None, ‘func1‘: <function func1 at 0x0000014F8E2AD268>}
print(locals())#{‘a‘: 2, ‘b‘: 3}
def inner():
c = 5
d = 6
print(globals())#{‘__name__‘: ‘__main__‘, ‘__doc__‘: None, ‘__package__‘: None, ‘__loader__‘: <_frozen_importlib_external.SourceFileLoader object at 0x0000014F8E171CF8>, ‘__spec__‘: None, ‘__annotations__‘: {}, ‘__builtins__‘: <module ‘builtins‘ (built-in)>, ‘__file__‘: ‘D:/Python/Project/XXX/day11/03 函数名的应用.py‘, ‘__cached__‘: None, ‘func1‘: <function func1 at 0x0000014F8E2AD268>}
print(locals())#{‘c‘: 5, ‘d‘: 6}
inner()
func1()
三、闭包
内层函数对外层函数的变量(非全局变量)的引用,并返回 这样就形成了闭包。
def wraaper():
name = ‘abby‘
def inner():
print(name)#abby
print(inner.__closure__)#(<cell at 0x000001A7059C07C8: str object at 0x000001A7058D6688>,)
inner()
return inner
wraaper()
name = ‘abby‘
def wraaper():
def inner():
print(name)#abby
print(inner.__closure__) # None
inner()
return inner
wraaper()
name = ‘abby‘
def wraaper(n):
n = ‘abby‘
def inner():
print(n)#abby
print(inner.__closure__) # (<cell at 0x00000254F98607C8: str object at 0x00000254F9776730>,)
inner()
return inner
wraaper(name)
闭包作用:
当程序执行时,遇到了函数执行,他会在内存中开辟一个空间,局部名称空间,
如果这个函数内部形成了闭包,
那么他就不会随着函数的结束而消失。
四、迭代器
可迭代对象
for i in ‘abc‘:
print(i)
不可迭代对象
for i in 123:
print(i) # ‘int‘ object is not iterable
# 对象内部含有__iter__方法就是可迭代对象.
# 可迭代对象满足可迭代协议。
# 可迭代对象:str list dict,tuple,set,range()
# 判断一个对象是否是可迭代对象:
# 第一个方法
# dic = {‘name‘:‘alex‘}
# print(‘__iter__‘ in dir(s1))
# print(‘__iter__‘ in dir(dic))
#第二种方法
# from collections import Iterable
# from collections import Iterator
# print(isinstance(‘alex‘,Iterable)) # True
# print(isinstance(‘alex‘,Iterator)) # True
# print(isinstance(‘alex‘,str))#True
# 迭代器:对象内部含有__iter__方法且含有__next__方法就是迭代器.
f = open(‘register‘, encoding=‘utf-8‘)
print(‘__iter__‘ in dir(f))#True
print(‘__next__‘ in dir(f))#True
print(‘__iter__‘ in dir(dict))#True
print(‘__next__‘ in dir(dict))#False
# 可迭代对象vs迭代器
# 可迭代对象不能取值,迭代器是可以取值的。
# 可迭代对象 --->(转化成)迭代器
lis = [1, 2, 3] # 可迭代对象
# ite1 = lis.__iter__() # 迭代器 <list_iterator object at 0x00000239410E6748>
ite1 = iter(lis) # 迭代器 <list_iterator object at 0x00000239410E6748>
print(ite1)
# 迭代器如何取值? next一次,取一个值
# print(ite1.__next__())
# print(ite1.__next__())
# print(ite1.__next__())
# print(ite1.__next__())
# 1. 可迭代对象不能取值,迭代器是可以取值的。
# 2. 迭代器非常节省内存。
# 3. 迭代器每次只会取一个值。
# 4. 迭代器单向的,一条路走到头。
# s1 = ‘kfdsjl‘
# iter1 = s1.__iter__()
#
# while 1:
# try:
# print(iter1.__next__())
# except StopIteration:
# break
ret =( i for i in range(1000000))
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
以上是关于python之路(函数进阶)的主要内容,如果未能解决你的问题,请参考以下文章