11.基础函数--3
Posted wangjun187197
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.基础函数--3相关的知识,希望对你有一定的参考价值。
一: 函数名的应用(第一类对象)
函数名的命名规范和变量是一样的
函数名其实就是变量名,与()配合可以执行函数的变量
1,函数名的内存地址:
def func(): print("呵呵") print(func) 结果: <function func at 0x1101e4ea0>
2,函数名可以赋值给其他变量:
def func(): print("呵呵") print(func) a = func # 把函数当成?一个变量量赋值给另?一个变量量 a() # 函数调?用 func()
3,可以作为列表中的元素进行存储:
def func1(): pass def func2(): pass lst = [func1,func2] for el in lst: el
可以作为参数传递给函数;
def func(): pass def proxy(fn): fn() #执行传递过来的fn proxy(func) #把函数func当成参数传递给proxy的参数fn
可以作为函数的返回值;
def func(): def inner(): pass return inner func()()
二:闭包
什么是闭包?闭包就是内层函数,对外层函数(非全局)的引用.
def func1(): name = "alex" def func2(): print (name) #闭包 func2() func1() 结果: alex
闭包的作用:
保护你的变量不受外界影响
可以让变量常驻内存
超简易爬虫代码: from urllib.request import urlopen def but(): content = urlopen("http://www.xiaohua100.cn/index.html").read() def get_content(): return content return get_content fn = but() #这里已经开始加载 #后面需要用到这里的内容的时候不需要在执行耗时的操作了 content = fn() print(content) #获取内容 content2 = fn() print(content2) #从新获取内容
我们可以使用__closure__来检测函数是否是闭包,使用函数名.__closure__返回cell就是闭包,返回None就不是闭包
def func1(): name = "alex" def func2(): print(name) #闭包 func2() print(func2.__closure__) #(<cell at 0x10c2e20a8: str object at 0x10c3fc650>,) func1()
如何在函数外调用内部函数
def outer(): name = "alex" #内部函数 def inner(): print(name) return inner fn = outer() #访问外部函数,获取到内部函数的函数地址 fn() #访问内部函数
多层嵌套
def func1 (): def func2(): def func3(): print("嘿嘿") return func3 return func2 func1()()()
三,迭代器
我们之前一致在使用可迭代对象进行迭代操作,那么什么是可迭代对象?
目前我们熟悉的可迭代对象:str,list,tuple,dic,set
我们可以使用dirlai 验证查看该数据包含了那些方法
用来遍历字典,元组,字符串......可迭代对象
可迭代对象: Iterable ,里面有__iter__()可以获取迭代器,没有__next__()
迭代器: Iterotor ,里面有__iter__()可以获取迭代器,有__next__()
迭代器的特点:
1,只能向前
2,惰性机制
3,省内存(生成器)
for循环的内部机制:
1,首先获取迭代器
2,使用while循环获取数据
3,it.__next__()来获取数据
4,处理异常 try:xxx except StopIteration
it=xx.__iter__() while 1: try: data = it.__next__() xxxxxxxx except StopIteration: break
以上是关于11.基础函数--3的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 中创建构造函数的代码片段或快捷方式