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之路(函数进阶)的主要内容,如果未能解决你的问题,请参考以下文章

小白学习之路,基础四(函数的进阶)

python之路——函数(进阶)

python之路(函数进阶)

Python之路 函数进阶

Python全栈之路----函数进阶----闭包

Python之路:面向对象(进阶)