码迷,mamicode.com
首页 > 编程语言 > 详细

python之路(函数进阶)

时间:2020-02-28 20:28:26      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:loader   module   register   名称空间   print   als   not   func   __iter__   

一、函数名的应用

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之路(函数进阶)

标签:loader   module   register   名称空间   print   als   not   func   __iter__   

原文地址:https://www.cnblogs.com/mingxi/p/12377847.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!