首页 > 其他分享 >函数名的作用:函数也是第一类对象

函数名的作用:函数也是第一类对象

时间:2023-05-23 16:23:42浏览次数:45  
标签:__ 函数 迭代 对象 create 第一类 print def

函数名的作用:函数也是第一类对象

​ 1.函数名就是函数的内存地址

  2.函数名可以作为变量

  3.函数名可以作为函数的参数

  4.函数名还可以当做函数的返回值

  5.函数名可以作为容器类型的元素(列表中的一个元素)

globals()    locals()

​ globals() #作用是 返回全局变量的一个字典

  locals() # 返回当前位置的局部变量的字典

def func1():
    a =1
    b = 2
    print(globals())
    print(locals())    #{'b': 2, 'a': 1}
func1()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000026005C0D240>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'G:/骑士计划/2018-8-17/8-17草稿.py', '__cached__': None, 'lis': [1, 2, 3, 4], 'func1': <function func1 at 0x0000026005BB2EA0>}


#{'b': 2, 'a': 1}

闭包:即在函数内部,内层函数对外层函数的变量(非全局变量)的引用,并返回

判断这个函数是否形成了闭包,用 函数名.closure 来进行判断

def wraaper():
    name = 'alex'
    def inner():
        print(name)
    print(inner.__closure__)    #输出结果不是None,就说明形成了闭包
    inner()
    return inner
wraaper()
输出结果#(<cell at 0x00000254669A85B8: str object at 0x0000025466A39110>,)
alex
a = "alex"
def func1(b):
    # a = "alex"    #即相当于在函数内部定义了一个变量a = "alex”
    def func2():
        print(b)
    print(func2.__closure__)
    func2()
func1(a)  #运行时将外部的变量a加载到函数内
#输出结果为(<cell at 0x0000025E4A4285B8: str object at 0x0000025E4A4B9110>,)
alex#所以这种情况是一个闭包

闭包的作用:当程序运行时,遇到函数执行,他就会在内存中开辟一个空间,(局部名称空间),如果这个函数内部形成了闭包。那么他就不会随着函数的结束而消失。

可迭代对象  迭代器

可迭代对象定义:对象内部含有__iter__方法的就是可迭代对象。(str,list,dict,tuple,tange())

          而当可迭代对象签订了可迭代协议就形成了迭代器

  迭代器定义:内部含有__iter__和__next__的方法就是迭代器。即存在__next__的方法就是迭代器

可迭代对象与迭代器的区别:

1.可迭代对象不能直接取值,而迭代器可以直接取值

  2.迭代器非常节省内存,

  3.迭代器每次只能去一个值

  4,迭代器是单向的,一直到底

判断一个对象是否是可迭代对象的方法:

1.判断__iter__是否在这个对象里

lis = [1,2,3]
print("__iter__" in dir(lis))    #返回结果为True则说明该对象是可迭代对象

dir() 显示出你这个参数的所有方法,装在一个列表里

  2.from collections import Iterable 在 文件(colletions) 导入 这个 可迭代的(Iterable)

   from collections import Iterator 在文件(colletions)导入 这个 迭代器( Iterator)  (自我理解,非专业术语)

from collections import Iterable
from collections import Iterator

print(isinstance('alex',Iterable))  # True 
print(isinstance('alex',Iterator))  # False    是否是迭代器
#isinstance() 判断类型,即“alex”是不是可迭代对象    (自我解释,非专业)

可迭代对象转换成迭代器的方法

1.lis.iter()

  2.iter(lis)

# lis = [1, 2, 3]  # 可迭代对象
# # ite1 = lis.__iter__()  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
# ite1 = iter(lis)  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
# print(ite1)

迭代器取值:next(),或者 对象.next()

lis = [1,2,3]
l1 = lis.__iter__()
print(l1)
print(l1.__next__())    #1
print(next(l1))        #2

例题,用while循环模拟出for循环的过程(了解,)

# iter1 = s1.__iter__()
#
# while 1:
#     try:  
#         print(iter1.__next__())
#     except StopIteration: # StopIteration报错原因
#         break  #遇到抱歉就结束循环先了解。

装饰器语法糖


