18.07.17
Posted gxj742
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18.07.17相关的知识,希望对你有一定的参考价值。
一.函数名的运用
函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量.
1.函数名可以赋值给其他变量
例:
def fn():
print("abc")
print(fn) #函数的内存地址
a = fn #将函数赋值给a
a() #调用函数
==> <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 inner
ret = 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__()) ==>abc
print(it.__next__()) ==>def
print(it.__next__()) ==>ghi
print(it.__next__()) ==>Error 迭代到最后一个之后,再迭代会报错
例:
lis = ["abc","def","ghi"]
it = lis.__iter__()
while 1:
try:
name = it.__next__()
print(name)
except StopIteration:
break
==>abc def ghi
try...except固定搭配
例:
lst = [1,2,3]
print("__iter__"in dir(lst)) ==>True
print("__next__"in dir(lst)) ==>False
例:
lst = [1,2,3]
from collections import Iterable
from collections import Iterator
print(isinstance(lst,Iterable)) ==>True
print(isinstance(lst,Iterator)) ==>False
isinstance(对象,类型)判断对象是不是...类型
迭代器一定是可迭代的
文件句柄和range都是迭代器
2.迭代器的特点
(1)节省内存
(2)惰性机制
(3)不能反复,只能向下执行
以上是关于18.07.17的主要内容,如果未能解决你的问题,请参考以下文章