一.函数名的运用
函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量.
1.函数名可以赋值给其他变量
例:
def fn(): print("abc")print(fn) #函数的内存地址a = fn #将函数赋值给aa() #调用函数==> <function fn at 0x00000229C37C2AE8> abc
2.函数可以作为函数的参数
例:
def func(fn): fn()def gn(): print("abc")func(gn) ==>abc
3.函数名可以当做容器类的元素
例:
def fn1(): print("呵呵")def fn2(): print("嘿嘿")def fn3(): print("吼吼")lis = [fn1,fn2,fn3]for i in lis: i() ==>呵呵 嘿嘿 吼吼
4.函数名可以作为函数的返回值
例:
def gn(): def inner(): print("aaa") return inner #返回inner函数ret = gn()ret() ==>aaa
二.闭包
1.闭包定义:内层函数对外层(非全局)的变量的引用.
变量写在全局是不安全.
例:
def fn(): name = "alex" def inner(): print(name) return innerret = fn()ret() ==>alex #访问inner函数
2.闭包的特点:
(1)安全(防止其它程序改变这个变量)
(2)常驻内存,提高效率.
3.查看闭包
__closure__()函数可以查看闭包.
如果不是闭包返回None 是闭包会返回cell
例:
def fn(): name = "alex" def inner(): print(name) inner() print(inner.__closure__)fn()==> alex (<cell at 0x00000204D86B9468: str object at 0x00000204D867D0D8>,)
三.迭代器
1.可迭代对象和迭代器
str.list.tuple.set.dict.range.文件句柄都是可迭代的数据类型
可迭代的数据类型中都有__iter__()函数.用dir()函数来查看一个数据类型中是否包含了那些函数.
例:
s = ‘abc‘print("__iter__"in dir(s)) ==>True
所有包含了__iter__函数的数据类型都是可迭代的数据类型
Iterable表示可迭代的
__iter__作用返回一个迭代器
__next__和__iter__两个函数都是迭代器的内部函数
例:
lst = ["abc","def","ghi"]it = lst.__iter__()print(it.__next__()) ==>abcprint(it.__next__()) ==>defprint(it.__next__()) ==>ghiprint(it.__next__()) ==>Error 迭代到最后一个之后,再迭代会报错
例:
lis = ["abc","def","ghi"]it = lis.__iter__()while 1: try: name = it.__next__() print(name) except StopIteration: break==>abc \n def \n ghi
try...except固定搭配
例:
lst = [1,2,3]print("__iter__"in dir(lst)) ==>Trueprint("__next__"in dir(lst)) ==>False
例:
lst = [1,2,3]from collections import Iterablefrom collections import Iteratorprint(isinstance(lst,Iterable)) ==>Trueprint(isinstance(lst,Iterator)) ==>False
isinstance(对象,类型)判断对象是不是...类型
迭代器一定是可迭代的
文件句柄和range都是迭代器
2.迭代器的特点
(1)节省内存
(2)惰性机制
(3)不能反复,只能向下执行
原文地址:https://www.cnblogs.com/gxj742/p/9325558.html
时间: 2024-10-08 17:37:00