# def create_people():
# 	print('女娲真厉害,抓把捏一下吹口气,就成了人!!')

def a(func):
	def b():
		print('加点水')
		func()
	return b
# ret=a(create_people) #内层的b函数
# ret()

# create_people=a(create_people) #内层的b函数,引用了func,func-->create_people
# create_people()  #相当于调用了内层函数b
@a
def create_people():
	print('女娲真厉害,抓把捏一下吹口气,就成了人!!')

create_people()

@a #相当于把被装饰的函数当成参数传给a,然后把返回值再赋值给被装饰的函数名
def create_pig():
	print('女娲真厉害,抓把捏猪')

create_pig()

@a
def create_dog():
	print('捏个狗')
create_dog()

标签:__,函数,迭代,对象,create,第一类,print,def
From: https://www.cnblogs.com/mengdie1978/p/17400767.html

相关文章

  • memset() 函数的使用
    //Lvxin1-1 memset.cpp //memset()函数的使用 #include<stdio.h>#include<string.h> intmain(){   charstr[]="almosteveryprogrammershouldknowmemset!";   doubled;   memset(&d,0,sizeof(d));   memset(str,'......
  • 全局对象的创建
    全局对象在什么时候创建也是有讲究的,如果在调用之前尚未创建肯定会报错。那么下面通过调用函数间接调用全局对象的方法就不会有任何问题了。varFUserInfo:TUserInfo=nil;functionUserInfo:TUserInfo;beginifnotAssigned(FUserInfo)thenFUserInfo:=TUserInfo.Create;R......
  • (转载)PYTHON修饰器的函数式编程--纪念下陈皓老师
    PYTHON修饰器的函数式编程2014年的时候陈老师就写了这个python装饰器的文章,比现在的很多的文章都好谨以此文纪念下陈皓老师Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟DesignPattern里的Decorator搞混了,其实这是完全不同的两个东西。虽然好......
  • 实验四 函数与异常处理编程
    实验任务一程序源代码:1print(sum)2sum=423print(sum)45definc(n):6sum=n+17print(sum)8returnsum9sum=inc(7)+inc(7)10print(sum)实验结果:问题:task1.py源码中,共有4处有python语句print(sum)(line1,line3,line7,line11)。这4......
  • 实验4 函数与异常处理编程
    实验任务1task11print(sum)2sum=423print(sum)45definc(n):6sum=n+17print(sum)8returnsum91011sum=inc(7)+inc(7)12print(sum)ViewCode不是同一个对象名称 1.Built-in。2和3Global。4.Local实验任务2task2-......
  • mino对象储存
    mino版本linux安装  1、安装包下载https://dl.min.io/server/minio/release/linux-amd64/minio 建议使用某雷下载,速度会快点,下载包上传到/opt/minioconfig/run目录下。2、创建数据存储目录mkdir-p/data/minio/data 3、服务启动启动并指定数据存放地址......
  • 实验4 函数与异常处理编程
    实验任务1task1.py程序源码:1print(sum)2sum=423print(sum)4definc(n):5sum=n+16print(sum)7returnsum8sum=inc(7)+inc(7)9print(sum)运行测试截图: 1.task1.py源码中,共有4处有python语句print(sum)(line1,line3,line7,line11......
  • 实验4 函数与异常处理编程
    实验任务1task1.py实验源码:1print(sum)2sum=423print(sum)45definc(n):6sum=n+17print(sum)8returnsum910sum=inc(7)+inc(7)11print(sum)实验结果:实验任务2task2_1.py实验源码:1deffunc1(a,b,c,d,e,f):2......
  • 母函数详解(定义,模板代码,用法)
    本篇文章前半部分的母函数定义及讲解,和后面的题目推荐,在数学中,某个序列的母函数(Generatingfunction,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝......
  • 图解LeetCode——793. 阶乘函数后 K 个零(难度:困难)
    一、题目 f(x) 是 x! 末尾是0的数量。回想一下 x!=1*2*3*...*x,且0!=1 。例如, f(3)=0 ,因为3!=6的末尾没有0;而f(11)=2 ,因为11!=39916800末端有2个0。给定 k,找出返回能满足f(x)=k 的非负整数x 的数量。二、示例2.1>示例1:【输入......